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 |
但是,这种CPU处理周期的“均衡”,并没有提升系统的处理能力;反而有略微的下降。
另外,值得注意的是,ipt_do_table的效率实在是差劲!并且系统并没有配置nat规则,但是nat模块占用的处理周期也不容忽视。
看来,确实有必要对iptables/netfilter动些大手术了。