如何优化Linux网络性能?

话题来源: 如何快速排查TCP握手超时处理流程

说到Linux网络性能优化,这真是个让人又爱又恨的话题。记得上次我们的服务器莫名其妙出现了TCP连接延迟,排查了半天才发现是内核参数配置不当导致的。说实话,Linux的网络子系统就像个调音台,每个旋钮都能影响最终效果,但调得不好反而会让事情变得更糟。

内核参数调优那些事儿

你可能不知道,Linux内核默认的TCP/IP栈配置是为通用场景设计的,但在高并发或延迟敏感的应用中就显得力不从心了。比如net.ipv4.tcp_tw_reuse这个参数,默认关闭的情况下会让TIME_WAIT状态的连接占用端口长达60秒,这在Web服务器上简直是灾难。

我常用的几个关键调优参数包括:

  • net.core.somaxconn – 提高连接队列长度
  • net.ipv4.tcp_fin_timeout – 缩短FIN_WAIT时间
  • net.ipv4.tcp_max_syn_backlog – 增大SYN队列

网卡驱动的玄学

有一次我遇到个特别诡异的问题:两台配置完全相同的服务器,网络性能却差了将近30%。后来发现是其中一台的网卡中断绑定没做好,CPU核心在频繁处理中断请求。用ethtool -S eth0查看统计信息时,发现rx_no_buffer_count数值一直在飙升,这才恍然大悟。

对于高性能场景,我强烈建议:

  • 调整中断亲和性(IRQ Balance)
  • 启用多队列(RSS)
  • 考虑使用DPDK这样的用户态网络方案

那些容易被忽视的细节

你知道吗?Linux默认的MTU是1500,但在某些云环境里,可能需要调整到9000(Jumbo Frame)。我见过一个案例,就因为MTU不匹配,导致TCP重传率飙升到5%,性能下降了将近一半。

还有一些”冷知识”也很有意思:

  • 关闭IPv6有时能提升性能(特别是在老旧硬件上)
  • 调整TCP窗口缩放因子能显著提升长距离传输性能
  • 禁用TCP时间戳可以减少CPU开销

说到底,网络性能优化是个系统工程,没有放之四海而皆准的方案。我的经验是:先测量,再调整,每次只改一个参数,然后观察效果。毕竟,在这个领域里,最危险的就是那些”我觉得这样会更快”的直觉判断。

评论