Linux 网络性能tuning向导

本文的目的不完全在于提供调优信息,而是在于告诉读者了解Linux kernel如何处理数据包,从而能够在自己的实践中发挥Linux 内核协议栈最大的性能

The NIC ring buffer

接收环缓冲区在设备驱动程序和NIC之间共享。 网卡分配发送(TX)和接收(RX)环形缓冲区。 环形缓冲区是一个循环缓冲区,其中溢出只是覆盖现有数据。 应该注意,有两种方式将数据从NIC移动到内核,硬件中断和软件中断(也称为SoftIRQ)。 RX环形缓冲区用于存储传入的数据包,直到它们被设备驱动程序处理。 设备驱动程序通常通过SoftIRQ消费RX环,这将进入的数据包放入称为sk_buff或“skb”的内核数据结构中,以开始其通过内核并到达拥有相关套接字的应用程序。 TX环形缓冲区用于保存发往该线路的输出数据包。 这些环形缓冲器位于堆栈的底部,并且是可能发生分组丢弃的关键点,这又会不利地影响网络性能。

Interrupts and Interrupt Handlers

来自硬件的中断称为“上半部分”中断。 当NIC接收到传入数据时,它使用DMA将数据复制到内核缓冲区中。 NIC通过唤醒硬中断通知内核此数据。 这些中断由中断处理程序处理,这些中断处理程序执行最少的工作,因为它们已经中断了另一个任务,并且不能自行中断。 硬中断在CPU使用方面可能是昂贵的,特别是在持有内核锁时。 硬中断处理程序然后将大部分分组接收留给可以更公平地调度的软件中断或SoftIRQ处理。

硬中断可以在/ proc / interrupts中看到,其中每个队列在分配给它的第一列中有一个中断向量。 当系统引导或加载NIC设备驱动程序模块时,这些初始化。 每个RX和TX队列被分配一个唯一的向量,它通知中断处理程序该中断来自哪个NIC /队列。 列将进入中断的数量表示为计数器值:

Linux 网络性能tuning向导

SoftIRQs

也称为“下半”中断,软件中断请求(SoftIRQ)是内核线程,其被调度为在其他任务不会被中断的时间运行。 SoftIRQ的目的是消费网络适配器接收环缓冲区。 这些例程以ksoftirqd / cpu-number进程和调用驱动程序特定的代码函数的形式运行。 它们可以在过程监控工具(如ps和top)中看到。 以下调用堆栈,从底部向上读取,是一个SoftIRQ轮询Mellanox卡的示例。 标记为[mlx4_en]的函数是mlx4_en.ko驱动程序内核模块中的Mellanox轮询例程,由内核的通用轮询例程(如net_rx_action)调用。 从驱动程序移动到内核之后,接收到的流量将移动到套接字,准备应用程序使用:

Linux 网络性能tuning向导

可以如下监视SoftIRQ。 每列代表一个CPU:

NAPI Polling

NAPI或新的API,以使处理传入卡的数据包更有效率。 硬中断是昂贵的,因为它们不能被中断。 即使中断聚合(稍后更详细地描述),中断处理程序也将完全独占CPU核心。 NAPI的设计允许驱动程序进入轮询模式,而不是每次需要的数据包接收都被硬中断。 在正常操作下,引发初始硬中断或IRQ,随后是使用NAPI例程轮询卡的SoftIRQ处理器。 轮询例程具有确定允许代码的CPU时间的预算。 这是防止SoftIRQ独占CPU的必要条件。 完成后,内核将退出轮询例程并重新建立,然后整个过程将重复自身。

Network Protocol Stacks

一旦已经从NIC接收到到内核的业务,则其然后由协议处理器(例如以太网,ICMP,IPv4,IPv6,TCP,UDP和SCTP)处理。最后,数据被传递到套接字缓冲器, 运行接收函数,将数据从内核空间移动到用户空间,并结束内核在接收过程中的参与。

Packet egress in the Linux kerne

Linux内核的另一个重要方面是网络包出口。 虽然比入口逻辑简单,但出口仍然值得确认。 当skbs从协议层传递到核心内核网络例程时,该过程工作。 每个skb包含一个dev字段,其中包含将通过其传输的net_device的地址:

Linux 网络性能tuning向导

它使用此字段将skb路由到正确的设备:

基于此设备,执行将切换到处理skb的驱动程序,并最终将数据复制到NIC上。 这里主要需要调优的是TX队列入队规则(qdisc)稍后描述。 一些NIC可以有多个TX队列。
以下是从测试系统获取的示例堆栈跟踪。 在这种情况下,流量是通过环回设备,但这可以是任何NIC模块:

Linux 网络性能tuning向导

Networking Tools 

要正确诊断网络性能问题,可以使用以下工具:

netstat 

一个命令行实用程序,可以打印有关打开网络连接和协议栈统计信息。 它从/ proc / net /文件系统检索有关网络子系统的信息。 这些文件包括:

•/ proc / net / dev(设备信息)

•/ proc / net / tcp(TCP套接字信息)

•/ proc / net / unix(Unix域套接字信息)

有关netstat及其引用文件的更多信息 / proc / net /,请参考netstat手册页:man netstat。

dropwatch 

监视实用程序,用于监视内核从内存释放的数据包。 有关更多信息,请参阅dropwatch手册页:man dropwatch。

ip 

用于管理和监视路由,设备,策略路由和隧道的实用程序。 有关更多信息,请参阅ip手册页:man ip

ethtool 

用于显示和更改NIC设置的实用程序。 有关更多信息,请参阅ethtool手册页:man ethtool。

各种工具可用于隔离问题区域。

通过调查以下几点来找到瓶颈:

•适配器固件级别 - 在ethtool -S ethX统计信息中观察丢弃

•适配器驱动程序级别

•Linux内核,IRQ或SoftIRQs - 检查/ proc /中断和/ proc / net / softnet_stat

• 协议层IP,TCP或UDP - 使用netstat -s并查找错误计数器

Performance Tuning

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14794.html