pf_ring非DNA驱动cpu软中断利用率高现象与分析

1687阅读 0评论2012-12-25 lujian19861986
分类:

在前文《pf_ring透明工作模式(transparent_mode)原理》和《pf_ring quick_mode原理》文章中介绍了pf_ring的透明模式和快速模式的原理。

按照前文的介绍,transparent_mode=0,1,2时,包处理效率依次升高。笔者在压力测试时发现:开启quick_mode(insmod pf_ring.ko quick_mode=1)的情况下,transparent_mode=0和2时都会出现CPU软中断利用率过高的情况。

系统基本配置: redhat 6.1,  linux 2.6.32, cpu 24核, mem48G, intel 82599 10Gb NIC。
对于64字节的synflood攻击,
    场景1:transparent_mode=0时, 攻击量到达440wpps时,  前16个核CPU si和usr各占50%,后面的核由于没有软中断(没有队列),只有用户态的usr占50%左右
    场景2: transparent_mode=2时, 攻击量导到700wpps时, 前16个核中有4-6个核的cpu跑满,其中si最高的超过80%

经过实际验证, transparent_mode=2能够降低CPU内核态软中断的消耗。

但上面的场景2中,内核态的si消耗远超用户态cpu消耗,按照pf_ring用户手册的介绍,这种模式下系统绕过了很多的内核处理环节,本以为si会很低,但仔细分析一下代码,发现transparent_mode跳过的是内核协议栈处理部分,软中断处理的很多逻辑还是需要走的。

示意流程如下:
irq->interrupt_handler->raise_softirq:   上半部
netif_rx_action->ixgbe_poll:              下半部(软中断)

pf_ring的pf_ring_handle_skb的执行路径:

ixgbe_poll -> ixgbe_clean_rx_irq -> ixgbe_clean_rx_irq_bb -> pf_ring_handle_skb
                                 |                        |
                                 -> ixgbe_clean_rx_irq_ps ->

可以看到,软中断还是执行了比较长的路径。

通过perf的结果也能看到软中断中执行的函数的身影:

-------------------------------------------------------------------------------------------------------
   PerfTop:    8667 irqs/sec  kernel:15.3%  exact:  0.0% [1000Hz cycles],  (all, 24 CPUs)
-------------------------------------------------------------------------------------------------------

             samples  pcnt function                    DSO
             _______ _____ ___________________________ _____________

            75537.00 68.9% longest_match               libzip.so    
             4731.00  4.3% deflate_slow                libzip.so    
             3114.00  2.8% __GI_vfprintf               libc-2.12.so 
             2096.00  1.9% fill_window                 libzip.so    
             2032.00  1.9% reserve_memory              [pf_ring]    
             1704.00  1.6% intel_idle                  [kernel]     
             1674.00  1.5% _IO_default_xsputn_internal libc-2.12.so 
             1406.00  1.3% ixgbe_poll                  [ixgbe]      
             1328.00  1.2% _itoa_word                  libc-2.12.so 
              890.00  0.8% compress_block              libzip.so    
              824.00  0.8% net_rx_action               [kernel]     
              798.00  0.7% kfree                       [kernel]     
              668.00  0.6% __strchrnul                 libc-2.12.so 
              624.00  0.6% memcpy_c                    [kernel]     
              525.00  0.5% memcpy                      libc-2.12.so 
              524.00  0.5% kmem_cache_free             [kernel]     
              492.00  0.4% __intel_new_memcpy          libintlc.so.5
              459.00  0.4% tick_nohz_stop_sched_tick   [kernel]     
              411.00  0.4% irq_entries_start           [kernel]     
              404.00  0.4% getnstimeofday              [kernel]     
              344.00  0.3% skb_release_head_state      [kernel]     
              317.00  0.3% _int_malloc                 libc-2.12.so 
              305.00  0.3% _int_free                   libc-2.12.so 
上一篇:http get分包加大rt的例子
下一篇:Linux ubuntu PF_RING+libpcap 极速捕获千兆网数据包,不丢包