HCE 2.0上tcp_rmem行为和其他低版本内核差异说明
问题现象
从低版本内核(内核版本号为5.10之前的内核,比如4.18)升级至高版本的HCE内核,内核对tcp_rmem的处理方式存在变动,由原先的TCP缓冲区上限自适应调整为由用户态socket程序自设置。如果用户态socket参数设置的不合理,在低版本内核上,因为系统自适应,可以正常运行,但是在高版本内核上,系统取消了自适应,完全按照用户态socket参数设置,无法正常运行。
原因分析
linux社区在低版本内核,如4.18内核上,TCP连接会通过tcp_fixup_rcvbuf在新建链接时重新调整大小,覆盖系统默认的tcp_rmem的参数上限。而linux社区在5.10内核调整和简化了缓冲区的大小计算机制,移除了tcp_fixup_rcvbuf流程,使得整个机制更加简单跟直观,TCP连接仅根据系统默认的tcp_rmem的参数上限或用户态socket参数设置进行重新调整。
解决方法
需要正确设置用户态socket参数,保障tcp_rmem的值符合预期。