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

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

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

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

分享:

  接收路径上的优化

  LRO (Large Receive Offload)

  Linux 在 2.6.24 中加入了支持 IPv4 TCP 协议的 LRO (Large Receive Offload) ,它通过将多个 TCP 数据聚合在一个 skb 结构,在稍后的某个时刻作为一个大数据包交付给上层的网络协议栈,以减少上层协议栈处理 skb 的开销,提高系统接收 TCP 数据包的能力。

  当然,这一切都需要网卡驱动程序支持。理解 LRO 的工作原理,需要理解 sk_buff 结构体对于负载的存储方式,在内核中,sk_buff 可以有三种方式保存真实的负载:

  1、数据被保存在 skb->data 指向的由 kmalloc 申请的内存缓冲区中,这个数据区通常被称为线性数据区,数据区长度由函数 skb_headlen 给出

  2、数据被保存在紧随 skb 线性数据区尾部的共享结构体 skb_shared_info 中的成员 frags 所表示的内存页面中,skb_frag_t 的数目由 nr_frags 给出,skb_frags_t 中有数据在内存页面中的偏移量和数据区的大小

  3、数据被保存于 skb_shared_info 中的成员 frag_list 所表示的 skb 分片队列中

  合并了多个 skb 的超级 skb,能够一次性通过网络协议栈,而不是多次,这对 CPU 负荷的减轻是显然的。

  LRO 的核心结构体如下:

  LRO 的核心结构体

/*
* Large Receive Offload (LRO) Manager
*
* Fields must be set by driver
*/

struct net_lro_mgr {
     struct net_device
*dev;
     struct net_lro_stats stats;

    
/* LRO features */
     unsigned
long features;
#define LRO_F_NAPI            
1  /* Pass packets to stack via NAPI */
#define LRO_F_EXTRACT_VLAN_ID
2  /* Set flag if VLAN IDs are extracted
                    from received packets
and eth protocol
                    
is still ETH_P_8021Q */

    
/*
    
* Set for generated SKBs that are not added to
    
* the frag list in fragmented mode
    
*/
     u32 ip_summed;
     u32 ip_summed_aggr;
/* Set in aggregated SKBs: CHECKSUM_UNNECESSARY
                
* or CHECKSUM_NONE */

    
int max_desc; /* Max number of LRO descriptors  */
    
int max_aggr; /* Max number of LRO packets to be aggregated */

    
int frag_align_pad; /* Padding required to properly align layer 3
                
* headers in generated skb when using frags */

     struct net_lro_desc
*lro_arr; /* Array of LRO descriptors */

    
/*
    
* Optimized driver functions
    
*
    
* get_skb_header: returns tcp and ip header for packet in SKB
    
*/
    
int (*get_skb_header)(struct sk_buff *skb, void **ip_hdr,
                  void
**tcpudp_hdr, u64 *hdr_flags, void *priv);

    
/* hdr_flags: */
#define LRO_IPV4
1 /* ip_hdr is IPv4 header */
#define LRO_TCP  
2 /* tcpudp_hdr is TCP header */

    
/*
    
* get_frag_header: returns mac, tcp and ip header for packet in SKB
    
*
    
* @hdr_flags: Indicate what kind of LRO has to be done
    
*             (IPv4/IPv6/TCP/UDP)
    
*/
    
int (*get_frag_header)(struct skb_frag_struct *frag, void **mac_hdr,
                   void
**ip_hdr, void **tcpudp_hdr, u64 *hdr_flags,
                   void
*priv);
};

100家互联网大公司java笔试题汇总,填问卷领取~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号