Ubuntu backlog 性能优化指南
一 核心概念与瓶颈定位
ss -lnt | awk '$4 ~ /:80$/ {print $2}'(第二列为当前排队连接数;若接近或达到 somaxconn,说明已完成队列成为瓶颈)。ss -s | grep -i syn(观察 SYN-RECV 数量是否接近 tcp_max_syn_backlog)。ip -s link show <iface>、ethtool -S <iface> | egrep 'drop|over|rx_missed'(若增长明显,可能受 netdev_max_backlog 或软中断处理限制)。二 内核参数优化
/etc/sysctl.d/99-network-tuning.conf 并执行 sudo sysctl -p 持久化:
net.core.somaxconn = 65535:提升已完成连接队列上限(需与应用 backlog 配合)。net.ipv4.tcp_max_syn_backlog = 8192:提升半连接队列上限(高并发/受 SYN Flood 影响时更关键)。net.core.netdev_max_backlog = 30000:提升网卡到内核的接收队列上限。net.ipv4.tcp_syncookies = 1:在半连接队列满时启用 SYN Cookie,抵御 SYN Flood(建议开启)。net.ipv4.tcp_tw_reuse = 1:允许将处于 TIME_WAIT 的套接字用于新的连接(客户端或短连接场景更安全;NAT 环境慎用)。net.ipv4.tcp_tw_recycle = 0:在 NAT/负载均衡 环境下禁用,避免时间戳导致连接异常。net.ipv4.tcp_fin_timeout = 10:加速回收 FIN 状态,缩短端口占用时间。net.core.rmem_default = 262144net.core.wmem_default = 262144net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.ipv4.tcp_rmem = 4096 87380 16777216net.ipv4.tcp_wmem = 4096 65536 16777216net.ipv4.tcp_mem = 131072 262144 524288net.ipv4.tcp_window_scaling = 1、net.ipv4.tcp_timestamps = 1、net.ipv4.tcp_sack = 1:启用窗口缩放、时间戳与 SACK,提升高丢包/乱序网络性能。net.ipv4.ip_local_port_range = 1024 65535:扩大本地端口池,缓解端口耗尽。net.ipv4.tcp_retries2 = 5:减少重传次数,降低失败重试耗时(谨慎评估丢包环境)。三 应用层与网卡队列协同
listen 80 default_server backlog 4096;acceptCount="500"(在 ethtool -l <iface>;若当前队列数小于最大队列数,可设置 ethtool -G <iface> rx 2048 tx 1024(按设备支持调整)。ethtool -K <iface> tso on gso on gro on(提升大流量吞吐,注意与虚拟化和特定驱动版本的兼容性)。ip link set <iface> mtu 9000 提升大包效率;否则保持 1500 以避免分片与兼容性问题。四 监控验证与回退策略
ss -lnt | awk '$4 ~ /:80$/ {print $2}'、ss -s | grep -i syn、ip -s link show <iface>、ethtool -S <iface> | egrep 'drop|over|rx_missed'。ab、wrk、jmeter 或业务流量回放,逐步提升并发,观察队列占用、握手时延、错误率与丢包。somaxconn 使用率、SYN-RECV 数量、网卡丢包/溢出、TCP 重传等进行监控与阈值告警。