这是一篇关于 Linux 网络性能优化的技术文章,涵盖了 Linux 网络栈、网络性能调优的多个方面,包括中断合并、IRQ 亲和性、接收包导向(RPS)、接收流导向(RFS)、加速接收流导向(aRFS)、TCP 读写缓冲区/队列、TCP FSM 和拥塞算法、NUMA 等,并介绍了一些高级的数据包处理模块/框架,如AF_PACKET
v4、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-usecs
、tx-usecs
、rx-frames
、tx-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.somaxconn
、net.ipv4.tcp_fin_timeout
、net.ipv4.tcp_available_congestion_control
、net.ipv4.tcp_congestion_control
、net.ipv4.tcp_max_syn_backlog
、net.ipv4.tcp_syncookies
、net.ipv4.tcp_slow_start_after_idle
等参数可以优化 TCP 的连接处理和拥塞控制。
NUMA 相关
- NUMA 是一种内存架构,可提高网络性能。通过确定 NUMA 节点、 locality 和设备本地性,可以进行相应的调优。
numactl
和numad
是用于 NUMA 系统的工具。
高级数据包处理模块/框架
AF_PACKET
v4:提供零拷贝模式,减少数据复制和上下文切换,提高网络数据包的处理性能。PACKET_MMAP
:是一个 Linux API,用于快速数据包嗅探,通过共享内存减少系统调用和数据复制。- DPDK:一个用户空间框架,用于快速数据包处理,所有流量都绕过内核,通过特殊的驱动和库与网络卡进行交互,并使用 hugepages 分配内存。
- PF_RING:一个 Linux 内核模块和用户空间框架,通过 NAPI 从 NIC 轮询数据包,并具有模块化架构,可以使用额外的组件。
- XDP(eXpress Data Path):一个 eBPF 实现,用于早期数据包拦截,在 Linux 网络数据路径中提供可编程、高性能的数据包处理器,可以直接在设备驱动的 RX 函数中处理数据包,实现零拷贝和高性能的数据包处理。
总之,这篇文章全面介绍了 Linux 网络性能优化的各个方面,包括底层机制和高级技术,对于深入了解和优化 Linux 网络性能具有重要的参考价值。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。