合适的场景可以关闭socket NODELAY

梦想游戏人
目录:
未分类

今天和同事说到这个东西了,突然想到了另外一种用法。

NODELAY 的作用在这里不在阐述,这里介绍一种适当的场景下应该打开的情况。

假如一个包大小是100字节,socket缓冲区大小是1MB ,NODELAY延时设置是40MS。

进程并发模型是15个网络io线程,1个游戏逻辑主线程(30W QPS)。他们性能比为15:1(实测)。

io线程收到一个包后,投递给主线程处理。

应用场景:网关服务器进程 把消息转发到 后端服务器进程。主线程处理速度为30W QPS 所有线程CPU吃满。

1:在这个场景中 主线程一个nodelay周期的时间(40MS) 可以处理 1.2W个包,那么如果关闭了nodelay 那么将会是下面的一个情况。

2:缓冲区大小为1MB 可以容纳 1W个包 ,如果假设不考虑网卡效率什么的,那么意味着一次发送行为可以 携带1W个包的数据,那么切换只会有一次 而不是1W次,30W的QPS只会切换30次上下文 发送30次, 那么性能和io配比将会是 1:1  直接减少了14个io线程。io次数只有30次。

3:就算加上一个 MTU大小 那么 一次发送行为也能携带15个包 那么性能和io配比将会是 1:1  直接减少了14个io线程。io次数将会有2W次,刚好吧一个io线程吃满。

总结:

这种可以应用在服务器内部转发,延时不敏感 的场景下,大多数是非即使战斗业务。 来提高信道传输能力。

这种思想有很多延申的应用场景,比如redis的pipeline ,比如应用层再次打包处理 ,来提高信道传输能力,而不单单利用NODELAY。

Scroll Up