Tag: 高负载

Java高负载NIO TCP服务器

作为我研究的一部分,我正在用Java编写一个高负载的TCP / IP echo服务器。 我想为大约3-4k的客户端提供服务,并且每秒可以看到我可以挤出的最大可能消息。 消息大小非常小 – 最多100个字节。 这项工作没有任何实际意义 – 只是一项研究。 根据我见过的众多演讲(HornetQ基准测试,LMAX Disruptor会谈等),真实世界的高负载系统往往每秒服务数百万次交易(我相信Disruptor提到大约6密尔和大黄蜂 – 8.5)。 例如, 这篇文章指出可以达到高达40M MPS。 所以我把它作为现代硬件应该具备的粗略估计。 我编写了最简单的单线程NIO服务器并启动了负载测试。 我很惊讶我在本地主机上只能获得大约10万MPS,在实际网络上只能获得25k MPS。 数字看起来很小。 我正在测试Win7 x64,核心i7。 查看CPU负载 – 只有一个核心正忙(在单线程应用程序上预期),而其余核心处于空闲状态。 然而,即使我加载了所有8个核心(包括虚拟),我的MPS也不会超过800k – 甚至不到接近4千万:) 我的问题是:向客户提供大量消息的典型模式是什么? 我应该在单个JVM内的几个不同套接字上分配网络负载,并使用某种负载均衡器(如HAProxy)将负载分配到多个内核吗? 或者我应该考虑在我的NIO代码中使用多个选择器? 或者甚至可能在多个JVM之间分配负载并使用Chronicle在它们之间建立进程间通信? 在像CentOS这样适当的服务器端操作系统上进行测试会产生很大的不同(可能是Windows会降低速度)吗? 下面是我的服务器的示例代码。 对于任何传入的数据,它总是以“ok”回答。 我知道在现实世界中,我需要跟踪消息的大小,并准备好一条消息可能在多次读取之间分配,但是我现在想让事情变得非常简单。 public class EchoServer { private static final int BUFFER_SIZE = 1024; private final static int DEFAULT_PORT […]