linux学习中
分类: 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统计的机制。