linux服务器udp丢包解决办法,查看RcvbufErrors和SndbufErrors内存Socket缓存大小,内核缓冲区参数优化,watch 每秒实时刷新命令
linux服务器udp丢包解决办法,查看RcvbufErrors和SndbufErrors内存Socket缓存大小,内核缓冲区参数优化,watch 每秒实时刷新命令查看值,发现不为0,代表存在丢包现象
cat /proc/net/snmp | grep -E '^Udp:' | column -t
Udp:InDatagramsNoPortsInErrorsOutDatagramsRcvbufErrorsSndbufErrorsInCsumErrors
Udp:3868890 14496 329700 2491364 329691 1375190 9
用watch每秒刷新一次,优化后可以看到udp不在丢包
watch -n 1 "nstat -az | grep -E 'UdpRcvbufErrors|UdpSndbufErrors'"
编辑文件:/etc/sysctl.conf
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
socket缓冲区大小,默认值124928改成67108864
net.core.rmem_default = 33554432
net.core.wmem_default = 33554432
注意Linux程序读取是是这个default的值,记得也要同时修改max的值(需要重启当前运行的进程来获取新的值,udp服务端被动接收请求只会产生一个socket,不像tcp是每个客户端请求的时候服务器会单独分配一个新socket,根据设置也就是udp服务端进程最多可以用到32M内存)
然后执行 /sbin/sysctl -p 让参数生效
此时nstat显示的丢包数值已经不会上涨,ss命令观察进程名确定已经生效
ss -tunlp -m
r 当前使用的接收缓存
rb 当前接收缓存上限值
t 当前使用的发送缓存
tb 当前发送缓存上限值
f 分配的内存页面数量
跟着帖子修改default的值肯定可以解决RcvbufErrors,他不会在上涨了
但是SndbufErrors还在增加,还没研究出来怎么调整内核优化,后续在更新帖子
发现以前写过一个类似的帖子,至少这个帖子上贴出来的这些参数并不能解决发送丢包
https://bbs.itzmx.com/thread-110323-1-1.html
不过和这篇帖子不同的是,丢包没有发生在网卡层,网卡上的丢包数值是0,那么SndbufErrors肯定是内核上的限制
帖子补充
SndbufErrors的原因找到了,是vps云厂商偷偷限速宽带,所以系统CPU占用率很低不到30%,内核上也找不到问题,负载0.2左右但是一直发生丢包,tcp和udp与ping都会丢包
总之避雷colocrossing的vps,感觉所有用Virtualizor销售面板的都有这种毛病,SolusVM虚拟化的机器就没事
https://bbs.itzmx.com/thread-116235-1-1.html
比如ipv4.errors显示OutDiscards,如果值≥1,那么肯定就是发生了限速的情况
也可以看ipv4.tcperrors显示RetransSegs来确认限速(被限速的TCP丢包重传),或者看ipv4.tcphandshake显示OutRsts
或者ip.tcp_accept_queue和ip.tcp_syn_queue显示128以上是被偷偷限速导致的
页:
[1]