Linux之(26)ethtool命令总结
Author:OnceDay Date:2023年3月29日
漫漫长路,有人对你微笑过嘛…
参考文档:
- 如何使用 ethtool 命令管理以太网卡 | Linux 中国
- ethtool原理介绍和解决网卡丢包排查思路
- ethtool(8) - Linux manual page (man7.org)
- softnet_stat参数含义_zhenghuaduo的博客-CSDN博客
- 改变网络接口速度和协商方式miitool和ethtool_ethtool 协商_秋雪夜雨寒的博客-CSDN博客
- Linux 常用命令集合 | 菜鸟教程 (runoob.com)
- 【ethtool】ethtool 网卡诊断、调整工具、网卡性能优化| 解决丢包严重_ethtool ethx_bandaoyu的博客-CSDN博客
1.概述
ethtool 用于查看和修改网络设备(尤其是有线以太网设备)的驱动参数和硬件设置。
下面是一些常见概念:
- 半双工:半双工模式允许设备一次只能发送或接收数据包。
- 全双工:全双工模式允许设备可以同时发送和接收数据包。
- 自动协商:自动协商是一种机制,允许设备自动选择最佳网速和工作模式(全双工或半双工模式)。
- 速度:默认情况下,它会使用最大速度,你可以根据自己的需要改变它。
- 链接检测:链接检测可以显示网卡的状态。如果显示为
no
,请尝试重启网卡。如果链路检测仍显示no
,则检查交换机与系统之间连接的线缆是否有问题。
如果设备上没有ethtool工具,可以使用apt-get install ethtool
等命令来安装。
ethtool并不能查看所有类型网卡的参数,因为实际情况非常复杂,有些虚拟网卡查出来的参数很有限,有些物理网卡,但驱动被DPDK等其他程序接管,其效果也一般。
下面是ethtool
常见支持的特性:
-
Get identification and diagnostic information,获取识别和诊断信息
-
Get extended device statistics,获取扩展设备统计信息
-
Control speed, duplex, autonegotiation and flow control for Ethernet devices,控制速度,双工,自动协商和以太网设备的流量控制
-
Control checksum offload and other hardware offload features,控制校验和卸载和其他硬件卸载功能
-
Control DMA ring sizes and interrupt moderation,控制DMA环大小和中断调节
-
Control receive queue selection for multiqueue devices,控制多队列设备的接收队列选择
-
Upgrade firmware in flash memory,升级闪存固件
1.1 网卡收包的基本过程
ethtool
是一个非常复杂的工具,很难一次性全部了解,因此先要从基本的收包流程走起。
一般数据包接收有以下几个步骤:
- 网卡收到数据包,这是硬件外设主动收包,CPU无法感知。
- 将数据包从网卡硬件缓存转移到服务器内存中。
- 通知内核处理,也就是发出中断申请。
- 经过TCP/IP协议逐层处理。
- 应用程序通过
read()
从socket buffer
读取数据。
整体大概如下图所示:
网卡收到包时,需要同步到内核中,这需要通过rx ring buffer
,这是由NIC和驱动程序共享的一片区域,rx ring buffer
存储的并不是实际的 packet 数据,而是一个描述符,这个描述符指向了它真正的存储地址。
关于这部分流程可以参考文档:ethtool原理介绍和解决网卡丢包排查思路 - 简书 (jianshu.com)
整体过程大概如上所示,如果驱动处理速度跟不上网卡收包速度,即来不及分配缓冲区并填入描述符,那么网卡只能丢弃新的数据包。
RX ring里面放着的是mbuf的描述符,即地址和大小等信息。
较新的网卡,无需再内部的FIFO队列(数据包级别)中暂时缓冲数据包,直接将数据包接收的每个字节通过DMA直接传输到目的内存上。
如果网卡产生丢包现象,可从以下地方查看:
- 使用
ethtool -S dev_name
查看统计数据,一般rx_fifo_errors
表示网卡丢包,但也可能是其他字段,要根据具体情况确定。 - 在
proc/net/dev
中fifo字段增长,如果网卡驱动不由内核掌管,未必有统计值。 - 使用
ifconfig
命令,查看overruns
统计数据,同样未必一定是准确的。
还可在/proc/net/softnet_stat
里查看CPU软中断丢包的情况,
1、每一行表示每个cpu的softnat_data统计数据;
2、第1列表示该cpu收到的包个数;
3、第2列表示因softnet_data的输入队列满而丢弃的数据包个数(input_pkt_queue,队列长度最大值可通过 /proc/sys/net/core/netdev_max_backlog
调整);
4、第3列表示软中断一次取走netdev_budget个数据包,或取数据包时间超过2ms的次数;
1.2 CPU中断响应
在网卡通过DMA将数据包传输到内存之后,需要通过(DMA传输完成)中断来告诉CPU此刻已经完成数据传输。
对于Linux系统,中断一般分为两种,硬中断和软中断:
-
硬中断:一般由硬件生成,中断处理程序只会处理关键性的、短时间内可以处理完的工作,剩余耗时较长工作,会放到中断之后,由软中断来完成。硬中断也被称为上半部分。
-
软中断: 一般由软件生成,往往是预先在代码里实现好的,不具有随机性。也被称为下半部分。
对于网卡收包来说,硬中断的中断处理程序一般由驱动程序提供,也可能完全屏蔽中断,从而采用轮询的模式收包。在此基础上,也有一种折中的方案,即中断+轮询,能避免一直轮询霸占CPU,也不会响应太多中断。
1.3 ifconfig参数解析
ifconfig
命令具体详情可参考:Linux之(21)ifconfig命令_Once_day的博客-CSDN博客
下面介绍一些额外的信息:
Rx errors
,总的收包错误数量,包括帧错误(校验,太长,同步等等),Ring buffer溢出, 网卡丢包,内存不足等等。Rx dropped
,数据包已经进入了 Ring Buffer,但是由于内存不够等系统原因,导致在拷贝到内存的过程中被丢弃。Rx overruns
,由于CPU无法及时的处理报文,导致Ring buffer被耗完,从而网卡直接丢包。
2. ethtool命令使用
2.1 基础参数的介绍
可以使用man ethtool
访问命令详情,或者访问网站:ethtool(8) - Linux manual page (man7.org)
参数 | 描述 |
---|---|
-h ,--help | 展示一个简单的帮助信息 |
--version | 展示ethtool版本号 |
--debug N | 打开debug信息,N是一个掩码值 |
--json | 输出json格式字符串,部分子命令支持 |
--monitor [command] [devname] | 监听netlink消息。 |
-I ,--include-statistics | 包含与给定命令相关的设备统计信息 |
上面这些命令是一些通用的参数,ethtool
工具正常是使用netlink
来获取网卡驱动相关驱动信息的,另一种方式是ioctl
,ioctl
面对DPDK这样的场景就有一些不好用,因为内核里面并未保存着网卡信息。如果在用户态驱动的话,基本会监听netlink消息,因此一般还能获取和设置常见的参数。
--debug N
通常是用来在netlink消息返回失败类型时,输出一些DEBUG信息,目前一共有以下几种类型:
DEBUG_PARSE = 0,
DEBUG_NL_MSGS = 1, /* incoming/outgoing netlink messages */
DEBUG_NL_DUMP_SND = 2, /* dump outgoing netlink messages */
DEBUG_NL_DUMP_RCV = 3, /* dump incoming netlink messages */
DEBUG_NL_PRETTY_MSG = 4, /* pretty print of messages and errors */
N
是对应的掩码位,即N=31
表示上面的全部DEBUG
开关开启。
--json
是用来输出格式字符串,这个参数不一定生效,实际测试发现没有太大用处,虽然源码里时是正常的,所以使用之前最好还是测试一下。
--monitor [command] [devname]
,可以监控netlink消息,后面command
和devname
能限定监控范围。
不过如果ethtool编译时没有使能netlink,那么会不支持--monitor
命令,或者初始化也可能失败,总之并不是很靠谱。
下面展示一下--debug
的用法,如下:
onceday->~:# ethtool --debug 31 eth0
sending genetlink packet (32 bytes):
msg length 32 genl-ctrl
CTRL_CMD_GETFAMILY
CTRL_ATTR_FAMILY_NAME = "ethtool"
---------------- ------------------
| 0000000032 | | message length |
| 00016 | R-A- | | type | flags |
| 0000000001 | | sequence number|
| 0000000000 | | port ID |
---------------- ------------------
| 03 01 00 00 | | extra header |
|00012|--|00002| |len |flags| type|
| 65 74 68 74 | | data | e t h t
| 6f 6f 6c 00 | | data | o o l
---------------- ------------------
......
--debug N
/--json
/-I
这三个命令参数在后面用flags
来省略表示,具体是否有用要结合实际情况,包括代码实现等等。
2.2 停止帧(pause)参数信息
命令格式一般如下:
ethtool [ FLAGS ] -a|--show-pause DEVNAME #Show pause options
ethtool [ FLAGS ] -A|--pause DEVNAME #Set pause options
[ autoneg on|off ]
[ rx on|off ]
[ tx on|off ]
下面是展示指定网卡设备的停止帧信息:
onceday->~:# ethtool -a _eth1
Pause parameters for _eth1:
Autonegotiate: on
RX: off
TX: off
这三个参数也可进行设置,含义如下:
autoneg on|off
(开启或关闭停止帧自动协商)rx on|off
(开启或关闭RX停止帧)tx on|off
(开启或关闭TX停止帧)
停止帧是以太网协议用来降低对端发包速率的,避免丢包过多。
2.3 网卡聚合(coalesce)信息
由网卡状态和中断情况组成的聚合信息,能展现当前的相关配置信息。
现在一些网卡支持自适应发送/接收聚合,这样在报文较少(低速率包)时,聚合包数量降低,响应更快。但报文很多(高速率包)时,为了降低中断频率,需要增大聚合包的数目。
命令格式一般如下:
ethtool -c|--show-coalesce devname #查看聚合信息
ethtool -C|--coalesce devname [parameters] #设置聚合参数
首先查询一下:
onceday->~:# ethtool -c _eth1
Coalesce parameters for _eth1:
Adaptive RX: off TX: off
stats-block-usecs: 0
sample-interval: 0
pkt-rate-low: 0
pkt-rate-high: 0
rx-usecs: 64
rx-frames: 32
rx-usecs-irq: 0
rx-frames-irq: 0
tx-usecs: 1000
tx-frames: 32
tx-usecs-irq: 0
tx-frames-irq: 0
rx-usecs-low: 0
rx-frames-low: 0
tx-usecs-low: 0
tx-frames-low: 0
rx-usecs-high: 0
rx-frames-high: 0
tx-usecs-high: 0
tx-frames-high: 0
参数非常多,下面是这些参数的含义(具体含义来自于ethtool源码的ethtool.h
文件):
stats_block_coalesce_usecs
,驱动在内存里统计数据的更新延迟(us),如果驱动不支持,应忽略该值。此值不能为0。rate_sample_interval
,多久做一次自适应合并包率采样,以秒为单位。这个参数指定多久进行一次自适应合并包速率的调整,采样的包速率值将和下面的pkt-rate-low
和pkt-rate-high
进行对比。此值不能为0。pkt-rate-low
,低速率包的判定阈值(按每秒计算)。pkt-rate-high
,高速率包的判定阈值(按每秒计算)。rx-usecs
(rx_coalesce_usecs
),在一个报文达到后,延迟触发RX中断的时间(us)。rx-frames
(rx_max_coalesced_frames
),在触发RX中断之前能接受的最大报文数目(Max num)。rx-usecs-irq
(rx_coalesce_usecs_irq
),和rx-usecs
相同,但只在中断正在被响应时才会生效。比如收到了一个报文,但此时RX中断服务例程正在执行,那么就会延迟指定微妙后触发RX中断。如果无RX中断服务例程在执行,那么就会直接触发RX中断。rx-frames-irq
(rx_max_coalesced_frames_irq
),和rx-frames
相同,但只在中断正在被响应时才会生效。tx-usecs
(tx_coalesce_usecs
),在一个报文发送后,延迟触发TX中断的时间(us)。tx-frames
(tx_max_coalesced_frames
),在触发TX中断之前能发送的最大报文数目(Max num)。tx-usecs-irq
(tx_coalesce_usecs_irq
),和tx-usecs
相同,但只在中断正在被响应时才会生效。tx-frames-irq
(tx_max_coalesced_frames_irq
),和tx-frames
相同,但只在中断正在被响应时才会生效。rx-usecs-low
(rx_coalesce_usecs_low
),当报文接收速率低于pkt-rate-low
时,一个报文到达后,延迟多少微妙(us)触发RX中断。rx-frames-low
(rx_max_coalesced_frames_low
),当报文接收速率低于pkt-rate-low
时,在触发RX中断之前能接收的最大报文数目(Max num)。tx-usecs-low
(tx_coalesce_usecs_low
),当报文发送速率低于pkt-rate-low
时,一个报文发送后,延迟多少微妙(us)触发TX中断。tx-frames-low
(tx_max_coalesced_frames_low
),当报文发送速率低于pkt-rate-low
时,在触发TX中断之前能发送的最大报文数目(Max num)。rx-usecs-high
(rx_coalesce_usecs_high
),当报文接收速率高于pkt-rate-high
时,一个报文到达后,延迟多少微妙(us)触发RX中断。rx-frames-high
(rx_max_coalesced_frames_high
),当报文接收速率高于pkt-rate-high
时,在触发RX中断之前能接收的最大报文数目(Max num)。tx-usecs-high
(tx_coalesce_usecs_high
),当报文发送速率高于pkt-rate-high
时,一个报文发送后,延迟多少微妙(us)触发TX中断。tx-frames-high
(tx_max_coalesced_frames_high
),当报文发送速率高于pkt-rate-high
时,在触发TX中断之前能发送的最大报文数目(Max num)。
2.4 显示ringbuffer信息
参考文档:
一般命名格式如下:
ethtool [ FLAGS ] -g|--show-ring DEVNAME #Query RX/TX ring parameters
ethtool [ FLAGS ] -G|--set-ring DEVNAME #Set RX/TX ring parameters
[ rx N ]
[ rx-mini N ]
[ rx-jumbo N ]
[ tx N ]
输出如下:
onceday->flow-info:# ethtool -g _eth1
Ring parameters for _eth1:
Pre-set maximums:
RX: 2048
RX Mini: 0
RX Jumbo: 0
TX: 2048
Current hardware settings:
RX: 1024
RX Mini: 0
RX Jumbo: 0
TX: 2048
字段解释(RX和TX的含义是类似的):
Pre-set maximums
,这个是最大数目,实际上是配置大小或者初始化大小,只可以读。Current hardware settings
,这个是当前设置的数目,可以被ethtool工具修改。RX/TX
,接收发送缓冲区最大的可缓存描述符数量。RX Mini
,intel ixgel网卡的多收包队列之一,用于接收较小的数据包。RX Jumbo
,intel ixgel网卡的多收包队列之一,用于接收较大的数据包(MTU>1500)。
Mini-ring 和 Jumbo-ring不一定单独存在,因此不存在时其数据为0。
此外还有三个字段:
rx-buf-len
,Rx-ring的buffer其大小。cqe-size
,完成事件队列的大小。tx-push on/off
,TX push是否应该使能。
2.5 驱动信息
使用如下命令即可:
# 显示驱动信息
ethtool -i|--driver devname
# 输出寄存器信息
ethtool -d|--register-dump devname [raw on|off] [hex on|off]
[file name]
# 显示eeprom中信息
ethtool -e|--eeprom-dump devname [raw on|off] [offset N]
[length N]
# 更改eeprom中信息
ethtool -E|--change-eeprom devname [magic N] [offset N]
[length N] [value N]
下面是实际输出:
onceday->~:# ethtool -i eth0
driver: virtio_net
version: 1.0.0
firmware-version:
expansion-rom-version:
bus-info: 0000:00:05.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no
driver
,网卡驱动的简短名字,不可以为空。version
,网卡驱动的版本。firmware-version
,网卡固件版本,可能为空。expansion-rom-version
,网卡扩展EPROM的版本,用于存储网卡的初始化代码。bus-info
,网卡的总线地址。supports-statistics
,网卡是否支持统计数据。supports-test
,网卡是否支持自身测试。supports-eeprom-access
,网卡是否支持访问EPROM。supports-register-dump
,网卡是否支持访问寄存器(能读取数据)。supports-priv-flags
,网卡是否支持私有的标志位。
如果网卡支持寄存器读取和eeprom,那么便可以输出更多信息了。
2.6 协议负载信息
参考文档:
一般使用下面两个命令:
# 获取协议负载和其他特性信息
ethtool [ FLAGS ] -k|--show-features|--show-offload DEVNAME
# 设置协议负载和其他特性信息
ethtool [ FLAGS ] -K|--features|--offload DEVNAME
FEATURE on|off ...
下面是一个输出情况:
onceday->~:# ethtool -k eth0
Features for eth0:
rx-checksumming: on
......
scatter-gather: on
tx-scatter-gather: on
tx-scatter-gather-fraglist: off [fixed]
......
tx-nocache-copy: off
loopback: off [fixed]
rx-fcs: off [fixed]
rx-all: off [fixed]
......
上面命令省略了很多输出,对于常见的一些特性,ethtool会对它们进行分类(缩进输出),更多的命令则没有进行分类,而是无缩进输出。
输出的信息中on
表示当前对应特性开启了,off
表示对应的特性没有开启。一般后面还会有一个中括号,里面放着一些额外的信息,如下:
fixed
,表示该特性是固定的,也就是当前on/off状态不可改变。request on
,表示该特性应该被打开,但是当前状态是关闭。request off
,表示该特性应该被关闭,但是当前状态是打开。- 空,表示该特性可自由开关。
ethtool内建的特性主要有以下这些种类:
rx on|off
,是否使能接收校验和检测。tx on|off
,是否使能发送校验和检测。sg on|off
,是否开启Scatter/gather I/O 技术,从多个缓冲区发送数据。tso on|off
,是否使能TCP segmentation offload,允许上层应用发送大型数据包,由网卡自动分段发送。ufo on|off
,是否使能UDP fragmentation offload。gso on|off
,是否使能generic segmentation offload,通用负载分段,在TCP协议基础上支持更多其他协议分段。lro on|off
,是否使能large receive offload。rxvlan on|off
,是否使能rx vlan加速,由硬件处理vlan tag。txvlan on|off
,是否使能tx vlan加速,由硬件处理vlan tag。ntuple on|off
,是否使能RX n-元组过滤功能。rxhash on|off
,是否使用RX hashing offload,用于提升网络吞吐量。
具体的特性信息是Linux内核中列出的,因此这些特性可在内核代码include/linux/netdev_features.h
头文件中查看。
const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
[NETIF_F_SG_BIT] = "tx-scatter-gather", /* Scatter/gather IO. */
[NETIF_F_IP_CSUM_BIT] = "tx-checksum-ipv4", /* Can checksum TCP/UDP over IPv4. */
[NETIF_F_HW_CSUM_BIT] = "tx-checksum-ip-generic", /* Can checksum all the packets. */
[NETIF_F_IPV6_CSUM_BIT] = "tx-checksum-ipv6", /* Can checksum TCP/UDP over IPV6 */
[NETIF_F_HIGHDMA_BIT] = "highdma", /* Can DMA to high memory. */
[NETIF_F_FRAGLIST_BIT] = "tx-scatter-gather-fraglist", /* Scatter/gather IO. */
[NETIF_F_HW_VLAN_CTAG_TX_BIT] = "tx-vlan-hw-insert", /* Transmit VLAN CTAG HW acceleration */
[NETIF_F_HW_VLAN_CTAG_RX_BIT] = "rx-vlan-hw-parse", /* Receive VLAN CTAG HW acceleration */
[NETIF_F_HW_VLAN_CTAG_FILTER_BIT] = "rx-vlan-filter", /* Receive filtering on VLAN CTAGs */
[NETIF_F_HW_VLAN_STAG_TX_BIT] = "tx-vlan-stag-hw-insert", /* Transmit VLAN STAG HW acceleration */
[NETIF_F_HW_VLAN_STAG_RX_BIT] = "rx-vlan-stag-hw-parse", /* Receive VLAN STAG HW acceleration */
[NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter", /* Receive filtering on VLAN STAGs */
[NETIF_F_VLAN_CHALLENGED_BIT] = "vlan-challenged", /* Device cannot handle VLAN packets */
[NETIF_F_GSO_BIT] = "tx-generic-segmentation", /* Enable software GSO. */
[NETIF_F_LLTX_BIT] = "tx-lockless", /* LockLess TX - deprecated. not use LLTX in new drivers*/
[NETIF_F_NETNS_LOCAL_BIT] = "netns-local", /* Does not change network namespaces */
[NETIF_F_GRO_BIT] = "rx-gro", /* Generic receive offload */
[NETIF_F_GRO_HW_BIT] = "rx-gro-hw", /* Hardware Generic receive offload */
[NETIF_F_LRO_BIT] = "rx-lro", /* large receive offload */
[NETIF_F_TSO_BIT] = "tx-tcp-segmentation", /* ... TCPv4 segmentation */
[NETIF_F_GSO_ROBUST_BIT] = "tx-gso-robust", /* ... ->SKB_GSO_DODGY */
[NETIF_F_TSO_ECN_BIT] = "tx-tcp-ecn-segmentation", /* ... TCP ECN support */
[NETIF_F_TSO_MANGLEID_BIT] = "tx-tcp-mangleid-segmentation", /* ... IPV4 ID mangling allowed */
[NETIF_F_TSO6_BIT] = "tx-tcp6-segmentation",/* ... TCPv6 segmentation */
[NETIF_F_FSO_BIT] = "tx-fcoe-segmentation", /* ... FCoE segmentation */
[NETIF_F_GSO_GRE_BIT] = "tx-gre-segmentation", /* ... GRE with TSO */
[NETIF_F_GSO_GRE_CSUM_BIT] = "tx-gre-csum-segmentation", /* ... GRE with csum with TSO */
[NETIF_F_GSO_IPXIP4_BIT] = "tx-ipxip4-segmentation", /* ... IP4 or IP6 over IP4 with TSO */
[NETIF_F_GSO_IPXIP6_BIT] = "tx-ipxip6-segmentation", /* ... IP4 or IP6 over IP6 with TSO */
[NETIF_F_GSO_UDP_TUNNEL_BIT] = "tx-udp_tnl-segmentation", /* ... UDP TUNNEL with TSO */
[NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT] = "tx-udp_tnl-csum-segmentation", /*UDP TUNNEL with TSO & CSUM */
[NETIF_F_GSO_PARTIAL_BIT] = "tx-gso-partial", /* ... Only segment inner-most L4
* in hardware and all other
* headers in software.
*/
[NETIF_F_GSO_TUNNEL_REMCSUM_BIT] = "tx-tunnel-remcsum-segmentation",/*TUNNEL with TSO & REMCSUM */
[NETIF_F_GSO_SCTP_BIT] = "tx-sctp-segmentation",/* ... SCTP fragmentation */
[NETIF_F_GSO_ESP_BIT] = "tx-esp-segmentation",/* ... ESP with TSO */
[NETIF_F_GSO_UDP_L4_BIT] = "tx-udp-segmentation",/* ... UDP payload GSO (not UFO) */
[NETIF_F_GSO_FRAGLIST_BIT] = "tx-gso-list",/* ... Fraglist GSO */
[NETIF_F_FCOE_CRC_BIT] = "tx-checksum-fcoe-crc", /* FCoE CRC32 */
[NETIF_F_SCTP_CRC_BIT] = "tx-checksum-sctp", /* SCTP checksum offload */
[NETIF_F_FCOE_MTU_BIT] = "fcoe-mtu", /* Supports max FCoE MTU, 2158 bytes*/
[NETIF_F_NTUPLE_BIT] = "rx-ntuple-filter", /* N-tuple filters supported */
[NETIF_F_RXHASH_BIT] = "rx-hashing", /* Receive hashing offload */
[NETIF_F_RXCSUM_BIT] = "rx-checksum", /* Receive checksumming offload */
[NETIF_F_NOCACHE_COPY_BIT] = "tx-nocache-copy", /* Use no-cache copyfromuser */
[NETIF_F_LOOPBACK_BIT] = "loopback", /* Enable loopback */
[NETIF_F_RXFCS_BIT] = "rx-fcs", /* Append FCS to skb pkt data */
[NETIF_F_RXALL_BIT] = "rx-all", /* Receive errored frames too */
[NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload", /* Allow L2 Forwarding in Hardware */
[NETIF_F_HW_TC_BIT] = "hw-tc-offload", /* Offload TC infrastructure */
[NETIF_F_HW_ESP_BIT] = "esp-hw-offload", /* Hardware ESP transformation offload */
[NETIF_F_HW_ESP_TX_CSUM_BIT] = "esp-tx-csum-hw-offload", /* ESP with TX checksum offload */
[NETIF_F_RX_UDP_TUNNEL_PORT_BIT] = "rx-udp_tunnel-port-offload",/* Offload of RX port for UDP tunnels */
[NETIF_F_HW_TLS_RECORD_BIT] = "tls-hw-record", /* Hardware TLS TX offload */
[NETIF_F_HW_TLS_TX_BIT] = "tls-hw-tx-offload", /* Hardware TLS RX offload */
[NETIF_F_HW_TLS_RX_BIT] = "tls-hw-rx-offload", /* Hardware Generic receive offload */
[NETIF_F_GRO_FRAGLIST_BIT] = "rx-gro-list", /* Offload TLS record */
[NETIF_F_HW_MACSEC_BIT] = "macsec-hw-offload", /* Offload MACsec operations */
[NETIF_F_GRO_UDP_FWD_BIT] = "rx-udp-gro-forwarding", /* Allow UDP GRO for forwarding */
[NETIF_F_HW_HSR_TAG_INS_BIT] = "hsr-tag-ins-offload", /* Offload HSR tag insertion */
[NETIF_F_HW_HSR_TAG_RM_BIT] = "hsr-tag-rm-offload", /* Offload HSR tag removal */
[NETIF_F_HW_HSR_FWD_BIT] = "hsr-fwd-offload", /* Offload HSR forwarding */
[NETIF_F_HW_HSR_DUP_BIT] = "hsr-dup-offload", /* Offload HSR duplication */
};
2.7 标识指定的接口
一般命令如下:
# Show permanent hardware address
ethtool [ FLAGS ] -P|--show-permaddr DEVNAME
# Show visible port identification (e.g. blinking)
ethtool [ FLAGS ] -p|--identify DEVNAME
[ TIME-IN-SECONDS ]
这两个命令可以标识对应的网卡设备,一般输出网卡的设备MAC地址:
onceday->~:# ethtool -P eth0
Permanent address: 00:15:5d:b1:43:e8
2.8 重新自动协商
使用下面命令重新开始自动协商:
# Restart N-WAY negotiation
ethtool [ FLAGS ] -r|--negotiate DEVNAME
2.9 展示统计信息
如下:
# Show adapter statistics
ethtool [ FLAGS ] -S|--statistics DEVNAME
[ --all-groups | --groups [eth-phy] [eth-mac] [eth-ctrl] [rmon] ]
# Show phy statistics
ethtool [ FLAGS ] --phy-statistics DEVNAME
网卡统计数据有很多,一些是标准的IEEE数据,一些是网卡标准的统计数据,还有一些是网卡设备特定的数据。
不同类型的网卡统计数据是不同的,这些数据取决于对应的网卡类型以及它们的驱动。
由于软件统计数据和硬件统计数据在设计上是在包处理链的不同时刻增加的,因此很有可能传入的数据包在被硬件统计之后,但在到达软件统计数据之前就被丢弃了(很可能是组播数据包),而在相反的方式中,在传输过程中,FCS字节被添加在中间,TSO skb将被分割,头字节被添加。因此,使用ifconfig(软件)和ethtool(硬件)从用户空间收集的统计数据不能进行比较。
实际的参数含义定义在内核网络驱动文件中,具体含义也要根据代码和文档确定,所以这里不再列出。
找到定义的方法很简单,在内核代码(文档)直接搜索broadcast_frames_received
这样的数据名称即可,这些数据名称都来自内核定义,比如mvpp2中定义了上面的数据。
一个实际的网卡接口可能有多种驱动,这个是存在的,因此输出的数据可能是不同驱动统计的数据,即来自于不同的硬件。
2.10 设置网卡参数
# Change generic options
ethtool [ FLAGS ] -s|--change DEVNAME
[ speed %d ]
[ lanes %d ]
[ duplex half|full ]
[ port tp|aui|bnc|mii|fibre|da ]
[ mdix auto|on|off ]
[ autoneg on|off ]
[ advertise %x[/%x] | mode on|off ... [--] ]
[ phyad %d ]
[ xcvr internal|external ]
[ wol %d[/%d] | p|u|m|b|a|g|s|f|d... ]
[ sopass %x:%x:%x:%x:%x:%x ]
[ msglvl %d[/%d] | type on|off ... [--] ]
参数的详细解析请参考:ethtool(8) - Linux manual page (man7.org)
2.11 设置网卡流分类规则
展示流分类的规则命令如下:
# Show Rx network flow classification options or rules
ethtool [ FLAGS ] -n|-u|--show-nfc|--show-ntuple DEVNAME
[ rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 [context %d] |
rule %d ]
下面是设置的命名:
# Configure Rx network flow classification options or rules
ethtool [ FLAGS ] -N|-U|--config-nfc|--config-ntuple DEVNAME
rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 m|v|t|s|d|f|n|r... [context %d] |
flow-type ether|ip4|tcp4|udp4|sctp4|ah4|esp4|ip6|tcp6|udp6|ah6|esp6|sctp6
[ src %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ]
[ dst %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ]
[ proto %d [m %x] ]
[ src-ip IP-ADDRESS [m IP-ADDRESS] ]
[ dst-ip IP-ADDRESS [m IP-ADDRESS] ]
[ tos %d [m %x] ]
[ tclass %d [m %x] ]
[ l4proto %d [m %x] ]
[ src-port %d [m %x] ]
[ dst-port %d [m %x] ]
[ spi %d [m %x] ]
[ vlan-etype %x [m %x] ]
[ vlan %x [m %x] ]
[ user-def %x [m %x] ]
[ dst-mac %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ]
[ action %d ] | [ vf %d queue %d ]
[ context %d ]
[ loc %d]] |
delete %d
参数的详细解析请参考:ethtool(8) - Linux manual page (man7.org)
2.12 其他类命令
还有一些其他的命令如下:
- 执行网卡自身测试,需要网卡支持
# Execute adapter self test
ethtool [ FLAGS ] -t|--test DEVNAME
[ online | offline | external_lb ]
- 打印网卡转储数据(dump data)
# Get dump flag, data
ethtool [ FLAGS ] -w|--get-dump DEVNAME
[ data FILENAME ]
# Set dump flag of the device
ethtool [ FLAGS ] -W|--set-dump DEVNAME
N
- 显示时钟采样信息
# Show time stamping capabilities
ethtool [ FLAGS ] -T|--show-time-stamping DEVNAME
-
显示接收流的哈希间接表,设置RSS哈希散列,将网卡的包散射到不同的接收队列中。
# Show Rx flow hash indirection table and/or RSS hash key
ethtool [ FLAGS ] -x|--show-rxfh-indir|--show-rxfh DEVNAME
[ context %d ]
# Set Rx flow hash indirection table and/or RSS hash key
ethtool [ FLAGS ] -X|--set-rxfh-indir|--rxfh DEVNAME
[ context %d|new ]
[ equal N | weight W0 W1 ... | default ]
[ hkey %x:%x:%x:%x:%x:.... ]
[ hfunc FUNC ]
[ delete ]
- 写入固件文件到网卡的存储空间
# Flash firmware image from the specified file to a region on the device
ethtool [ FLAGS ] -f|--flash DEVNAME
FILENAME [ REGION-NUMBER-TO-FLASH ]
- 查询网卡的通道数目(IRQ或者触发IRQ的某些集合)
# Query Channels
ethtool [ FLAGS ] -l|--show-channels DEVNAME
# Set Channels
ethtool [ FLAGS ] -L|--set-channels DEVNAME
[ rx N ]
[ tx N ]
[ other N ]
[ combined N ]
- 查询eeprom中的信息
# Query/Decode Module EEPROM information and optical diagnostics if available
ethtool [ FLAGS ] -m|--dump-module-eeprom|--module-info DEVNAME
[ raw on|off ]
[ hex on|off ]
[ offset N ]
[ length N ]
[ page N ]
[ bank N ]
[ i2c N ]
- 查询网卡设备的私有标志
# Query private flags
ethtool [ FLAGS ] --show-priv-flags DEVNAME
# Set private flags
ethtool [ FLAGS ] --set-priv-flags DEVNAME
FLAG on|off ...
- 查询设备是否支持
Energy-Efficient Ethernet
。
# Show EEE settings
ethtool [ FLAGS ] --show-eee DEVNAME
# Set EEE settings
ethtool [ FLAGS ] --set-eee DEVNAME
[ eee on|off ]
[ advertise %x ]
[ tx-lpi on|off ]
[ tx-timer %d ]
- 查看网卡(物理层)可调整参数
# Set PHY tunable
ethtool [ FLAGS ] --set-phy-tunable DEVNAME
[ downshift on|off [count N] ]
[ fast-link-down on|off [msecs N] ]
[ energy-detect-power-down on|off [msecs N] ]
# Get PHY tunable
ethtool [ FLAGS ] --get-phy-tunable DEVNAME
[ downshift ]
[ fast-link-down ]
[ energy-detect-power-down ]
# Get tunable
ethtool [ FLAGS ] --get-tunable DEVNAME
[ rx-copybreak ]
[ tx-copybreak ]
[ pfc-precention-tout ]
# Set tunable
ethtool [ FLAGS ] --set-tunable DEVNAME
[ rx-copybreak N]
[ tx-copybreak N]
[ pfc-precention-tout N]
- 重置网卡设备的组件状态,可以指定固定的组件
# Reset components
ethtool [ FLAGS ] --reset DEVNAME
[ flags %x ] [ mgmt ] [ mgmt-shared ] [ irq ]
[ irq-shared ] [ dma ] [ dma-shared ] [ filter ]
[ filter-shared ] [ offload ] [ offload-shared ]
[ mac ] [ mac-shared ] [ phy ] [ phy-shared ]
[ ram ] [ ram-shared ] [ ap ] [ ap-shared ]
[ dedicated ] [ all ]
- 查询网卡设备对转发错误校正的支持情况
# Show FEC settings
ethtool [ FLAGS ] --show-fec DEVNAME
# Set FEC settings
ethtool [ FLAGS ] --set-fec DEVNAME
[ encoding auto|off|rs|baser|llrs [...]]
- 执行有线电缆测试,需要网卡支持
# Perform a cable test
ethtool [ FLAGS ] --cable-test DEVNAME
# Print cable test time domain reflectrometery data
ethtool [ FLAGS ] --cable-test-tdr DEVNAME
[ first N ]
[ last N ]
[ step N ]
[ pair N ]
- 显示隧道相关的信息
# Show NIC tunnel offload information
ethtool [ FLAGS ] --show-tunnels DEVNAME
- 显示收发器模组的参数(transceiver module)
ethtool --show-module devname
ethtool --set-module devname [power-mode-policy high|auto]