我正在尝试实现高负载的 TCP/IP 单机服务器。
我有几个限制:
- 服务器必须支持最多 8 个连接。
- 每个连接每秒最多只能接收 25 兆字节。我认为所有连接的平均汇总速度(90% 的时间)约为每秒 100 MB,但系统在最坏的情况下也必须稳定工作。
- 我需要从网络输入中提取消息并将其拆分为消息(我的类)。消息大小从数百字节到 10-15 兆字节不等。消息非常简单:几个字段以及字节数组(如果是大消息)。
- 我需要注册(写入一个非常大的普通文件)来自每个连接的数据。保证了磁盘系统能够以这样的速度写入。我将使用多个企业级 SSD。
- 有一个进程在写入磁盘后处理数据。一段时间后数据将被删除。 IE。我需要大约 50% 的处理器资源。
- 服务器必须 24*7*365 全天候运行。
- 服务器必须在商品级硬件上运行(8Gb RAM、i7(最好是 i5)处理器)。我的项目有硬件尺寸(非常小的盒子,低热量和低功耗)和价格的限制。不幸的是,如果你提出的话,我无法更改。
这里有人用 JVM 在商品软件上实现了高负载系统吗?据我所知,操作系统必须缓冲网络输入,所以GC延迟在这种情况下并不重要,不是吗?关于 JVM (GC),我可以读到哪些内容?
也许这不是高负载系统。欢迎大家讨论
最佳答案
语言/运行时是您最不用担心的:
您不可能通过单个网络接口(interface)获得每秒 200MB
的数据,甚至连 1Gb
的网络接口(interface)也不可能。您需要在两端绑定(bind)至少 2 个 1Gb
网络接口(interface),才能通过商用硬件插入任何接近该速度的速度。每秒 100MB
在 1Gb
接口(interface)上甚至都不可行。这大约是每秒 0.8Gb
。我什至在启用了巨型帧的单个连接上看到,实际持续速率约为 0.6Gb
。然后你就没有突发的开销。
这是硬件级别的 I/O 限制,软件是您最不用担心的。这些接口(interface)需要在两端以及中间的所有交换机、路由器和其他硬件上支持巨型帧
。
Ethernet Maximum Rates, Generation, Capturing & Monitoring
软件:
您的建议可以用任何性能合理的高级语言编写。 Java、Python、Ruby、Erlang 或 .Net 都可以。您无法克服硬件限制。
硬件:
我想说,您将很难在单个商用硬件机器上获得这种吞吐量。无论 SSD 类别如何,专用 RAID Controller 很可能是您获得所需 I/O 的唯一方法。
关于java - 能否使用JVM实现高负载的TCP/IP单机服务器? GC 设置怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25369708/