关闭

看Linux网管员如何进行网络性能优化

发表于:2011-1-04 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:赵军    来源:51Testing软件测试网采编

  熟悉老的 NAPI 接口实现的话,里面的字段 poll_list、state、weight、poll、dev、没什么好说的,gro_count 和 gro_list 会在后面讲述 GRO 时候会讲述。需要注意的是,与之前的 NAPI 实现的最大的区别是该结构体不再是 net_device 的一部分,事实上,现在希望网卡驱动自己单独分配与管理 napi 实例,通常将其放在了网卡驱动的私有信息,这样最主要的好处在于,如果驱动愿意,可以创建多个 napi_struct,因为现在越来越多的硬件已经开始支持多接收队列 (multiple receive queues),这样,多个 napi_struct 的实现使得多队列的使用也更加的有效。

  与最初的 NAPI 相比较,轮询函数的注册有些变化,现在使用的新接口是:

void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
            
int (*poll)(struct napi_struct *, int), int weight)

  熟悉老的 NAPI 接口的话,这个函数也没什么好说的。

  值得注意的是,前面的轮询 poll() 方法原型也开始需要一些小小的改变:

int (*poll)(struct napi_struct *napi, int budget);

  大部分 NAPI 相关的函数也需要改变之前的原型,下面是打开轮询功能的 API:

    void netif_rx_schedule(struct net_device *dev,
                           struct napi_struct
*napi);
    
/* ...or... */
    
int netif_rx_schedule_prep(struct net_device *dev,
                   struct napi_struct
*napi);
    void __netif_rx_schedule(struct net_device
*dev,
                        struct napi_struct
*napi);

  轮询功能的关闭则需要使用:

void netif_rx_complete(struct net_device *dev,
struct napi_struct
*napi);

  因为可能存在多个 napi_struct 的实例,要求每个实例能够独立的使能或者禁止,因此,需要驱动作者保证在网卡接口关闭时,禁止所有的 napi_struct 的实例。

  函数 netif_poll_enable() 和 netif_poll_disable() 不再需要,因为轮询管理不再和 net_device 直接管理,取而代之的是下面的两个函数:

void napi_enable(struct napi *napi);
void napi_disable(struct napi
*napi);

  发送路径上的优化

  TSO (TCP Segmentation Offload)

  TSO (TCP Segmentation Offload) 是一种利用网卡分割大数据包,减小 CPU 负荷的一种技术,也被叫做 LSO (Large segment offload) ,如果数据包的类型只能是 TCP,则被称之为 TSO,如果硬件支持 TSO 功能的话,也需要同时支持硬件的 TCP 校验计算和分散 - 聚集 (Scatter Gather) 功能。

  可以看到 TSO 的实现,需要一些基本条件,而这些其实是由软件和硬件结合起来完成的,对于硬件,具体说来,硬件能够对大的数据包进行分片,分片之后,还要能够对每个分片附着相关的头部。TSO 的支持主要有需要以下几步:

  1、如果网路适配器支持 TSO 功能,需要声明网卡的能力支持 TSO,这是通过以 NETIF_F_TSO 标志设置 net_device structure 的 features 字段来表明,例如,在 benet(drivers/net/benet/be_main.c) 网卡的驱动程序中,设置 NETIF_F_TSO 的代码如下:

  benet 网卡驱动声明支持 TSO 功能

   static void be_netdev_init(struct net_device *netdev)
{
     struct be_adapter
*adapter = netdev_priv(netdev);

     netdev
->features |= NETIF_F_SG | NETIF_F_HW_VLAN_RX | NETIF_F_TSO |
         NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_HW_CSUM |
         NETIF_F_GRO | NETIF_F_TSO6;

     netdev
->vlan_features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_HW_CSUM;

     netdev
->flags |= IFF_MULTICAST;

     adapter
->rx_csum = true;

    
/* Default settings for Rx and Tx flow control */
     adapter
->rx_fc = true;
     adapter
->tx_fc = true;

     netif_set_gso_max_size(netdev,
65535);

     BE_SET_NETDEV_OPS(netdev,
&be_netdev_ops);

     SET_ETHTOOL_OPS(netdev,
&be_ethtool_ops);

     netif_napi_add(netdev,
&adapter->rx_eq.napi, be_poll_rx,
         BE_NAPI_WEIGHT);
     netif_napi_add(netdev,
&adapter->tx_eq.napi, be_poll_tx_mcc,
         BE_NAPI_WEIGHT);

     netif_carrier_off(netdev);
     netif_stop_queue(netdev);
}

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号