暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase 学习笔记113:如何通过 CPU 通用工具进行性能分析?

785

perf

perf 是一个 Linux 性能分析工具,提供了性能分析架构,应用程序可以利用 tracepoint 和内核计数器进行性能相关信息统计。利用这些信息可以帮助分析性能问题和定位性能瓶颈。

perf record

perf record 用来收集采样信息,并将其记录在数据文件中。

命令行形式:

perf record [-e <EVENT> | --event=EVENT] [-a] <command> [<options>]

参数说明:

  • EVENT 的取值如下:
    • u:表示用户空间触发的性能事件 。
    • k:表示内核态触发的性能事件。
    • h:表示管理程序产生的性能事件。
    • G:表示在 KVM 虚拟机下的客户机产生的性能事件。
    • H:表示在 KVM 虚拟机下的宿主机产生的性能事件。
  • -a:表示所有 CPU。
  • options 的取值如下:
    • -F:表示每秒的采样次数,取值范围为 [1,+∞),默认配置为 4000,推荐配置为 99。
    • -p:用于指定需要进行分析的进程 PID。
    • -g:表示用于记录的调用栈。
    • sleep:表示持续时间,单位为秒,取值范围为 [1,+∞)。

perf stat

perf stat 用于分析指定程序的性能概况。

命令行形式:

perf stat [-e <EVENT> | --event=EVENT] [-a] <command>

参数说明:

  • EVENT 的取值如下:
    • u:表示用户空间触发的性能事件 。
    • k:表示内核态触发的性能事件。
    • h:表示管理程序产生的性能事件。
    • G:表示在 KVM 虚拟机下的客户机产生的性能事件。
    • H:表示在 KVM 虚拟机下的宿主机产生的性能事件。
  • -a:表示所有 CPU。
  • 可选项:
    • -p :指定进程 ID。
    • -v:展示更多数据信息。
    • -r:求平均。
    • -C:从指定 CPU 上收集性能数据。

通过 perf stat -p 120228 命令显示进程 ID 为 120228 的程序的性能概况。示例如下:

$perf stat -p 120228
Performance counter stats for process id '120228':

    1212814.537787      task-clock (msec)         #   77.290 CPUs utilized            (100.00%)
        13,932,119      context-switches          #    0.011 M/sec                    (100.00%)
         4,504,797      cpu-migrations            #    0.004 M/sec                    (100.00%)
           709,321      page-faults               #    0.585 K/sec
 2,956,658,594,250      cycles                    #    2.438 GHz                      (100.00%)
   <not supported>      stalled-cycles-frontend
   <not supported>      stalled-cycles-backend
 2,397,178,336,412      instructions              #    0.81  insns per cycle          (100.00%)
   542,664,260,703      branches                  #  447.442 M/sec                    (100.00%)
     3,346,269,384      branch-misses             #    0.62% of all branches

      15.691803125 seconds time elapsed

字段说明:

  • task-clock:任务真正占用的处理器时间,单位为 ms。

  • context-switches : 上下文切换。

  • CPUs utilized:CPU 的占用率,CPUs utilized = task-clock / time elapsed。

  • cpu-migrations:处理器迁移次数,Linux 为了维持多个处理器的负载均衡,在特定条件下会将某个任务从一个 CPU 迁移到另一个 CPU。

  • page-faults:缺页异常的次数。

  • cycles:消耗的处理器周期数,CPU 周期是指 CPU 所能识别的最小时间单元。

  • instructions:执行了多少条指令。

  • insns per cycle:平均每个 cpu cycle 执行了多少条指令。

  • branches:遇到的分支指令数。

  • branch-misses:预测错误的分支指令数。

  • time elapsed :命令执行时长。

perf list

perf list 用来查看 perf 所支持的性能事件。

命令行形式:

perf list [hw | sw | cache | tracepoint | event_glob]

参数说明:

  • hw:表示 PMU 部件产生硬件事件。

  • sw:表示内核产生的事件。

  • cache:表示 CPU 各级 cache 产生的事件。

  • tracepoint:表示基于内核的 ftrace,是内核中静态 tracepoint 所触发的事件。

  • event_glob:表示其他事件。

perf top

perf top 用来指定性能事件(默认是 CPU 周期),显示消耗最多的函数或指令。主要用于实时分析各个函数在某个性能事件上的热度,能够快速定位热点函数,包括应用程序函数、模块函数与内核函数,甚至能够定位到热点指令。

命令行形式:

perf top [-e <EVENT> | --event=EVENT] [<options>]

参数说明:

  • EVENT 的取值如下:

    • u:表示用户空间触发的性能事件 。
    • k:表示内核态触发的性能事件。
    • h:表示管理程序产生的性能事件。
    • G:表示在 KVM 虚拟机下的客户机产生的性能事件。
    • H:表示在 KVM 虚拟机下的宿主机产生的性能事件。
  • options 的取值如下:

    • -p :指定进程 ID。
    • -K:不显示属于内核或模块的符号。
    • -U:不显示属于用户态程序的符号。
    • -d :界面的刷新周期,默认为 2 s,因为 perf top 默认每 2 s 从 mmap 的内存区域读取一次性能数据。
    • -G:得到函数的调用关系图。
    • --call-graph:dwarf 栈回溯所需的全部信息(需要编译时附加了调试信息 -g )。

通过 perf top 命令显示指定性能事件中消耗最多的函数或指令。示例如下:

$perf top
Samples: 366K of event 'cycles', Event count (approx.): 23340587417
Overhead  Shared Object       Symbol
  10.40%  [vdso]              [.] __vdso_gettimeofday
   4.70%  observer            [.] oceanbase::storage::ObPartitionGroupIterator::get_next
   4.23%  observer            [.] oceanbase::common::ObLatch::unlock
   4.02%  observer            [.] oceanbase::common::ObLatch::rdlock
   3.08%  observer            [.] oceanbase::common::ObLatch::wrlock
   2.26%  observer            [.] oceanbase::common::ObLinearHashMap<oceanbase::clog::ObPartitionLogInfo, oceanbase::clog::ObLogCursorExt, ocea
   1.97%  observer            [.] oceanbase::memtable::ObLockWaitMgr::check_timeout
   1.82%  observer            [.] oceanbase::common::hash::ObPreAllocLinkHashMap<oceanbase::storage::ObITable::TableKey, oceanbase::storage::Ob
   1.68%  observer            [.] oceanbase::omt::ObThWorker::worker

字段说明:

  • Overhead:符号引发的性能事件的比例,默认指占用的 CPU 周期比例。

  • Shared Object:符号所在的 DSO ( Dynamic Shared Object ),可以是应用程序、内核、动态链接库、模块。

  • Symbol:DSO 的类型及符号名。对于 DSO 的类型:[ . ] 表示此符号属于用户态的 ELF 文件,包括可执行文件与动态链接库。[ k ] 表述此符号属于内核或模块。对于符号名:有些符号不能解析为函数名,只能用地址表示。

vmstat

vmstat 是 Virtual Meomory Statistics 的缩写,可以对操作系统的虚拟内存、进程、CPU 活动进行监控。

命令行形式:

vmstat [-a] [delay [count]] [<options>]

参数说明:

  • -a:显示活跃和非活跃内存 。

  • delay :表示刷新一次的时间间隔。

  • count:表示刷新次数。

  • options:表示其他可查看的性能指标。

通过 vmstat 10 2 命令显示操作系统的虚拟内存、进程、CPU 活动。示例如下:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
28  0      0 415902272 283432 201305696    0    0   387  1054    0    0 19  3 78  0  0
38  0      0 415039424 283432 201309824    0    0 907308 1009947 211462 242965 31  2 67  0  0

第一次的值是当前的系统值,第二次的值是 10 s 内的平均值。

字段说明:

  • Procs

    • r:表示运行和等待 CPU 时间片的进程数。
    • b:表示等待资源的进程数。如 I/O 进程。

说明

每个 CPU 核有一个运行时队列,在 CPU 为进程提供服务时,进程需要首先进入运行时队列等待 CPU 分配 CPU 时间。运行队列里包括:runnable process 和 blocked process。

  • Memory

    • swpd:切换到 swap 的内存数量,单位 KB。
    • free:空闲物理内存。
    • buff:缓存的内存。一般块设备的读写缓存。
    • cache:内存缓存,频繁访问的文件会被 cached,如果 cached 值较大,说明 cached 的数量多,对于磁盘访问会相对较少。文件系统效率提高。
    • inact:非活跃内存大小,带 -a 可选项时显示。
    • active:活跃内存大小,带 -a 可选项时显示。
  • Swap

    • si: 从磁盘调入内存,内存进入内存交换区的数量。
    • so: 从内存调入磁盘,内存交换区进入内存的数据。

如果这两项都大于 0,需要关注,表示系统内存不足。

  • io

    • bi:每秒读磁盘块的速度。
    • bo:每秒写磁盘块的速度。

跟进磁盘的指标,并参考 I/O 等待占用 CPU 时间百分比评估系统 IO 性能瓶颈。

  • System

    • in: 每秒中断数。
    • cs: 每秒上下文切换次数。

这两个值越大,说明内存消耗 CPU 的时间越多,正常情况下上下文切换的次数应该小于时钟中断的次数, 如果发现上下文切换次数比时钟中断次数多,这种负载可能是由系统需要处理很多 I/O 或者长时间高强度系统调用引起。

  • CPU

    • us:用户进程 CPU 时间消耗百分比。
    • sy:内核进程 CPU 消耗百分比。
    • id:空闲 CPU 百分比。
    • wa:I/O 等待占用 CPU 时间百分比。
    • st:虚拟机占用时间。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论