万兆网但是系统网络传输慢
背景:
三台主机,相同配置、相同系统、相同驱动 (主机A、B、C),万兆网
情况:
主机A和主机B,业务使用发现tcp传输慢,进行测试发现只有5MB/s,dmesg日志报错TCP :out of memory – consider tuning tcp_mem,而主机C则能达到200MB/s,无报错。
操作:
尝试修改内核参数:
vi /etc/sysctl.conf
原值:
net.ipv4.tcp_mem = 18201 24268 36402
改为:
net.ipv4.tcp_mem = 524288 699050 1398100
# 生效
sysctl -p
tcp_mem 值是以页面大小(通常为 4KB)为单位的三个整数值,分别表示:
1. min:最小值,表示在内存压力最小的情况下,TCP 栈可以使用的最小内存量。
2. pressure:压力值,表示在内存压力增加时,TCP 栈可以使用的内存量。
3. max:最大值,表示在内存压力最大的情况下,TCP 栈可以使用的最大内存量。
这三个值的单位是页面大小,因此需要将其转换为字节数才能换算成 MB。页面大小通常为 4KB,因此可以将每个值乘以 4KB,然后将结果除以 1024*1024,即可得到对应的 MB 值。
例如,如果 TCP Mem 值为 “4096 16384 33554432”,则可以按照以下步骤进行换算:
1. 将每个参数乘以页面大小(4KB),得到 “16384 65536 134217728”,单位是 KB。
2. 将得到的内存大小除以 1024,得到 “16 64 131072”,单位是 MB。
修改完之后进行测试发现速度可达200MB/s
完。。。
第二天,发现速度又降回到了5MB/s ,而且A和C机器正常,B机器异常;
查看socket
cat /proc/net/sockstat
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
发现tcp的mem 已经接近昨日设置的net.ipv4.tcp_mem的max值;并且有大量的CLOSE_WAIT没有释放
查看进程,发现大量的43640端口被CLOSE_WAIT无法释放,查看进程情况,是java进程。
将进程停掉。查看情况,发现mem已经降下来,传输测试速度可达200MB/s。
剩下的就去查java程序了。。。。