Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以使用JVM实现高负载TCP/IP单机服务器吗?GC设置呢?_Java_Sockets_Garbage Collection_Jvm - Fatal编程技术网

Java 我可以使用JVM实现高负载TCP/IP单机服务器吗?GC设置呢?

Java 我可以使用JVM实现高负载TCP/IP单机服务器吗?GC设置呢?,java,sockets,garbage-collection,jvm,Java,Sockets,Garbage Collection,Jvm,我正在尝试实现高负载的TCP/IP单机服务器 我有几个限制: 服务器必须支持最多8个连接 每个连接必须每秒最多接收25兆字节。我认为所有连接的平均汇总速度(90%的时间)大约为每秒100兆字节,但在最坏的情况下,系统也必须稳定工作 我需要从网络输入中提取消息并将其拆分为消息(我的类)。消息从数百字节到10-15兆字节不等。消息非常简单:几个字段和字节数组(如果是大消息) 我需要从每个连接注册(写入一个非常大的普通文件)数据。可以保证磁盘系统能够以这样的速度写入。我将使用几个企业级SSD 有一个进

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

我有几个限制:

  • 服务器必须支持最多8个连接
  • 每个连接必须每秒最多接收25兆字节。我认为所有连接的平均汇总速度(90%的时间)大约为每秒100兆字节,但在最坏的情况下,系统也必须稳定工作
  • 我需要从网络输入中提取消息并将其拆分为消息(我的类)。消息从数百字节到10-15兆字节不等。消息非常简单:几个字段和字节数组(如果是大消息)
  • 我需要从每个连接注册(写入一个非常大的普通文件)数据。可以保证磁盘系统能够以这样的速度写入。我将使用几个企业级SSD
  • 有一个进程在写入磁盘后处理数据。一段时间后,数据将被删除。也就是说,我需要大约50%的处理器资源
  • 服务器必须24*7*365工作
  • 服务器必须在商品级硬件(8Gb RAM、i7(最好是i5)处理器)上工作。我的项目在硬件尺寸(非常小的盒子,低热和低功耗)和价格方面有限制。不幸的是,如果你提议,我不能改变它
  • 这里有人用JVM在商品软件上实现高负载系统吗?正如我所知,操作系统必须缓冲网络输入,所以GC延迟在这种情况下并不重要,不是吗?关于JVM(GC),我可以读些什么

    也许这不是高负荷系统。欢迎您讨论

    语言/运行时是您最不担心的: 您不会通过单个网络接口每秒获得
    200MB
    ,甚至不会通过
    1Gb
    网络接口。您将需要至少2个连接在两端的1Gb网络接口,以便能够通过商品硬件推动接近该速度的任何东西<在
    1Gb
    接口上,每秒大于100MB的代码甚至不可行。这大约是每秒0.8Gb。在现实世界中,在启用了巨型帧的单个连接上,我看到的持续速率约为
    0.6Gb
    。然后你就没有了爆发的开销

    这是硬件层面的I/O限制,软件是您最不担心的。这些接口需要在两端以及中间的所有交换机、路由器和其他硬件上支持巨型帧

    软件: 您的建议可以用任何合理的高级语言编写。Java、Python、Ruby、Erlang或.Net都可以。你的硬件限制是你无法克服的

    硬件: 我想说的是,你将很难在一台商品硬件机器上获得这样的吞吐量。无论SSD的类别如何,专用RAID控制器很可能是获得所需I/O的唯一方法

    服务器必须支持最多8个连接

    我无法想象这会是个什么问题。您可以使用Java处理数千(如果不是上万)个连接

    每个连接必须每秒最多接收25兆字节。我认为所有连接的平均汇总速度(90%的时间)大约为每秒100兆字节,但在最坏的情况下,系统也必须稳定工作

    这意味着您需要至少1 Gb/s的连接。Java可以用一个线程处理这个速率

    注意:100 MB/s约为8 TB/天。如果您计划使用SSD,则必须找到最小化磁盘使用的方法

    服务器必须在商品级硬件(8Gb RAM、i7(最好是i5)处理器)上工作。我的项目在硬件尺寸(非常小的盒子,低热和低功耗)和价格方面有限制。不幸的是,如果你提议,我不能改变它

    我不知道为什么你会买多个企业级SSD,而且买8GB(我想你是指GB而不是GB=GB)我8岁的儿子在18个月前的游戏PC上有8GB。也不知道为什么你会选择i5作为性能系统。如果不是Xeon,我会得到i7。不是因为它不能用i5实现,而是因为开发时间的花费远远超过硬件的节省

    剩下的似乎完全可以实现

    这里有人用JVM在商品软件上实现高负载系统吗

    很多人都有,这取决于你想做什么

    正如我所知,操作系统必须缓冲网络输入,所以GC延迟在这种情况下并不重要,不是吗

    网络缓冲区对地面军事系统没有任何影响。如果您的行为非常暴躁,它们可以提供帮助,但如果您只需要1 Gb/s,我就不会太担心了

    要做的最重要的事情是通过减少使用来管理分配率。内存分析器可以帮助您做到这一点

    关于JVM(GC),我可以读些什么


    我花你的时间来减少对GC的需求,尤其是因为你的内存太少。如今,大多数服务器的容量远远超过32 GB,例如256 GB到4 TB。听起来,您的主要问题是少量内存的数据传输率相对较高。如果您对每条消息所做的工作很简单,那么这很好,但是如果没有更多信息,我会从至少64 GB开始。

    我看不出在Java中不可能做到这一点的任何原因。但是,如果你熟悉C或C++,你的编译器完全适合你的服务器,那么C或C++是更好的选择。但是Java及其JustInTime(JIT)编译也可以在运行时针对处理器和指令集进行优化,而在C/C++中,只有在服务器的CPU上有一个编译器时,才可能实现这一点。Jarrod,几张网卡怎么样,有可能达到每秒200兆字节的速度吗?据我所知,我需要不同的路由器。我有8台设备(每台仍能每秒发射25兆字节)。如何将它们连接到我的计算机?