Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1308104
  • 博文数量: 254
  • 博客积分: 1586
  • 博客等级: 上尉
  • 技术积分: 2295
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-15 16:38
个人简介

linux学习中

文章分类

全部博文(254)

文章存档

2016年(6)

2015年(2)

2014年(74)

2013年(93)

2012年(12)

2011年(2)

2010年(51)

2009年(14)

分类: LINUX

2013-11-15 10:04:32

1   编译
CC=/home/rlu/aquila/Aquila_9.2.0.915/build/gcc-3.4.4-2.16.1/build_mips/bin/mips-linux-uclibc-gcc ./configure --host=mips-linux --with-linux=/home/rlu/aquila/Aquila_9.2.0.915/mips-linux-2.6.15  --with-kernel-support --prefix=/home/rlu/aquila/Aquila_9.2.0.915/apps/oprofile/poptimage


CC=/home/rlu/aquila/Aquila_9.2.0.915/build/gcc-3.4.4-2.16.1/build_mips/bin/mips-linux-uclibc-gcc AR=/home/rlu/aquila/Aquila_9.2.0.915/build/gcc-3.4.4-2.16.1/build_mips/bin/mips-linux-uclibc-ar ./configure --host=mips-linux --build=i686-linux --enable-install-libbfd --prefix=/home/rlu/aquila/Aquila_9.2.0.915/apps/oprofile/binutilsimg --enable-shared --disable-nls


CC=/home/rlu/aquila/Aquila_9.2.0.915/build/gcc-3.4.4-2.16.1/build_mips/bin/mips-linux-uclibc-gcc CXX=/home/rlu/aquila/Aquila_9.2.0.915/build/gcc-3.4.4-2.16.1/build_mips/bin/mips-linux-uclibc-g++ ./configure --host=mips-linux --build=i686-linux --with-kernel-support --with-linux=/home/rlu/aquila/Aquila_9.2.0.915/linux/kernels/mips-linux-2.6.31 --with-extra-libs=/home/rlu/aquila/Aquila_9.2.0.915/apps/oprofile/poptimage/lib --with-extra-includes=/home/rlu/aquila/Aquila_9.2.0.915/apps/oprofile/poptimage/include --with-binutils=/home/rlu/aquila/Aquila_9.2.0.915/apps/oprofile/binutilsimg --prefix=/home/rlu/aquila/Aquila_9.2.0.915/apps/oprofile/oprofileimage

编译oprofile需要C++的支持,所以编译链要打开C++的选项。

注意oprofile的编译选项,--with-extra-libs和--with-extra-includes都要指向popt的安装目录。--with-binutils要指向binutils的安装目录。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

对于arm, 它的编译过程和mips一样,不过--host=arm-openwrt-linux-gnueabi, 这个host的指定,我用的是编译链的前缀,也没问题。

可能在编译binutils时会遇到错误,上网查一下,取消某个Makefile的 +Werror这个选项即可。

同时,如上命令适用于oprofile-0.9.7, 如果用于opofile-0.9.8,有问题

---------------------------------------------------------------------------------------------------------------------------------------------------------------------


2  把libpopt.so.0和libbfd.so, opcontrol, ophelp, opreport传到板子上去。
3  mkdir -p /var/mips/24K, 然后把unit_masks和events传到板子上去,ophelp需要用到这两个文件
3  touch /etc/mtab   vi  nodev /dev/oprofile oprofilefs rw 0 0 写入/etc/mtab
4  mount -t oprofilefs nodev /dev/oprofile
5  export OPROFILE_EVENTS_DIR=/var/  告诉ophelp到/var目录下去找unit_masks和events文件
6  opcontrol --session-dir=/tmp/lib/oprofile   注意,因为我的文件系统是jffs2的,而网上说jffs2文件系统是不能用来保存oprofile文件的,所以我使用了/tmp, 这是个ramfs文件系统
7   opcontrol --init
8   opcontrol --vmlinux=/tmp/vmlinux
9   opcontrol --kernel-range=80060000,802dd020     这个地方非常重要,不要想当然的给地址,不然得到的结果会不正确,正确的方法是

range_start: range_info = `objdump -h $FILE_IMAGE 2>/dev/null | grep " .text "` ;  `echo $range_info | awk '{print $4}'`

range_end: `objdump -t $FILE_IMAGE 2>/dev/null | grep "_etext$" | awk '{ print $1 }'`


7  opcontrol --event CYCLES:200000:0:1:1
8  opcontrol --start
9  opcontrol --dump
9  opcontrol --stop
10  opreport --session-dir=/tmp/lib/oprofile -R / -l /var/a
     这里,如果我没有-R /,opreport会提示找不到/var/a,怀疑是不是因为/tmp这个文件系统是ramfs, mount上去的,所以要指定 -R /。
  因为opreport汇报symbol信息时,必须要有oprofile的取样信息,还要有原始的image,这个image必须是没有strip过的。
11  注意看 /root/.oprofile/daemonrc, 这里面有一些默认信息,你在opcontrol中未指定的,它就从这里面取。
oprofile在取样后,由opreport来显示结果, 它可以显示image在整个系统运行时的情况,还可以显示某个symbol在该image的情况

a.c

void function1(int number)
{
        int i = 0;
        int j = 0;
        for (i = 0; i < number; i++)
                j++;
}

int main()
{
        while(1) {
                function1(100000);
                function2(1000000);
                function3(10000000);
        }
}

如果oprofile的event为CYCLES, 则说明是cpu cycle到达某个值后的中断,按说运行时间应该是 func3=10*func2=100*func1, 我们取样的话,也应该有这样的效果,来看看oprofile是否准确

CPU: MIPS 24K, speed 676 MHz (estimated)
Counted CYCLES events (0-0 Cycles) with a unit mask of 0x00 (No unit mask) count 200000
samples  %        symbol name
61976    90.0670  function3
6211      9.0262  function2
624       0.9068  function1
可以看出,是严格的10倍关系,oprofile果然是个好东西。

再来看看整体image的CYCLE情况

    68811 96.4888 a
     1981  2.7778 vmlinux
      281  0.3940 ld-uClibc-0.9.28.so
       95  0.1332 busybox
       85  0.1192 libuClibc-0.9.28.so
       50  0.0701 oprofiled
        8  0.0112 ophelp
        4  0.0056 libgcc_s.so.1

a因为是死循环,所以它也占用了大量的cycle。

我们还可以查看kernel的信息

/var/mips/24K # opreport --session-dir=/tmp/lib/oprofile -R / -l /tmp/vmlinux -t 2
CPU: MIPS 24K, speed 676 MHz (estimated)
Counted CYCLES events (0-0 Cycles) with a unit mask of 0x00 (No unit mask) count 200000
samples  %        symbol name
786      39.6769  blast_icache32
144       7.2691  _einittext
93        4.6946  __handle_mm_fault
67        3.3821  r4k_wait
62        3.1297  blast_dcache32
50        2.5240  r4k_blast_dcache_page_dc32
47        2.3725  do_page_fault
43        2.1706  both_aligned

还可以看insmod加载的模块的信息
opreport --session-dir=/tmp/lib/oprofile -R / -p /lib/modules/2.6.15/net -l umac.ko
必须使用-p 来说明模块的位置。

samples  %        symbol name
799      11.7431  ath_tx_prepare
774      11.3757  ieee80211_encap_80211
604       8.8771  __ieee80211_encap
474       6.9665  ieee80211_find_txnode
423       6.2169  wlan_vap_send
402       5.9083  ath_tx_send
313       4.6002  ieee80211_complete_wbuf
311       4.5708  ath_netdev_hardstart
308       4.5267  ieee80211_update_stats
244       3.5861  ath_amsdu_send
244       3.5861  ieee80211_input
203       2.9835  osif_vap_hardstart_generic
170       2.4985  ieee80211_classify
142       2.0870  ath_net80211_rx
139       2.0429  ieee80211_deliver_data
138       2.0282  ieee80211_nawds_send_wbuf
136       1.9988  ieee80211_8023frm_amsdu_check
134       1.9694  osif_dev_xmit_queue

今天故意在lan--WLan转发路径上,加多了一些处理,无疑的,这会使CPU loading变高,
想看两点效果
1   能否从oprofile中得到是哪个地方让cpu loading 上去了
2   CPU loading和througput的关系。

LAN-----AP--------WLAN
AP的LAN口和wlan口是桥接起来的,使用chariot测试从LAN往WLAN跑下行吞吐量
测试两组结果
1   没有问题的版本
2   改小以太网驱动中的skb buffer head的预留给wlan头的空间,迫使wlan driver会重新拷贝一个skb以装入新的wlan头。





可以看出,明显版本2的cpu loading比1高。高在哪里呢?发现版本2的r4k_wait会少很多,证明cpu并不是闲着,在做事,
继续看,主要是在做both_aligned, 这个符号在memcpy.S中,就是用来拷贝的。
所以我们大致应该知道在driver中,会有很多拷贝出现。但不知道是哪个函数调用的,因为oprofile采样,它会采样到某个函数,
并不会管调用栈。

我们还可以看出,在cpu loading变高的情况下,througput只有很小的下降,所以粗略我认为,在cpu loading不高的情况下,
再做减小cpu loading的事情,并不会对througput有太大的提高。
但,因为cpu loading上升了,如果这个时候来个DBDC,也就是再跑一个双频的吞吐量,这个时候,吞吐量势必上不去了,因为
遇到了cpu 瓶颈了。

所以大致可以推测,如果想做DBDC等需要high cpu loading的吞吐量测试,减小单频cpu loading是必须的。
但如果本身单频cpu loading并不大,你还想大幅提高单频througput, 这个时候考虑减小cpu loading意义并不大。

以上分析还需要理论支持,cpu loading和吞吐量真是一对复杂的东西,希望可以定量的分析到。

PS,sar统计出来的cpu loading和oprofile统计出来的cpu loading并不一样,有时间要分析一下sar统计的机制。

lyl19的博客

阅读(1281) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~