我这当前使用的统信1050e 已经抛弃了tcp_tw_recycle 参数,当前在大量并发短连接环境下,操作系统层面应该怎么优化,会有什么副作用,望有经验的大佬解惑,谢谢!
针对在操作系统层面调优TCP短时高并发短连接的情况,以下是一些可能的调优方法:
传统Linux 在开启 tcp_timestamps和tcp_tw_recycle 是会存在问题 ,因为tcp_timestamps缺省就是开启的,所以当tcp_tw_recycle被开启后,实际上这种行为就被激活了,触发PAWS机制,在NAT环境下就会有概率丢包。对于高并发短连接环境,由于会产生大量time_wait状态连接,可能会引发端口耗尽,可以考虑连接 快速回收 或者 链接复用 进行优化。调整 tcp_max_tw_buckets , 在TIME_WAIT 数量等于 tcp_max_tw_buckets 时,不会有新的 TIME_WAIT 产生 。 在time_wait数量等于此参数时,就会快速回收,对端会收到一个reset包,由于time_wait就是连接关闭阶段,连接注定要关闭,所以也不会有什么问题。 tcp_tw_reuse , 在 收到最后一个包后超过1s,可以达到快速复用TIME_WAIT状态的socket链接 。
收起1、调整网卡的ringBuffer大小。接收数据包后,首先会通过DMA引擎将数据送到RingBuffer中。使用ethtool -g <网卡名>可查看RingBuffer的大小。RingBuffer是收发中转站,如果瞬间接收的请求数超过了软中断(ksoftirqd)处理能力,那在RingBuffer填满后,再来的包会被网卡直接丢弃。丢包的统计查询:ethtool -S <网卡名>
2、多队列网卡RSS调优。网卡的每个队列对应一个中断进程,即一个CPU来处理中断,如果队列数越多,也就会有更多的CPU参与到数据包的接收上来。详细信息可查看/proc/interrupts。中断号和CPU的对应关系通过smp_affinity网卡亲和性来控制的,一般通过irqbalance服务来自动管理,即中断进程尽量都使用不同的CPU来poll包。所以通过查看当前配置和支持的最大队列数(ethtool -l <网卡>),来调大网卡队列数(ethtool -L <网卡>),将提高数据接收的性能。
*注意:
这里针对信创环境下的调优需要特别说明!部分国产品牌的CPU,在跨路访问方面,会有高延迟问题,之前在别的回答中也提到,使用NUMA绑定来减少跨路访问。
但在一些批处理高IO的场景下,并不能完全解决问题,网卡队列池满、主机卡顿也会偶尔出现,针对此,关闭irqbalance服务,调整中断进程的亲和性(/proc/irq/<中断号>/smp_affinity),将网卡中断号都固定到一个物理CPU的不同core上,将能避免跨物理CPU的网卡中断。 如主机有2颗CPU,CPU 0对应的core id为0-31,如果主机有64个中断进程,可以对0-31顺序挑选,并写入到/proc/irq/<中断号>/smp_affinity文件中,减少网卡中断的跨路。*
4、合并参数的优化。检查网卡的硬中断合并是否打开(ethtool -c <网卡>),看Adaptive是否为on;接收处理合并是否打开(ethtool -k), 确认receive-offload是否为on;
5、优化软中断一次处理的包数量。内核参数net.cor.netdev_budget来控制,增加这个值,让CPU每次多处理一些网络包接收工作,再让出CPU,以提高效率。
6、使用mmap或sendfile等系统调用来减少用户态和内核态之间的内存拷贝。
7、TCP三次握手优化,在内核参数上,加速端口回收,开启端口重用等,但需要注意在NAT下参数配置防止冲突,可能会因为包的时间戳问题,导致后发送的包先到,进而造成先发的包因为晚到而被丢弃。
8、大招,ebpf可以绕开协议栈的本地网络IO,其实数据包送到网卡,直到送给应用程序这中间的环节好开销还是很多的。那么如果能利用ebpf的sockmap等,将大大提高效率。
9、观测系统资源瓶颈,简单说就是见招拆招,看出现什么问题做对应的性能优化,如半连接队列长度为256,但当前TCP连接中SYN_RECV状态的连接数已经到了256,则说明半连接队列已经溢出了,需要扩大半连接队列长度,那么需要一并考虑backlog、somaxconn和tcp_max_syn_backlog参数。
针对当前使用的统信1050e已经抛弃了tcp_tw_recycle参数,在大量并发短连接环境下,操作系统层面可以考虑以下优化方案:
需要注意的是,以上优化方案可能会带来一些副作用,如:
因此,在进行优化时需要根据实际情况进行评估和测试,确保优化方案的可行性和稳定性。