怎么用脚本获取网卡缓冲区

wen 实用脚本 2

本文目录导读:

怎么用脚本获取网卡缓冲区

  1. Linux 系统
  2. Windows 系统(PowerShell)
  3. macOS 系统
  4. 总结对比表

获取网卡缓冲区(通常指接收/发送队列深度、环形缓冲区大小等)主要取决于操作系统,可以使用脚本(Bash、PowerShell)或调用系统命令来实现。

以下是针对 LinuxWindows 的常用脚本方法。


Linux 系统

在 Linux 中,网卡缓冲区的概念通常指 Ring Buffer(环形缓冲区)的大小,主要参数是 rx(接收)和 tx(发送)的值。

使用 ethtool(最常用)

ethtool 是标准工具,可以直接获取和设置缓冲区大小。

脚本示例(Bash)

#!/bin/bash
# 获取所有网卡名称(排除 lo)
interfaces=$(ls /sys/class/net/ | grep -v lo)
for iface in $interfaces; do
    # 尝试获取 Ring Buffer 参数
    if ethtool -g "$iface" 2>/dev/null; then
        echo "=== $iface ==="
        # 解析出当前值(提取 Pre-set 或 Current 下的 RX/TX)
        # 以下命令获取当前的 RX 最大值和当前值
        rx_current=$(ethtool -g "$iface" 2>/dev/null | grep "RX:" | head -1 | awk '{print $2}')
        tx_current=$(ethtool -g "$iface" 2>/dev/null | grep "TX:" | head -1 | awk '{print $2}')
        echo "  RX Buffer Current: $rx_current"
        echo "  TX Buffer Current: $tx_current"
    else
        echo "Cannot get ring buffer for $iface"
    fi
done

注意

  • ethtool -g 输出包含 Pre-set maximums(硬件支持的最大值)和 Current hardware settings(当前值)。
  • 少数虚拟网卡或驱动不支持该命令,会报错。

查看 /sys/class/net/*/ 下的参数(仅当驱动程序暴露了该属性)

某些驱动会将 ring buffer 大小暴露为 sysfs 属性。

脚本示例

#!/bin/bash
for iface in /sys/class/net/*; do
    name=$(basename "$iface")
    [ "$name" = "lo" ] && continue
    rx_path="$iface/device/net/$name/ring_rx"
    tx_path="$iface/device/net/$name/ring_tx"
    if [ -f "$rx_path" ]; then
        echo "$name RX: $(cat $rx_path)"
    fi
    if [ -f "$tx_path" ]; then
        echo "$name TX: $(cat $tx_path)"
    fi
done

说明:这种方式不是标准做法,只有部分驱动(如 igbixgbe)支持,不推荐作为通用方案。


Windows 系统(PowerShell)

Windows 中网卡缓冲区参数通常称为 Receive BuffersTransmit Buffers,可以通过 Get-NetAdapterAdvancedProperty 获取。

使用 Get-NetAdapterAdvancedProperty

# 获取所有物理网卡的接收/发送缓冲区
Get-NetAdapterAdvancedProperty -Name "*" -RegistryKeyword "*Buffer*" | Where-Object {
    $_.DisplayName -match "Receive Buffers|Transmit Buffers|Rx Buffers|Tx Buffers"
} | Select-Object Name, DisplayName, DisplayValue, Value

输出示例

Name     DisplayName        DisplayValue Value
----     -----------        ------------ -----
Ethernet Receive Buffers       512       512
Ethernet Transmit Buffers      256       256

注意

  • DisplayValue 是当前值,Value 是原始数值。
  • 不是所有网卡都使用“Buffer”作为关键词,可能需要调整 -RegistryKeyword

使用 Get-NetAdapterAdvancedProperty 列出所有属性(手动筛选)

Get-NetAdapterAdvancedProperty -Name "你的网卡名" | Format-Table Name, DisplayName, DisplayValue

然后通过观察 DisplayName 找到缓冲区选项,再提取数值。


macOS 系统

macOS 对网卡底层参数暴露较少,部分信息可以通过 sysctl 获得,但 Ring Buffer 大小通常无法直接获取

参考命令(只能查到驱动级参数,非缓冲区大小):

sysctl net.inet.tcp.sendspace  # TCP 发送缓冲区
sysctl net.inet.tcp.recvspace  # TCP 接收缓冲区
sysctl net.link.generic.system.ifq_maxlen  # 接口队列最大长度

这些是协议栈缓冲,不是硬件环形缓冲区。


总结对比表

系统 主要方法 权限
Linux ethtool -g <iface> root/普通用户 硬件 ring buffer 当前值
Linux /sys/class/net/*/... 普通用户(可能有权限问题) 部分驱动私有属性
Windows Get-NetAdapterAdvancedProperty 管理员 驱动缓冲区设置(软件)
macOS 无标准方法 仅协议栈参数

如果你需要修改缓冲区大小,Linux 使用 ethtool -G,Windows 使用 Set-NetAdapterAdvancedProperty(需要管理员权限,且网卡驱动支持)。

抱歉,评论功能暂时关闭!