ethtool -s 不提供 dma 映射错误计数器,因其属于内核内存或 iommu 层异常,早于网卡驱动统计;应通过 dmesg 查 iommu/dma/fault 日志,并结合 memtester、edac-util 验证内存健康。

Linux 中 ethtool -S 本身不直接提供“DMA映射错误”这一计数器,因为标准网卡驱动(如 ixgbe、i40e、mlx5_core)通常不将底层 DMA 映射失败(如 IOMMU 页表错误、地址不可达、TLB miss 异常等)暴露为可读的 ethtool 统计项。这类错误往往触发内核日志(dmesg)或硬件特定寄存器告警,而非用户空间统计字段。
为什么 ethtool -S 一般查不到 DMA 映射错误
ethtool 的 -S 输出是驱动主动导出的软/硬件计数器,聚焦于常见收发路径问题(如 rx_errors、tx_dma_failed、rx_desc_err 等)。真正的 DMA 映射失败(例如:dma_map_single() 返回 NULL、IOMMU fault、PCIe ATS 失败)属于内核内存子系统或 IOMMU 层异常,不会被网卡驱动计入 ethtool 统计——它发生在数据包到达网卡前,甚至早于驱动调用 dma_map_page()。
因此,试图用 ethtool -S eth0 | grep -i dma.*map 查找“DMA映射错误”大概率返回空结果,不是命令写错,而是该指标根本不存在于标准输出中。
真正有效的排查路径:从 dmesg 和 IOMMU 日志切入
内存故障(如坏内存条、ECC校验失败、DMA地址越界)引发的 DMA 映射异常,会在内核日志中留下明确痕迹。重点检查:
-
运行
dmesg -T | grep -i -E "(iommu|dma|pci|error|fault|uncorrectable|machine check)",关注带时间戳的硬件级报错; - 若启用 IOMMU(如 Intel VT-d 或 AMD-Vi),检查
dmesg是否出现IOMMU: Failed to map、DMAR:[fault]、DRHD: handling fault等关键字; - 搜索
MCE(Machine Check Exception)记录:dmesg | grep -i "mce\|machine check",结合mcelog或rasdaemon解析是否为内存模块物理故障; - 确认是否启用了 IOMMU:
cat /proc/cmdline | grep iommu(应含intel_iommu=on或amd_iommu=on);未启用时,DMA 错误可能静默丢包或触发 general protection fault,更难定位。
辅助验证:检查网卡驱动统计中的相关异常指标
虽然没有“DMA映射错误”,但某些驱动会导出与 DMA 操作稳定性强相关的计数器,可用 ethtool -S + grep 快速筛查:
-
Intel X710/XL710(i40e 驱动):关注
rx_dma_drop、tx_dma_drop、rx_desc_err、tx_desc_err; -
Intel 82599/ X520(ixgbe 驱动):检查
rx_discards、tx_aborted、tx_carrier_errors、rx_length_errors; -
Mellanox ConnectX-5/6(mlx5_core):查看
rx_wqe_err、tx_wqe_err、rx_out_of_buffer(可能暗示 DMA buffer 分配失败); - 执行命令示例:
ethtool -S eth0 | grep -E "(dma|desc|err|drop|wqe|buffer)" | grep -v "0$",过滤出非零异常值。
内存故障的交叉验证方法
若怀疑内存问题导致 DMA 映射失败,需脱离网卡单独验证:
- 运行内存压力测试:
memtester 4G 5(测试 4GB 内存,5 轮),或使用stress-ng --vm 2 --vm-bytes 2G -t 300s; - 检查 ECC 状态:
edac-util -v(需加载edac_mce_amd或sb_edac等模块),观察是否有CE(Correctable Error)或UE(Uncorrectable Error)计数上升; - 查看 BIOS/UEFI 日志或 IPMI SEL(
ipmitool sel list),部分服务器会记录内存模块温度、电压、校验失败事件; - 替换 DIMM 插槽或单条内存复测,确认是否与特定插槽/通道相关(常见于多通道内存配置下的信号完整性问题)。
不复杂但容易忽略:DMA 映射错误本质是内存子系统或 IOMMU 层的问题,不是网卡本身的统计项。抓日志比查 ethtool 更直接,而内存健康度必须独立验证。











