- 论坛徽章:
- 0
|
近日,为了分析内核网络的性能消耗,作了一下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动些大手术了。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/47430/showart_1935962.html |
|