IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

Erlang非业余研究 2011-04-01 13:34:18 累计浏览 1,957 次
本机暂存
    最近有同学反映在某些新机器上做性能调优的时候, 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前要睡觉的,唉!

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 由浅入深探究mysql索引结构原理、性能分析与优化 (累计阅读 16,523)
  2. Linux如何统计进程的CPU利用率 (累计阅读 16,308)
  3. 如何查找消耗资源较大的SQL (累计阅读 15,211)
  4. 我的 RHCA 之路 (累计阅读 14,013)
  5. Linux内存点滴 用户进程内存空间 (累计阅读 13,230)
  6. 给程序员新手的一些建议 (累计阅读 13,089)
  7. Linux 性能监控、测试、优化工具 (累计阅读 13,011)
  8. 关于linux内存free的一些事情 (累计阅读 12,867)
  9. ps - 按进程消耗内存多少排序 (累计阅读 12,688)
  10. Google怎么用linux (累计阅读 12,581)