oprofile抓不到采样数据问题和解决方法
April 1st, 2011
原创文章,转载请注明: 转载自系统技术非业余研究
本文链接地址: oprofile抓不到采样数据问题和解决方法
最近有同学反映在某些新机器上做性能调优的时候, oprofile 有时抓不到数据,我之前也遇到这个情况,很是无语,今天特地验证了下。
# 我们的操作系统和机器配置大概是这样的: $sudo aspersa/summary # Aspersa System Summary Report ############################## Date | 2011-03-31 16:26:05 UTC (local TZ: CST +0800) Hostname | my031226.sqa.cm4 Uptime | 10:00, 4 users, load average: 0.00, 0.78, 5.29 System | Huawei Technologies Co., Ltd.; Tecal RH2285; vV100R001 (Main Server Chassis) Service Tag | 2102317716N0AA000062 Release | Red Hat Enterprise Linux Server release 5.4 (Tikanga) Kernel | 2.6.18-164.el5 Architecture | CPU = 64-bit, OS = 64-bit Threading | NPTL 2.5 Compiler | GNU CC version 4.1.2 20080704 (Red Hat 4.1.2-44). SELinux | Disabled # Processor ################################################## Processors | physical = 2, cores = 12, virtual = 24, hyperthreading = yes Speeds | 24x2400.151 Models | 24xIntel(R) Xeon(R) CPU X5670 @ 2.93GHz Caches | 24x12288 KB .. $sudo rm -f /root/.oprofile/daemonrc $sudo opcontrol --setup --no-vmlinux $sudo opcontrol --init $sudo opcontrol --reset $sudo opcontrol --start Using 2.6+ OProfile kernel interface. Using log file /var/lib/oprofile/samples/oprofiled.log Daemon started. Profiler running. $sudo opcontrol --status Daemon running: pid 9253 Separate options: none vmlinux file: none Image filter: none Call-graph depth: 0 #这里喝杯茶,让子弹飞一会儿 $sudo opcontrol --shutdown Stopping profiling. Killing daemon. $opreport opreport error: No sample file found: try running opcontrol --dump or specify a session containing sample files $tree /var/lib/oprofile/samples/current/ /var/lib/oprofile/samples/current/ 0 directories, 0 files
确实是没抓到sample文件!
经过无数次的分析和判断,再加上goolge大神的帮助,找到问题的根源了:
$dmesg|grep oprofile oprofile: using NMI timer interrupt. #如果你的CPU不被oprofile认识,或者说认识有问题,oprofile就会进入 timer interrupt模式 #表现就是 $ophelp Using timer interrupt. $sudo opcontrol --setup -e CPU_CLK_UNHALTED:6000:0:0:1 You cannot specify any performance counter events because OProfile is in timer mode.
如果你看到上面的字,对不起你肯定抓不到数据的,解决方案是这样的:
在oprofile模块加载的时候强制使用 timer=1.
$sudo opcontrol --deinit Daemon not running Unloading oprofile module $sudo modprobe oprofile timer=1 $dmesg|grep oprofile|tail -n 1 oprofile: using timer interrupt.
如果你看到上面的字说明你成功了。
我们再试验下:
$sudo opcontrol --init && sudo opcontrol --reset && sudo opcontrol --start Using 2.6+ OProfile kernel interface. Using log file /var/lib/oprofile/samples/oprofiled.log Daemon started. Profiler running. #这里可以再喝杯咖啡,让子弹飞一会儿 $sudo opcontrol --shutdown Stopping profiling. Killing daemon. $opreport CPU: CPU with timer interrupt, speed 0 MHz (estimated) Profiling through timer interrupt TIMER:0| samples| %| ------------------ 719496 46.1320 no-vmlinux 432567 27.7349 ha_innodb_plugin.so.0.0.0 293343 18.8083 libc-2.5.so 111575 7.1539 mysqld 959 0.0615 perl 873 0.0560 libpthread-2.5.so 205 0.0131 oprofiled 188 0.0121 libmysqlclient.so.16.0.0 181 0.0116 ld-2.5.so 145 0.0093 bash 23 0.0015 libproc-3.2.7.so 16 0.0010 libnss_files-2.5.so 16 0.0010 libperl.so 11 7.1e-04 mysql 9 5.8e-04 ps 8 5.1e-04 gawk 8 5.1e-04 grep 5 3.2e-04 libm-2.5.so 3 1.9e-04 libcrypto.so.0.9.8e 3 1.9e-04 pkg-config 2 1.3e-04 libdl-2.5.so 2 1.3e-04 dircolors 2 1.3e-04 sshd 1 6.4e-05 ksh93 1 6.4e-05 more 1 6.4e-05 libselinux.so.1 1 6.4e-05 du 1 6.4e-05 sudo 1 6.4e-05 wc 1 6.4e-05 libnetsnmp.so.10.0.3 ... $tree current/ current/ |-- {kern} | `-- no-vmlinux | `-- {dep} | `-- {kern} | `-- no-vmlinux | `-- TIMER.0.0.all.all.all `-- {root} |-- bin ... 196 directories, 30 files
收工,回家睡觉,困了! 项目要用oprofile,本来我12:00前要睡觉的,唉!
玩得开心!
Post Footer automatically generated by wp-posturl plugin for wordpress.
再一次围观了整个追查过程,真给力
上几天正要问你这个问题!!你旺旺不在线。哈哈~现在解决了。
Yu Feng Reply:
May 20th, 2011 at 7:14 pm
我们也是扰自己的痒!
CPU比较新,操作系统版本比较旧就会这样。oprofile有一部分和CPU有关的代码在内核代码里面,不在oprofile包里面。
Timer interupt的模式真没啥用, 呵呵
Yu Feng Reply:
November 18th, 2011 at 11:47 am
为啥呢
晚上有台机器抓不到,E5620的cpu。按上面方案,解决。
Yu Feng Reply:
April 27th, 2012 at 3:48 pm
cool!
如果仅仅是timer interrupt模式,那其实google perf tool已经够用了,用oprofile一般想用performance counter,霸爷有在E5620上用oprofile关注cpu cache命中率的经验么?求指导,我使用–event=L2_LINES_IN:1000这个参数总是没有任何输出。
Yu Feng Reply:
July 3rd, 2012 at 10:25 am
目前我用perf工具。
guping Reply:
July 3rd, 2012 at 5:00 pm
perf工具,是开源工具么?可以补充一些细节么?
另外关于performance count的问题,我上午在2.6.32内核和oprofile0.9.7上试了试,可以使用。
gouihk Reply:
December 18th, 2014 at 8:59 pm
oprofile的功能和perf类似,但感觉perf更方便一些。除了使用上的方便之外,不知道这两者有什么区别?
—————–
1,环境:
ubuntu 14.04 下,虚拟机。
lawrence@ubuntu:~$ opcontrol –version
opcontrol: oprofile 0.9.9 compiled on Apr 4 2014 23:34:07
—————–
2,执行:
sudo opcontrol –start
—————–
3,报错:
Cannot find event CPU_CLK_UNHALTED
Using default event: CPU_CLK_UNHALTED:100000:0:1:1
Cannot find event CPU_CLK_UNHALTED
—————–
4,求助:
a,opcontrol -l 没有 CPU_CLK_UNHALTED这个事件。
猜想:是否是我安装的oprofile版本不对还是其他问题?
b,是否建议安装到哪个版本以上?
Yufeng大神, 你好。
我在两台机器上使用了oprofile,其中一台8核Intel(R) Xeon(R) CPU E5520 @2.27GHz的机器,
出现了你帖子里面的问题,另外一台其他CPU的机器没有出现这个问题。
按照你描述的步骤,我执行了 sudo modprobe oprofile timer=1
下面引用您的原文:
—————————————————–
view sourceprint?$sudo opcontrol –deinit
Daemon not running
Unloading oprofile module
$sudo modprobe oprofile timer=1
$dmesg|grep oprofile|tail -n 1
oprofile: using timer interrupt.
如果你看到上面的字说明你成功了。
—————————————————-
dmesg|grep oprofile
[359339.897702] oprofile: using timer interrupt.
$sudo opcontrol –init
还是报错
You cannot specify any performance counter events
because OProfile is in timer mode.
而且,现在执行 sudo opcontrol –deinit 也报错
You cannot specify any performance counter events
because OProfile is in timer mode.
onlyforcloud Reply:
August 3rd, 2015 at 4:15 pm
不好意思,已解决。
报错的原因是 /root/.profile/daemon 那个配置文件已存在(处理方式是备份或删除)。
另外,不要反复init,这也是我造成多个daemon配置文件的原因。
注意顺序。
顺序应该是 modprobe, start ,shutdown, opreport。不要init