Linux 网络栈调优:从内核到应用

为什么要调优 Linux 网络栈 Linux 内核默认的网络参数是为通用场景设计的,保守而安全。但在高并发 Web 服务、大规模负载均衡器、CDN 节点等场景下,默认值会成为瓶颈。典型症状包括: dmesg 出现 nf_conntrack: table full, dropping packet ss -s 显示大量 TIME-WAIT 连接 压测时 CPU 没跑满但吞吐量上不去 网卡 PPS(包每秒)远低于硬件能力 这些问题大多源于内核网络参数未调优。从协议栈参数、conntrack、网卡多队列、拥塞控制四个层面详细梳理。 内核网络参数的完整说明可参考 kernel.org 文档,本文涉及的参数在 Documentation/networking/ip-sysctl.txt 中有详细定义。 TCP/IP 协议栈关键内核参数 所有参数通过 sysctl 或 /proc/sys/net/ 查看和修改。以下参数均在 net.ipv4 命名空间下。 连接队列参数 # 查看当前值 sysctl net.ipv4.tcp_max_syn_backlog sysctl net.core.somaxconn sysctl net.core.netdev_max_backlog somaxconn — 监听套接字的全连接队列上限: # 默认值通常为 128 或 4096(取决于内核版本) # 高并发场景建议设置为 65535 net.core.somaxconn = 65535 全连接队列存放已完成三次握手但尚未被 accept() 取走的连接。队列满后新连接被丢弃,客户端看到连接超时。注意:应用层面的 listen(fd, backlog) 的 backlog 值不能超过 somaxconn,实际取两者最小值。...

May 7, 2024 · 7 分钟 · 1284 字 · 徐保金