小樱 发表于 2022/6/6 05:13

Linux服务器并发连接数高时dmesg 内核报错TCP: too many orphaned sockets socket端口号过多导致系统内存资源用尽 引起高丢包ping超时 tcp_mem计算方式

Linux服务器并发连接数高时dmesg 内核报错TCP: too many orphaned sockets socket端口号过多导致系统内存资源用尽 引起高丢包ping超时 tcp_mem计算方式

通过dmesg 指令观察到持续性发生内核报错日志
tail -f /var/log/messages

检查当前socket端口号数量使用情况
# cat /proc/net/sockstat
sockets: used 16663
TCP: inuse 20693 orphan 4116 tw 4096 alloc 20699 mem 5118
UDP: inuse 4 mem 2
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
# cat /proc/sys/net/ipv4/tcp_mem
22131        29510        44262
# cat /proc/sys/net/ipv4/tcp_rmem
4096        87380        6291456
# cat /proc/sys/net/ipv4/tcp_wmem
4096        16384        4194304
# cat /proc/sys/net/ipv4/tcp_max_orphans
4096
#

4G内存服务器解决办法,关键就是tcp_max_orphans触发了限制,其他内核参数其实可以不用动
echo "net.ipv4.tcp_mem = 1572864 2097152 3145728" >> /etc/sysctl.conf
echo "net.ipv4.tcp_rmem = 4096 131072 16777216" >> /etc/sysctl.conf
echo "net.ipv4.tcp_wmem = 4096 131072 16777216" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_orphans = 400000" >> /etc/sysctl.conf
然后执行 /sbin/sysctl -p 让参数生效

注意,设置net.ipv4.tcp_max_orphans 值后会导致系统使用内存大量的上涨,,,小内存别给这么大值,会疯狂Out of memory: Kill process 杀进程,例如1G给100000就好,刚好能把系统内存用满正好超出一丢丢用上swap。。。最大建议给1048576,在多就分布式吧,,别挤在一台服务器上处理数据
如果单独修改了net.ipv4.tcp_max_orphans 引起疯狂跳出TCP: out of memory -- consider tuning tcp_mem ,那么代表要同时设置net.ipv4.tcp_mem的值。但是我vps只有1G内存太小了,就不去管它了,而且这些值会根据系统内存大小自动设置的,一般也无需人工去分配。
在看看现在的数据,看数据来说,mem字段刚好是除以100K=系统实际内存使用MB。计算方式非常明显,由于没触发tcp_mem,所以tcp_rmem(87380)+tcp_wmem(16384)然后/1024=101K
# cat /proc/net/sockstat
sockets: used 16507
TCP: inuse 116422 orphan 100000 tw 4096 alloc 116428 mem 91475
UDP: inuse 4 mem 0
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
#
一个tcp连接最小占用内存为4096+4096 = 8k,那么对于一个8G内存的机器,在不考虑其他限制下,最多支持的并发量为:8*1024*1024/8 约等于100万连接数并发。https://bbs.itzmx.com/thread-99643-1-1.html
报错虽然得到解决,但是服务器丢包依旧存在,等于说只是让Linux内核自身不去刷日志,,不知道是因为用的vps虚拟化的毛病吗?可能和(TCP: time wait bucket table overflow)一样直接无视就行。果然kvm虚拟化渣渣,依旧无法承受住。

参考资料:https://www.na3.jp/entry/20200120/p1

才发现,,centos7默认4096并发,而centos是26W并发,,,我就说3.x的内核跑不过2.6破案了,改了在观察一段时间
经过一个月观察,2.6并发是我用过最好的,2.6可以一台vps跑上百万TCP并发,3.10的,,一台5000并发就嗝屁了
新内核都越来越差经,系统限制解了,没用,messages里没有输出被限制的信息,可以证明和默认设置无关,内核层的问题


同时大概率还遇到另一种系统内核限制
Linux服务器高并发效率应用中出现ping icmp tcp等丢包故障的解决思路和方法。nf_conntrack连接跟踪表溢出优化,openvz商家注意啦!table full, dropping packet
https://bbs.itzmx.com/forum.php?mod=viewthread&tid=88435&fromuid=1


对于orphaned sockets一般来说不用管,影响微乎其微,每个tcp连接内存分配默认就行,4096 + 4096 是最节省内存的方式,只要8K一个连接
一般单台机器100万连接数才需要调整这些东西,tracker的连接数一般不会超过1w,看我昨天截图高峰期也才3000左右连接数,这种请求连接建立后会立即clos掉,连接数活跃持续就1秒,不需要长连接,所以内核提示这个就没影响了

页: [1]
查看完整版本: Linux服务器并发连接数高时dmesg 内核报错TCP: too many orphaned sockets socket端口号过多导致系统内存资源用尽 引起高丢包ping超时 tcp_mem计算方式