我有一个应用程序在端口 12201 上接收大量 UDP 流量,我注意到某些 UDP 数据包从未进入应用程序(仅由内核接收)。
当我跑
netstat -c --udp -an | grep 12201
Run Code Online (Sandbox Code Playgroud)
我可以看到 Recv-Q 几乎总是 126408,很少低于,从不高于:
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
udp 126408 0 :::12201 :::*
Run Code Online (Sandbox Code Playgroud)
这是否意味着接收队列已满?数字126408从哪里来?我怎样才能增加它?
sysctl 配置:
# sysctl -a | grep mem
vm.overcommit_memory = 0
vm.nr_hugepages_mempolicy = 0
vm.lowmem_reserve_ratio = 256 256 32
vm.meminfo_legacy_layout = 1
vm.memory_failure_early_kill = 0
vm.memory_failure_recovery = 1
net.core.wmem_max = 124928
net.core.rmem_max = 33554432
net.core.wmem_default = 124928
net.core.rmem_default = 124928
net.core.optmem_max = 20480
net.ipv4.igmp_max_memberships = 20
net.ipv4.tcp_mem = 365760 487680 731520
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.udp_mem = 262144 327680 393216
net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096
Run Code Online (Sandbox Code Playgroud)
小智 6
看起来您的应用程序使用系统默认接收缓冲区,这是通过 sysctl 定义的
net.core.rmem_default = 124928
Run Code Online (Sandbox Code Playgroud)
因此你会看到上限Recv-Q接近于上面。尝试将应用程序中的 SO_RCVBUF 套接字选项更改为更高的值,可能达到最大限制。正如 sysctl 设置中所定义的net.core.rmem_max = 33554432
由于队列已满而丢弃的数据包计数,可以通过查看netstat -us(查找packet receive errors)
| 归档时间: |
|
| 查看次数: |
9265 次 |
| 最近记录: |