Linux 网络性能的 15 个优化建议!

💡 原文中文,约6900字,阅读约需17分钟。
📝

内容提要

本文提供了优化网络性能的建议,包括减少网络IO、合并请求、部署近一些、内网调用不用外网域名、调整网卡RingBuffer大小、减少内存拷贝、使用eBPF绕开协议栈的本机IO、减少进程阻塞、使用成熟的网络库、使用Kernel-ByPass新技术、配置充足的端口范围、小心连接队列溢出、减少握手重试、弃用短连接改用长连接、TIME_WAIT的优化。

🎯

关键要点

  • 建议1:尽量减少不必要的网络 IO。
  • 建议2:尽量合并网络请求以节约 CPU 开销和减少 RTT。
  • 建议3:调用者与被调用机器尽可能部署得近一些以降低 RTT。
  • 建议4:内网调用不要用外网域名,以提高速度和降低带宽成本。
  • 建议5:调整网卡 RingBuffer 大小以防止丢包。
  • 建议6:减少内存拷贝,使用 mmap 和 sendfile 系统调用。
  • 建议7:使用 eBPF 绕开协议栈的本机 IO。
  • 建议8:尽量少用 recvfrom 等进程阻塞的方式。
  • 建议9:使用成熟的网络库来高效管理 socket。
  • 建议10:使用 Kernel-ByPass 新技术以提高网络性能。
  • 建议11:配置充足的端口范围以避免端口不足。
  • 建议12:小心连接队列溢出以防止丢包。
  • 建议13:减少握手重试次数以提高用户体验。
  • 建议14:如果请求频繁,请弃用短连接改用长连接。
  • 建议15:TIME_WAIT 的优化以减少端口占用。

延伸问答

如何减少网络 IO 的开销?

尽量避免不必要的网络 IO,减少系统调用和协议栈的处理。

合并网络请求有什么好处?

合并网络请求可以节约 CPU 开销并降低 RTT,提升性能。

为什么内网调用不应该使用外网域名?

使用内网域名可以提高速度,降低带宽成本,避免 NAT 瓶颈。

如何优化网卡的 RingBuffer 大小?

可以通过 ethtool 调整 RingBuffer 大小,以防止丢包。

使用 eBPF 有什么优势?

eBPF 可以绕开协议栈,减少本机 IO 的开销,提高性能。

为什么要使用长连接而不是短连接?

长连接可以节约握手开销,避免队列满的问题,并减少端口占用。

➡️

继续阅读