Linux 网络性能终极指南

这是一篇关于 Linux 网络性能优化的技术文章,涵盖了 Linux 网络栈、网络性能调优的多个方面,包括中断合并、IRQ 亲和性、接收包导向(RPS)、接收流导向(RFS)、加速接收流导向(aRFS)、TCP 读写缓冲区/队列、TCP FSM 和拥塞算法、NUMA 等,并介绍了一些高级的数据包处理模块/框架,如AF_PACKETv4、PACKET_MMAP、DPDK、PF_RING 和 eXpress Data Path(XDP)。

Linux 网络栈

  • 详细介绍了 Linux 网络数据包接收的过程,包括中断请求(IRQ)、软中断(softIRQ)、NAPI 等机制,以及数据包在网络栈中的处理流程,从网卡接收数据包到最终传递给用户空间的协议栈。
  • 还介绍了 Linux 网络数据包发送的过程,包括应用程序发送消息、TCP 发送消息、构建 TCP 头部、调用网络层处理程序等步骤。

网络性能调优

  • /proc/net/softnet_stat 和 /proc/net/sockstat:用于查看网络统计信息,如接收帧数量、丢弃帧数量等。
  • ss:用于调查套接字,显示类似于netstat的信息,可用于查看套接字内存使用情况。
  • netstat:命令行工具,用于打印关于打开的网络连接和协议栈统计信息。
  • sysctl:用于更改系统/网络设置,临时或永久地修改系统变量。

NIC 相关调优

  • NIC 环形缓冲区:通过ethtool命令可以查看和调整 NIC 的环形缓冲区大小,以防止数据包丢失和增加延迟。
  • 中断合并(IC):调整rx-usecstx-usecsrx-framestx-frames等参数可以减少 CPU 使用率和硬中断,但可能会增加延迟。
  • IRQ 亲和性:通过设置irqbalancer服务或手动修改/proc/irq/<IRQ_NUMBER>/smp_affinity文件,可以将中断关联到特定的 CPU 核心,以提高性能。
  • 接收包导向(RPS)/接收流导向(RFS)/加速接收流导向(aRFS):这些机制用于在多 CPU 环境下并行处理网络数据包,提高吞吐量和降低延迟。RPS 是 RFS 的软件实现,aRFS 是 RFS 的硬件加速版本。

TCP 相关调优

  • TCP 读写缓冲区/队列:通过sysctl命令可以调整 TCP 的读写缓冲区大小,以改善性能。
  • TCP FSM 和拥塞算法:调整net.core.somaxconnnet.ipv4.tcp_fin_timeoutnet.ipv4.tcp_available_congestion_controlnet.ipv4.tcp_congestion_controlnet.ipv4.tcp_max_syn_backlognet.ipv4.tcp_syncookiesnet.ipv4.tcp_slow_start_after_idle等参数可以优化 TCP 的连接处理和拥塞控制。

NUMA 相关

  • NUMA 是一种内存架构,可提高网络性能。通过确定 NUMA 节点、 locality 和设备本地性,可以进行相应的调优。numactlnumad是用于 NUMA 系统的工具。

高级数据包处理模块/框架

  • AF_PACKETv4:提供零拷贝模式,减少数据复制和上下文切换,提高网络数据包的处理性能。
  • PACKET_MMAP:是一个 Linux API,用于快速数据包嗅探,通过共享内存减少系统调用和数据复制。
  • DPDK:一个用户空间框架,用于快速数据包处理,所有流量都绕过内核,通过特殊的驱动和库与网络卡进行交互,并使用 hugepages 分配内存。
  • PF_RING:一个 Linux 内核模块和用户空间框架,通过 NAPI 从 NIC 轮询数据包,并具有模块化架构,可以使用额外的组件。
  • XDP(eXpress Data Path):一个 eBPF 实现,用于早期数据包拦截,在 Linux 网络数据路径中提供可编程、高性能的数据包处理器,可以直接在设备驱动的 RX 函数中处理数据包,实现零拷贝和高性能的数据包处理。

总之,这篇文章全面介绍了 Linux 网络性能优化的各个方面,包括底层机制和高级技术,对于深入了解和优化 Linux 网络性能具有重要的参考价值。

阅读 23
0 条评论