Chinaunix首页 | 论坛 | 博客
  • 博客访问: 179605
  • 博文数量: 27
  • 博客积分: 2774
  • 博客等级: 少校
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-31 11:00
文章分类

全部博文(27)

文章存档

2011年(2)

2010年(5)

2009年(10)

2008年(3)

2007年(7)

分类: LINUX

2009-05-23 01:18:20

近日,为了分析内核网络的性能消耗,作了一下Oprofile的分析。
Oprofile的event设定为:
结果如下
CPU: Core Solo / Duo, speed 1596.01 MHz (estimated)
Counted CPU_CLK_UNHALTED events (Unhalted clock cycles) with a unit mask of 0x00 (Unhalted core cycles) count 10000
samples % image name app name symbol name
848681 32.83 e1000e.ko e1000e e1000_clean_rx_irq
654740 25.33 ip_tables.ko ip_tables ipt_do_table
223137 8.63 e1000e.ko e1000e e1000_xmit_frame
106128 4.11 e1000e.ko e1000e e1000_poll
86015 3.33 iptable_nat.ko iptable_nat nf_nat_fn
84797 3.28 nf_conntrack.ko nf_conntrack __nf_conntrack_find
79643 3.08 nf_conntrack.ko nf_conntrack nf_conntrack_in
52350 2.03 nf_nat.ko nf_nat nf_nat_packet
49252 1.91 iptable_nat.ko iptable_nat nf_nat_in
45392 1.76 e1000e.ko e1000e e1000_alloc_rx_buffers
36075 1.4 iptable_nat.ko iptable_nat nf_nat_out
34300 1.33 nf_conntrack.ko nf_conntrack __nf_ct_refresh_acct
30304 1.17 nf_conntrack_ipv4.ko nf_conntrack_ipv4 ipv4_conntrack_in
24109 0.93 nf_conntrack.ko nf_conntrack udp_packet
23888 0.92 nf_nat.ko nf_nat ip_nat_route_input
23064 0.89 nf_conntrack.ko nf_conntrack nf_conntrack_find_get
22386 0.87 nf_conntrack_ipv4.ko nf_conntrack_ipv4 ipv4_confirm
20662 0.8 nf_conntrack.ko nf_conntrack nf_ct_get_tuple
20175 0.78 nf_conntrack_ipv4.ko nf_conntrack_ipv4 ipv4_pkt_to_tuple
19657 0.76 nf_conntrack_ipv4.ko nf_conntrack_ipv4 ipv4_get_l4proto
16877 0.65 iptable_filter.ko iptable_filter ipt_hook
15896 0.61 nf_conntrack.ko nf_conntrack udp_error
15843 0.61 iptable_mangle.ko iptable_mangle .text
14749 0.57 nf_conntrack.ko nf_conntrack udp_pkt_to_tuple
13718 0.53 nf_conntrack_ipv4.ko nf_conntrack_ipv4 ipv4_conntrack_help
13583 0.53 nf_conntrack_ipv4.ko nf_conntrack_ipv4 ipv4_conntrack_defrag
7760 0.3 iptable_nat.ko iptable_nat nf_nat_adjust
912 0.04 e1000e.ko e1000e e1000e_update_stats
258 0.01 e1000e.ko e1000e e1000e_read_phy_reg_mdic
194 0.01 e1000e.ko e1000e e1000_get_hw_semaphore_82571
92 0 libc-2.6.1.so libc-2.6.1.so (no symbols)
72 0 ld-2.6.1.so ld-2.6.1.so (no symbols)
63 0 e1000e.ko e1000e e1000_check_mng_mode_generic
55 0 e1000e.ko e1000e e1000_intr_msi
53 0 e1000e.ko e1000e e1000_put_hw_semaphore_82571
35 0 bash bash (no symbols)
11 4.30E-004 gawk-3.1.5 gawk-3.1.5 (no symbols)
8 3.10E-004 oprofiled oprofiled (no symbols)
6 2.30E-004 e1000e.ko e1000e e1000_watchdog_task
3 1.20E-004 e1000e.ko e1000e e1000e_get_laa_state_82571
3 1.20E-004 e1000e.ko e1000e e1000e_read_phy_reg_m88
2 7.70E-005 e1000e.ko e1000e e1000_has_link
2 7.70E-005 e1000e.ko e1000e e1000e_phy_has_link_generic
2 7.70E-005 libncurses.so.5.6 libncurses.so.5.6 (no symbols)
1 3.90E-005 busybox busybox _fini
1 3.90E-005 busybox busybox eval4
1 3.90E-005 busybox busybox flush_block
1 3.90E-005 busybox busybox parse_params
1 3.90E-005 busybox busybox tee_main
1 3.90E-005 cron cron (no symbols)
1 3.90E-005 e1000e.ko e1000e e1000_update_itr
1 3.90E-005 e1000e.ko e1000e e1000_watchdog
1 3.90E-005 e1000e.ko e1000e e1000e_check_for_copper_link
1 3.90E-005 nf_nat.ko nf_nat nf_nat_setup_info
1 3.90E-005 rm rm (no symbols)

可见,e1000_clean_rx_irq占用了相对较长的CPU周期
主要分析原因是如下:因为测试的报文长度为64Byte,同时e1000e驱动的copybreak特性,会将小于特定大小的报文复制到新的skb中,便于CPU的cache命中。而这个默认的大小设定为256Byte。

再次测试如下,将copybreak修改为32,主要是为了避免在e1000_clean_rx_irq中的memcpy。
结果如下

CPU: Core Solo / Duo, speed 1596.01 MHz (estimated)
Counted CPU_CLK_UNHALTED events (Unhalted clock cycles) with a unit mask of 0x00 (Unhalted core cycles) count 10000
samples % image name app name symbol name
611613 32.22 ip_tables.ko ip_tables ipt_do_table
277127 14.6 e1000e.ko e1000e e1000_xmit_frame
224158 11.81 e1000e.ko e1000e e1000_clean_rx_irq
121322 6.39 e1000e.ko e1000e e1000_poll
80844 4.26 nf_conntrack.ko nf_conntrack __nf_conntrack_find
78043 4.11 nf_conntrack.ko nf_conntrack nf_conntrack_in
59422 3.13 iptable_nat.ko iptable_nat nf_nat_fn
44848 2.36 e1000e.ko e1000e e1000_alloc_rx_buffers
38246 2.01 nf_nat.ko nf_nat nf_nat_packet
32711 1.72 nf_conntrack.ko nf_conntrack __nf_ct_refresh_acct
32605 1.72 iptable_nat.ko iptable_nat nf_nat_out
30253 1.59 iptable_nat.ko iptable_nat nf_nat_in
28437 1.5 nf_conntrack_ipv4.ko nf_conntrack_ipv4 ipv4_conntrack_in
22895 1.21 nf_conntrack.ko nf_conntrack nf_conntrack_find_get
22718 1.2 nf_conntrack.ko nf_conntrack udp_packet
21866 1.15 nf_conntrack_ipv4.ko nf_conntrack_ipv4 ipv4_confirm
20938 1.1 nf_conntrack.ko nf_conntrack nf_ct_get_tuple
20372 1.07 nf_conntrack_ipv4.ko nf_conntrack_ipv4 ipv4_get_l4proto
19635 1.03 nf_conntrack_ipv4.ko nf_conntrack_ipv4 ipv4_pkt_to_tuple
18334 0.97 iptable_filter.ko iptable_filter ipt_hook
15866 0.84 nf_conntrack.ko nf_conntrack udp_error
14579 0.77 nf_conntrack.ko nf_conntrack udp_pkt_to_tuple
13716 0.72 nf_conntrack_ipv4.ko nf_conntrack_ipv4 ipv4_conntrack_defrag
13708 0.72 iptable_mangle.ko iptable_mangle .text
13625 0.72 nf_nat.ko nf_nat ip_nat_route_input
11912 0.63 nf_conntrack_ipv4.ko nf_conntrack_ipv4 ipv4_conntrack_help
6907 0.36 iptable_nat.ko iptable_nat nf_nat_adjust
967 0.05 e1000e.ko e1000e e1000e_update_stats
232 0.01 e1000e.ko e1000e e1000e_read_phy_reg_mdic
178 0.01 e1000e.ko e1000e e1000_get_hw_semaphore_82571
84 0 ld-2.6.1.so ld-2.6.1.so (no symbols)
83 0 libc-2.6.1.so libc-2.6.1.so (no symbols)
53 0 e1000e.ko e1000e e1000_intr_msi
49 0 e1000e.ko e1000e e1000_put_hw_semaphore_82571
44 0 e1000e.ko e1000e e1000_check_mng_mode_generic
43 0 bash bash (no symbols)
9 4.70E-004 gawk-3.1.5 gawk-3.1.5 (no symbols)
6 3.20E-004 e1000e.ko e1000e e1000_watchdog_task
6 3.20E-004 oprofiled oprofiled (no symbols)
4 2.10E-004 e1000e.ko e1000e e1000_watchdog
3 1.60E-004 e1000e.ko e1000e e1000_has_link
3 1.60E-004 libncurses.so.5.6 libncurses.so.5.6 (no symbols)
2 1.10E-004 e1000e.ko e1000e e1000e_phy_has_link_generic
2 1.10E-004 libm-2.6.1.so libm-2.6.1.so (no symbols)
1 5.30E-005 busybox busybox lbb_prepare
1 5.30E-005 busybox busybox parse_fstab_line
1 5.30E-005 busybox busybox sendMTFValues
1 5.30E-005 busybox busybox xzalloc
1 5.30E-005 cat cat (no symbols)
1 5.30E-005 e1000e.ko e1000e e1000_update_itr
1 5.30E-005 e1000e.ko e1000e e1000e_check_for_copper_link
1 5.30E-005 e1000e.ko e1000e e1000e_get_laa_state_82571
可见,e1000_clean_rx_irq的占用下降很大。
但是,这种CPU处理周期的“均衡”,并没有提升系统的处理能力;反而有略微的下降。

另外,值得注意的是,ipt_do_table的效率实在是差劲!并且系统并没有配置nat规则,但是nat模块占用的处理周期也不容忽视。

看来,确实有必要对iptables/netfilter动些大手术了。
阅读(3664) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-06-25 11:07:02

你好, 你的oprofile结果为何没看到kernel的函数,内核do_softirq、分配skb等也该耗很多cpu