专栏首页LINUX阅码场宋宝华:当Linux内核遭遇鲨鱼—kernelshark

宋宝华:当Linux内核遭遇鲨鱼—kernelshark

之前小弟一直在宣传推广火焰图,结果是很多童鞋凡事都用火焰图。说实话,火焰图特别适合分析运行时热点(无论是on-cpu、off-cpu、还是内存等,火焰图的想象力可以无穷放大),但是你要分析一个的如果是一个时序问题,比如系统启动的慢、一个软件启动的慢,用火焰图固然可能有一点帮助,但是帮助肯定很微妙。

因为这种某个过程慢的问题,是一个时序问题。不是一个运行时热点的问题,所以你最重要的是画出来你的这个过程的时序图。这里面说不定有I/O的牵绊,说不定就是狂占CPU,说不定谁傻不拉几地在sleep。

Linux界有一个杀手级分析Linux本身启动慢的工具,叫做bootchart,它其实把启动过程中进程的IO,CPU占用情况进行了描述。注意这类图都有一个共同特点,横轴是时间,纵轴是CPU、线程等的状态(运行、睡眠、IO什么的)。

bootchart确实有利于分析开机过程,但是你平时某个软件启动慢呢?或者更广泛地说,某个特定过程特别慢呢?或者更加更加广泛地说,我写的程序在系统里面是怎么在运行,几个线程怎么在跑?我们则要描绘出它的时序图。

这个时候,我们可以用perf的timechart,比如,下面我们写一个很简单的包含了2个线程周期循环做事情和睡眠的代码:

我们运行上面这个a.out,下面我们用perf录制系统的sched情况:

~$ sudo perf sched record -a
^C[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 1.909 MB perf.data (9039 samples) ]

接下来生成timechart:

~$ sudo perf timechart
Written 6.4 seconds of trace to output.svg.

我们用firefox打开这个时序图:

时序图上我们看到了我的8个CPU的运行情况,以及a.out中2个线程一会儿蓝色(running)一会灰色(sleeping)的情况。我们看到,系统差不多在用CPU2和CPU7跑我们a.out里面的2个占用CPU比较高线程。

不过,这类工具里面压轴的不是perf timechart,说实话,有点太粗糙了!我们来看看大名鼎鼎的内核鲨鱼——kernelshark。

下面我们用trace-cmd来录制sched相关的trace点:

~$ sudo trace-cmd record -e 'sched_wakeup*' -e sched_switch -e 'sched_migrate*'
Hit Ctrl^C to stop recording
^CCPU0 data recorded at offset=0x60e000
    61440 bytes in size
CPU1 data recorded at offset=0x61d000
    184320 bytes in size
CPU2 data recorded at offset=0x64a000
    24576 bytes in size
CPU3 data recorded at offset=0x650000
    12288 bytes in size
CPU4 data recorded at offset=0x653000
    12288 bytes in size
CPU5 data recorded at offset=0x656000
    86016 bytes in size
CPU6 data recorded at offset=0x66b000
    172032 bytes in size
CPU7 data recorded at offset=0x695000
    28672 bytes in size

用kernelshark来打开录制的点:

~$ kernelshark trace.dat
Loading  "trace.dat"

看到下面的图形界面:

我们可以在UI上面进行各种操作,比如我们关注a.out,我们就选择task:

我们得到这样的视图:

比如我图上画的那个点,a.out的颜色发生了变化,而下面的文字则表达了发生变化的原因是调度,调度的目标是swapper,这个调度点发生在CPU4上面:

如果你期待的是一个横轴是时间,纵轴是每个线程、CPU在某个时间段里面在干什么的图,kernelshark,你当然值得拥有。

本文分享自微信公众号 - Linux阅码场(LinuxDev),作者:宋宝华

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 揭开Wayland的面纱(二):Wayland应运而生

    话说在上篇(揭开Wayland的面纱(一):X Window的前生今世)中我介绍了一些X Window的历史及发展,还没有提到Wayland本身,不少人已经等不...

    Linux阅码场
  • Arachne: Core-Aware Thread Management

    本文基于OSDI-18收录的《Arachne: Core-Aware Thread Management》翻译整理而成。

    Linux阅码场
  • 用Linux内核的瑞士军刀-eBPF实现socket转发offload

    我们已经对eBPF将网络转发offload到XDP(eXpress Data Path)耳熟能详,作为Linux内核的一把 “瑞士军刀” ,eBPF能做的事情可...

    Linux阅码场
  • 2019-08-01easyMock 的使用

    用户4344670
  • PVOX-自定义函数readoutput分析

    “庖丁为文惠君解牛,手之所触,肩之所倚,足之所履,膝之所踦,砉然向然,奏刀騞然,莫不中音。合于《桑林》之舞,乃中《经首》之会”。

    matlab爱好者
  • 10分钟开发一个npm全局依赖包(下)

    在上一篇中我们用了10分钟实现了一个完整的古诗词命令行工具,本章中我们主要简绍2个命令行工具开发中常用的库,整个代码大概用时20分钟。

    kai666666
  • 微博爬虫综述、错误汇总、Q&A

    微博爬虫主要有两个导向,一个是微博内容的爬虫,其目的字段包括微博文本、发布者、转发/评论/点赞数等,另一个是微博评论的爬虫,其目的字段主要是评论文本和评论者。

    月小水长
  • 使用 Postman 调试 ASP.NET Core 开发的 API

    发布于 2018-09-09 12:38 更新于 2018-09...

    walterlv
  • Mybatis针对入门案例的设计模式分析 读取配置信息的方法 设计模式(后面补详细

    韦恩少爷的背
  • JVM中 对象的内存布局 以及 实例分析

    tomas家的小拨浪鼓

扫码关注云+社区

领取腾讯云代金券