X710网卡接收丢包

通过ethtool命令看到是rx_dropped一项有数值。

/ # ethtool -S eth0 | more
NIC statistics:
     rx_packets: 88037562
     tx_packets: 66028257
     rx_bytes: 7461153935
     tx_bytes: 5612351710
     rx_errors: 0
     tx_errors: 0
     rx_dropped: 372
     tx_dropped: 0
     collisions: 0
     rx_length_errors: 0
     rx_crc_errors: 0
     rx_unicast: 88037192
     tx_unicast: 66028258

查看i40e-2.11.29版本的代码,rx_dropped统计对应为rx_discards计数。

static const struct i40e_stats i40e_gstrings_stats[] = {
    I40E_PF_STAT("port.rx_bytes", stats.eth.rx_bytes),
    I40E_PF_STAT("port.tx_bytes", stats.eth.tx_bytes),
    ...
    I40E_PF_STAT("port.rx_dropped", stats.eth.rx_discards),

以下函数负责更新rx_discards统计数据,可见其由x710的寄存器GLV_RDPC中获取。

void i40e_update_eth_stats(struct i40e_vsi *vsi)
{
    int stat_idx = le16_to_cpu(vsi->info.stat_counter_idx);
    struct i40e_pf *pf = vsi->back;
    struct i40e_hw *hw = &pf->hw;
    struct i40e_eth_stats *oes;
    struct i40e_eth_stats *es;     /* device's eth stats */

    es = &vsi->eth_stats;
    oes = &vsi->eth_stats_offsets;

    /* Gather up the stats that the hw collects */
    i40e_stat_update32(hw, I40E_GLV_TEPC(stat_idx),
               vsi->stat_offsets_loaded,
               &oes->tx_errors, &es->tx_errors);
    i40e_stat_update32(hw, I40E_GLV_RDPC(stat_idx),
               vsi->stat_offsets_loaded,
               &oes->rx_discards, &es->rx_discards);

根据X710的手册,此寄存器表示由于没有可用的接收描述符而导致的丢包数量。

00000000000000000000000000000000000000000000

查看以下当前网卡的描述符数量,为512个。

/ # ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX:             4096
RX Mini:        0
RX Jumbo:       0
TX:             4096
Current hardware settings:
RX:             512
RX Mini:        0
RX Jumbo:       0
TX:             512

在文件i40e.h中,描述符的数量默认就是512个。

#define I40E_DEFAULT_NUM_DESCRIPTORS    512

文件i40e_ethtool.c中函数i40e_get_ringparam用于获取描述符信息。

static void i40e_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
{        
    struct i40e_netdev_priv *np = netdev_priv(netdev);
    struct i40e_pf *pf = np->vsi->back;
    struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];

    ring->rx_max_pending = I40E_MAX_NUM_DESCRIPTORS;
    ring->tx_max_pending = I40E_MAX_NUM_DESCRIPTORS;
    ring->rx_mini_max_pending = 0;
    ring->rx_jumbo_max_pending = 0;
    ring->rx_pending = vsi->rx_rings[0]->count;
    ring->tx_pending = vsi->tx_rings[0]->count;
    ring->rx_mini_pending = 0;
    ring->rx_jumbo_pending = 0;
}

以下不修改代码中的默认值,先通过ethtool将其修改成最大的4096个。

/ # ethtool -G eth0 rx 4096
/ #
/ # ethtool -G eth0 tx 4096

经过测试丢包数量有所减少,但是感觉还是要提高报文处理性能,尽快释放占用的描述符,才能完全不丢包。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页