第二讲:硬件基础——网卡硬件架构与中断多队列原理

各位好,我是老张。今天咱们聊聊网卡硬件那些事。

做低延迟调优,你得先懂硬件。这就像修车,你得知道发动机长什么样,才能谈改装。网卡也一样——你不了解PCIe、MAC、PHY这些模块怎么协作,后面调优就是瞎蒙。

我个人习惯,拿到一块新网卡,先看它的硬件框图。嗯,今天我就带你把这张图看懂。

2.1 网卡硬件架构:PCIe、MAC、PHY

一块网卡,从外到内,大致分三层:

  • PCIe接口:连接主机总线,负责数据搬运
  • MAC层:媒体访问控制,处理帧封装、地址过滤
  • PHY层:物理层,负责信号编码、线缆驱动

说白了,数据从网线进来,先经过PHY变成数字信号,再到MAC做帧处理,最后通过PCIe送到内存。反过来也一样。

关键点:低延迟场景下,PCIe的带宽和延迟是首要瓶颈。我见过不少团队,网卡选的是顶配,结果插在PCIe 2.0 x4槽上,白白浪费一半性能。

这里我画了一张架构图,帮你理清关系:

网卡硬件架构示意图 主机内存 / CPU DMA 引擎 PCIe 接口 Gen3/Gen4/Gen5 MAC 层 帧封装 / 地址过滤 PHY 层 信号编码 / 线缆驱动 网线 / 光纤 外部网络 数据流方向 (接收路径)

你看,数据从网线进来,经过PHY、MAC,再通过PCIe送到内存。反过来发送也一样。这里有个细节——MAC和PHY之间通常用MII/GMII接口连接,延迟在纳秒级,但PCIe的延迟是微秒级的。所以,瓶颈往往在PCIe上。

我的经验:调优时,先用lspci -vvv确认网卡所在的PCIe槽位和速率。如果显示"Speed 2.5GT/s",那就是Gen1,赶紧换槽位。我曾经在一台老服务器上发现,网卡插在PCIe 2.0 x1上,吞吐量死活上不去,换了x8槽位后,延迟直接降了40%。

2.2 中断机制:MSI-X

网卡收到数据后,怎么通知CPU?

传统方式是IRQ共享中断,所有设备共用一条中断线。你想想看,CPU收到中断后,还得挨个问"是不是你的数据?"——这效率太低了。

MSI-X(Message Signaled Interrupts eXtended)解决了这个问题。每个队列可以绑定独立的中断向量,CPU收到中断时,直接知道是哪个队列的数据到了。

中断方式 延迟 CPU开销 适用场景
传统IRQ共享 高(10μs+) 高(需遍历设备) 老设备、低吞吐
MSI 中(3-5μs) 一般场景
MSI-X 低(1-2μs) 低(直接路由) 低延迟、多队列

嗯,这里要注意:MSI-X需要内核和网卡固件都支持。我遇到过一台老机器,内核版本太低,MSI-X根本不起作用,中断全挤在CPU0上,那延迟惨不忍睹。

避坑指南:我曾经在调优时,发现网卡已经开启了MSI-X,但中断还是集中在某个CPU上。后来排查发现,是BIOS中启用了"Interrupt Remapping"功能,导致中断路由混乱。关闭后,中断分布就均匀了。

2.3 多队列:RSS原理

RSS(Receive Side Scaling),说白了就是让多个CPU核心同时处理网络数据。

传统网卡只有一个队列,所有数据包都往这一个队列里塞。CPU0忙死,其他核心闲死。RSS通过哈希算法,把数据包分散到多个队列中,每个队列绑定一个CPU核心。

哈希的输入通常是:

  • 源IP + 目的IP
  • 源端口 + 目的端口
  • 协议类型

这样,同一个TCP连接的数据包,始终会落到同一个队列里,保证了数据的有序性。

核心公式:RSS哈希结果 = Toeplitz哈希(四元组) % 队列数

队列数通常设置为CPU核心数,或者2的幂次方(如4、8、16)。

我个人的习惯是,先用ethtool -x eth0查看当前RSS队列数和哈希key。如果队列数少于CPU核心数,那就得调整了。

# 查看当前RSS配置
ethtool -x eth0

# 设置RSS队列数为8(假设CPU有8核)
ethtool -L eth0 combined 8

# 设置哈希key(可选,用于负载均衡)
ethtool -X eth0 hkey 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff

这里有个坑:RSS队列数不是越多越好。队列太多,会导致缓存命中率下降,反而增加延迟。我测试过,在16核的机器上,8队列比16队列的延迟低5%左右。为什么?因为队列切换的开销超过了并行带来的收益。

我的建议:先设置队列数为CPU核心数的一半,然后逐步增加,用perf stat -e cycles,instructions,cache-misses观察缓存命中率。找到那个拐点,就是最佳配置。

2.4 小结

今天的内容,说白了就是三件事:

  • PCIe:数据搬运的通道,带宽和延迟是瓶颈
  • MSI-X:中断通知机制,让CPU知道"谁来了"
  • RSS:多队列分发,让多个CPU一起干活

这三者配合好了,你的网卡才能发挥出真正的低延迟性能。下一讲,咱们聊聊驱动层面的调优——NAPI、中断合并、零拷贝这些实战技巧。


公众号:蓝海资料掘金营,微信deep3321