本文概述了面向台湾 CN2 100M 链路的服务器端优化要点:从内核网络栈、网卡与驱动、队列与中断调度、TCP 参数调优到测试与监控方法,提供可执行的配置建议与调试步骤,兼顾吞吐与延迟,帮助在 100M 环境中实现稳定且接近链路实际带宽的传输性能。
首先调整内核网络参数:使用 sysctl 修改 rmem_default/rmem_max 和 wmem_default/wmem_max,保证 TCP 窗口足够容纳带宽-时延积(BDP)。对于 100M、RTT 假设 50ms,BDP ≈ 0.1Gbps*0.05s ≈ 0.6MB,设置 rmem_max/wmem_max 为 4MB~16MB 更保险。启用 tcp_timestamps 和 tcp_sack,选择合适的拥塞控制算法(如 BBR 或最新版 CUBIC),并根据测试结果决定是否启用 fastopen。
驱动和硬件决定了包处理能力与 offload 行为。优先使用供应商建议的最新驱动(例如 ixgbe、e1000e、r8169 等),并通过 ethtool 查看并设置支持的 offload(GRO、GSO、TSO)。在高并发或小包场景下可能需关闭部分 offload 来降低延迟;在大流量场景下开启会提高 CPU 利用效率。还要关注网卡中断模式(MSI/MSI-X)与队列数量,合理分配队列与 RSS 哈希。
中断(IRQ)与 CPU 亲和性直接影响延迟和抖动。使用 irqbalance 或手动写入 /proc/irq/*/smp_affinity 设置将网卡队列的中断绑定到对应的 CPU 核心,同时将用户态网络应用或工作线程绑定到相邻核心,减少跨核缓存抖动。对于多队列 NIC,确保 RX/TX 队列和 CPU 核心一一对应,必要时调整 rps/fps(/sys/class/net/eth0/queues/*/rps_cpus)来分散负载。
利用 tc(traffic control)配置合适的队列规则和队列调度器(qdisc)。在上游链路带宽固定为 100M 的情况下,可使用 fq_codel 或 cake 来减少队头阻塞并控制延迟,同时在必要时用 HTB + SFQ 对不同流量做限速与优先级划分。设置合理的 txqueuelen(例如 1000~2000)并监控 tx_dropped,以判断是否需要限流或增加缓冲。
关键指标包括带宽利用率、丢包率、往返时延(RTT)与抖动、CPU 占用率、中断分布以及 socket 队列长度(netstat/ss 的 tx_queue/rx_queue)。使用 iperf3(TCP/UDP)、mtr、ping、tcpdump、iftop、nload 等工具进行多角度测试;在实际业务流量下观察 24-72 小时的峰值与平均值,确保优化在各种流量模式下都稳定。
对于 100M 链路,BBR 在高带宽延迟积或中等 RTT 场景下通常能提高带宽利用率并降低排队延迟,CUBIC 在丢包较低的环境也表现良好。通过 sysctl net.ipv4.tcp_congestion_control 切换算法,并用 iperf3 对比吞吐和 RTT。若 CN2 路径丢包或抖动较低,优先尝试 BBR;若网络有突发丢包或旧设备兼容性问题,则回退到 CUBIC 并调整窗口。
采用灰度升级与双机热备策略:在负载均衡层逐步切换到新配置的服务器,先在少量实例上验证,再扩大范围。使用配置管理工具(Ansible、Salt)批量下发并保留原配置备份。重要内核参数改动可在不重启服务的情况下生效,但若涉及驱动或内核模块更新,需安排维护窗口并做好回滚脚本与快照。
短期测试能显示即时改进,但长期趋势体现稳定性与复现性。通过 Prometheus + Grafana、Zabbix 等监控平台采集带宽、丢包、RTT、队列长度与 CPU/IRQ 分布,设置阈值告警(如丢包率 > 0.5%、RTT 上升 2 倍、tx_dropped 持续增加),并记录变更日志以追责与回溯。