java - 能否使用JVM实现高负载的TCP/IP单机服务器? GC 设置怎么样?

标签 java sockets garbage-collection jvm

我正在尝试实现高负载的 TCP/IP 单机服务器。

我有几个限制:

  1. 服务器必须支持最多 8 个连接。
  2. 每个连接每秒最多只能接收 25 兆字节。我认为所有连接的平均汇总速度(90% 的时间)约为每秒 100 MB,但系统在最坏的情况下也必须稳定工作。
  3. 我需要从网络输入中提取消息并将其拆分为消息(我的类)。消息大小从数百字节到 10-15 兆字节不等。消息非常简单:几个字段以及字节数组(如果是大消息)。
  4. 我需要注册(写入一个非常大的普通文件)来自每个连接的数据。保证了磁盘系统能够以这样的速度写入。我将使用多个企业级 SSD。
  5. 有一个进程在写入磁盘后处理数据。一段时间后数据将被删除。 IE。我需要大约 50% 的处理器资源。
  6. 服务器必须 24*7*365 全天候运行。
  7. 服务器必须在商品级硬件上运行(8Gb RAM、i7(最好是 i5)处理器)。我的项目有硬件尺寸(非常小的盒子,低热量和低功耗)和价格的限制。不幸的是,如果你提出的话,我无法更改。

这里有人用 JVM 在商品软件上实现了高负载系统吗?据我所知,操作系统必须缓冲网络输入,所以GC延迟在这种情况下并不重要,不是吗?关于 JVM (GC),我可以读到哪些内容?

也许这不是高负载系统。欢迎大家讨论

最佳答案

语言/运行时是您最不用担心的:

您不可能通过单个网络接口(interface)获得每秒 200MB 的数据,甚至连 1Gb 的网络接口(interface)也不可能。您需要在两端绑定(bind)至少 2 个 1Gb 网络接口(interface),才能通过商用硬件插入任何接近该速度的速度。每秒 100MB1Gb 接口(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/

相关文章:

java - 如何从自定义弹出菜单扩展的选择事件中获取所选对象值?

java - 套接字 - Java 客户端和 NodeJS 服务器

java - 如何使 RMI 服务器同时为本地客户端(同一网络内)和外部客户端工作

java - 尽管使用了WeakHashMap,但仍发生OutOfMemoryException

java - 关于 concurrentHashMap 上的程序

java - Android - 打印 CharSequence[]

java - 如何检查字符串相似度

ios - SocketIOClient-Swift : Unable to authenticate socket server

c# - 未为 XAML 页面调用析构函数

c# - 使用 using 处理嵌套对象