按照前文的介绍,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