Home > Linux, 工具介绍, 调优 > oprofile抓不到采样数据问题和解决方法

oprofile抓不到采样数据问题和解决方法

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: 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.

Categories: Linux, 工具介绍, 调优 Tags: ,
  1. 丁奇
    April 1st, 2011 at 00:19 | #1

    再一次围观了整个追查过程,真给力

    [Reply]

  2. 武彻
    May 19th, 2011 at 22:15 | #2

    上几天正要问你这个问题!!你旺旺不在线。哈哈~现在解决了。

    [Reply]

    Yu Feng Reply:

    我们也是扰自己的痒!

    [Reply]

  3. yalung929
    September 7th, 2011 at 15:35 | #3

    CPU比较新,操作系统版本比较旧就会这样。oprofile有一部分和CPU有关的代码在内核代码里面,不在oprofile包里面。

    [Reply]

  4. brianjcj
    November 17th, 2011 at 20:21 | #4

    Timer interupt的模式真没啥用, 呵呵

    [Reply]

    Yu Feng Reply:

    为啥呢

    [Reply]

  5. 之奇
    April 26th, 2012 at 22:52 | #5

    晚上有台机器抓不到,E5620的cpu。按上面方案,解决。

    [Reply]

    Yu Feng Reply:

    cool!

    [Reply]

  6. guping
    July 3rd, 2012 at 09:14 | #6

    如果仅仅是timer interrupt模式,那其实google perf tool已经够用了,用oprofile一般想用performance counter,霸爷有在E5620上用oprofile关注cpu cache命中率的经验么?求指导,我使用–event=L2_LINES_IN:1000这个参数总是没有任何输出。

    [Reply]

    Yu Feng Reply:

    目前我用perf工具。

    [Reply]

    guping Reply:

    perf工具,是开源工具么?可以补充一些细节么?
    另外关于performance count的问题,我上午在2.6.32内核和oprofile0.9.7上试了试,可以使用。

    [Reply]

    gouihk Reply:

    oprofile的功能和perf类似,但感觉perf更方便一些。除了使用上的方便之外,不知道这两者有什么区别?

  7. July 31st, 2015 at 15:41 | #7

    —————–
    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,是否建议安装到哪个版本以上?

    [Reply]

  8. August 3rd, 2015 at 15:27 | #8

    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.

    [Reply]

    onlyforcloud Reply:

    不好意思,已解决。
    报错的原因是 /root/.profile/daemon 那个配置文件已存在(处理方式是备份或删除)。
    另外,不要反复init,这也是我造成多个daemon配置文件的原因。
    注意顺序。
    顺序应该是 modprobe, start ,shutdown, opreport。不要init

    [Reply]

  1. December 25th, 2013 at 21:46 | #1