Linux内核对网络包的接收过程大致可以分为接收到RingBuffer、硬中断处理、ksoftirqd软中断处理几个过程。其中在ksoftirqd软中断处理中,把数据包从RingBuffer中摘下来,送到协议栈的处理,再之后送到用户进程socket的接收队列中。 理解了Linux工作原理之后,还有更重要的两件事情。第一是动手监控,会实际查看网络包接收的整体情况。第二是调优,当你的服务器有问题的时候,你能找到瓶颈所在,并会利用内核开放的参数进行调节。
一
先说几个工具
在正式内容开始之前,我们先来了解几个Linux下监控网卡时可用的工具。
1)ethtool
首先第一个工具就是我们在上文中提到的ethtool
,它用来查看和设置网卡参数。这个工具其实本身只是提供几个通用接口,真正的实现是都是在网卡驱动中的。正因为该工具是由驱动直接实现的,所以个人觉得它最重要。
该命令比较复杂,我们选几个今天能用到的说
-i
显示网卡驱动的信息,如驱动的名称、版本等-S
查看网卡收发包的统计情况-g/-G
查看或者修改RingBuffer的大小-l/-L
查看或者修改网卡队列数-c/-C
查看或者修改硬中断合并策略
实际查看一下网卡驱动:
# ethtool -i eth0driver: ixgbe......
这里看到我的机器上网卡驱动程序是ixgbe。有了驱动名称,就可以在源码中找到对应的代码了。对于ixgbe
来说,其驱动的源代码位于drivers/net/ethernet/intel/ixgbe
目录下。ixgbe_ethtool.c`下都是实现的供ethtool使用的相关函数,如果ethtool哪里有搞不明白的,就可以通过这种方式查找到源码来读。另外我们前文《图解Linux网络包接收过程》里提到的NAPI收包时的poll回调函数,启动网卡时的open函数都是在这里实现的。
2)ifconfig
网络管理工具ifconfig不只是可以为网卡配置ip,启动或者禁用网卡,也包含了一些网卡的统计信息。
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.162.42.51 netmask 255.255.248.0 broadcast 10.162.47.255 inet6 fe80::6e0b:84ff:fed5:88d1 prefixlen 64 scopeid 0x20<link> ether 6c:0b:84:d5:88:d1 txqueuelen 1000 (Ethernet) RX packets 2953454 bytes 414212810 (395.0 MiB) RX errors 0 dropped 4636605 overruns 0 frame 0 TX packets 127887 bytes 82943405 (79.1 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- RX packets:接收的总包数
- RX bytes:接收的字节数
- RX errors:表示总的收包的错误数量
- RX dropped:数据包已经进入了 Ring Buffer,但是由于其它原因导致的丢包
- RX overruns:表示了 fifo 的 overruns,这是由于 Ri