我们在我们的游戏公司中使用Netty3.2.1进行客户端和服务器之间的连接管理。我们的目标是提高在blip场景中处理Netty连接
- 能够处理昙花一现场景,如网络中断,并必须能够从这一尽快恢复。
- 增加单个服务器可以处理的连接数量,而不必删除现有的连接套接字。
昙花一现方案 在实时环境中,人们是由于ISP故障光点的机会,所以所有现有客户(我们的客户火重新连接后,现有的连接断开)连接将打破,并在同一重新连接时间 。例如,如果服务器连接到25000个客户端,则所有25000个客户端都会在blip期间同时尝试连接到服务器,这会给服务器带来巨大的压力。由于Netty旧版本不提供启用/禁用功能,所以我们开始将连接限制在超过100个并发连接ssl握手的限制之外。当限制超出限制时,我们暂停老板线程。我们尚未准备好使用提供该功能的Netty 4.0 Beta版本。
我们在压力测试期间观察到的其他情况是,如果服务器上有大量传入连接,则需要很多时间才能接受所有传入连接并稳定(25 K连接约30分钟,全部25 K尝试同时连接)。但是,如果我们缓慢加载负载,netty能够在很短的时间内(大约3到5分钟)轻松接受所有连接。我们希望建立这样一个系统,以便我们能够灵活地处理blip场景。
- 我在现有的Netty Jar中添加了一些日志,当客户端在巨大负载下断开连接时,它似乎在read()方法中失败。
- 使用Netty3.6最终的jar,没有多大帮助
- 将使用执行处理程序的帮助吗?
- 禁用限制导致服务器上出现OOM异常。
请提出任何可能的方法来解决此问题。 有没有其他的方法来节制连接?
设置细节和配置
客户 - JMeter的框架 - 2个GB机 负载 - 50000个客户 没有每秒消息 - 12000个消息/秒。消息以客户端hello和sever hello作为字符串。 的ulimit在所有机器上是1,00,000
服务器 - 12核心,HT和48 GB RAM 工作线程 - 50(两次没有与核HT它没有核成为24) 所有TCP内部linux机器的缓冲区被配置为使用峰值限制。
我们的管道处理程序有以下处理
- 管道。addLast(sslHadler) - 构建的处理程序中的Netty
- pipeline.addLast(messageEncoder) - 只对字节进行编码和解码,并根据需要将它们转换为消息帧。
- pipeline.addLast(messageDecoder)
- pipeline.addLast(Businesshandler)
嗨诺曼非常感谢答复。最后一件事,在这个blip场景中,我们看到现有的套接字也正在关闭。发生这种情况的地方是在Nioworker.java read()方法{if(ret <0 || failure){0,关闭(channel,succeededFuture(channel)); return false;}}请让我知道为什么会出现这种情况。这里,ret值为0,决定“ret”值的代码类似于{while((ret = ch.read(bb))> 0)readBytes + = ret; if(!bb.hasRemaining()){ break;}}}为什么会发生这种情况?3.2.1 vers中的任何错误? – codeninja