手把手教你用 strace 诊断问题

早些年,如果你知道有个 strace 命令,就很牛了,而现在大家基本都知道 strace 了,如果你遇到性能问题求助别人,十有八九会建议你用 strace 挂上去看看,不过当你挂上去了,看着满屏翻滚的字符,却十有八九看不出个所以然。本文通过一个简单的案例,向你展示一下在用 strace 诊断问题时的一些套路。 

如下真实案例,如有雷同,实属必然!让我们看一台高负载服务器的 top 结果:

top

技巧:运行 top 时,按「1」打开 CPU 列表,按「shift+p」以 CPU 排序。

在本例中大家很容易发现 CPU 主要是被若干个 PHP 进程占用了,同时 PHP 进程占用的比较多的内存,不过系统内存尚有结余,SWAP 也不严重,这并不是问题主因。

不过在 CPU 列表中能看到 CPU 主要消耗在内核态「sy」,而不是用户态「us」,和我们的经验不符。Linux 操作系统有很多用来跟踪程序行为的工具,内核态的函数调用跟踪用「strace」,用户态的函数调用跟踪用「ltrace」,所以这里我们应该用「strace」:


  1. shell> strace -p <PID>

不过如果直接用 strace 跟踪某个进程的话,那么等待你的往往是满屏翻滚的字符,想从这里看出问题的症结并不是一件容易的事情,好在 strace  可以按操作汇总时间:


  1. shell> strace -cp <PID>

通过「c」选项用来汇总各个操作的总耗时,运行后的结果大概如下图所示:

strace -cp

很明显,我们能看到 CPU 主要被 clone 操作消耗了,还可以单独跟踪一下 clone:


  1. shell> strace -T -e clone -p <PID>

通过「T」选项可以获取操作实际消耗的时间,通过「e」选项可以跟踪某个操作:

strace -T -e clone -p

很明显,一个 clone 操作需要几百毫秒,至于 clone 的含义,参考 man 文档:

clone() creates a new process, in a manner similar to fork(2). It is actually a library function layered on top of the underlying clone() system call, hereinafter referred to as sys_clone. A description of sys_clone is given towards the end of this page.

Unlike fork(2), these calls allow the child process to share parts of its execution context with the calling process, such as the memory space, the table of file descriptors, and the table of signal handlers. (Note that on this manual page, “calling process” normally corresponds to “parent process”. But see the description of CLONE_PARENT below.)

简单来说,就是创建一个新进程。那么在 PHP 里什么时候会出现此类系统调用呢?查询业务代码看到了 exec 函数,通过如下命令验证它确实会导致 clone 系统调用:


  1. shell> strace -eclone php -r 'exec("ls");'

最后再考大家一个题:如果我们用 strace 跟踪一个进程,输出结果很少,是不是说明进程很空闲?其实试试 ltrace,可能会发现别有洞天。记住有内核态和用户态之分。

本文来自合作伙伴“Linux中国”,原文发布日期:2015-10-21

时间: 2024-10-06 12:57:24

手把手教你用 strace 诊断问题的相关文章

手把手教您制作一个完整网站(内附教程)

手把手教您制作一个完整网站(内附教程) 1.搞个简单的策划先. 至少应该有一个大概的方向吧,先确定网站的类型,是地区门户.行业门户,还是下载.电影.论坛等等.然后基本确定网站的名称. 2.找一个合适的域名. 域名注册.com(国际域名)和.cn(国内域名)为宜,域名最好不要太长.且有一定的意义.容易记,现在好的域名已经不多了,你可灵活的使用数字.英文单词.拼音等的组合,在域名的前.后加上i.e.51.ok.hao.88.163等,可以灵活的组合出许多好的域名.域名注册信息查询 http://ww

手把手教你实现、部署和调用Web Service

手把手教你实现.部署和调用Web Service

手把手教你学习Flash视频教程

教程|视频教程 手把手教你学Dreamweaver MX 2004视频教程 Flash MX 2004实例视频教程 手把手教你学3D MAX 7.0中文版视频教程 手把手教你学Photoshop视频教程 手把手教你学Photoshop实例视频教程 金鹰电脑教程网:Flash MX 操作大全 [视频教程] 与单纯的图文教程相比,生动活泼的视频多媒体教程更容易吸引大家的注意,让学习过程更加轻松有趣. 这里推出的是金鹰工作室制作组精心制作的一系列从入门基础到高级应用的Flash制作的视频多媒体教程,和

手把手教你学Web Service

Well,各位观众,现在开始我的手把手交Visual Studio.net的第一课―-手把手教你学Web Service.有没有下一课还得看诸位看官的反应了!我们知道,在MS新一代战略.net中,Web Service占了一个相当次大的份量,为什么这样说那?那是因为Web Service 是未来编程的新 思路,他将编程由本机扩大到了Internet上,他通过一个proxy.dll就可以访问在Internet上 提供的Service,并且就像在本机上操作一样方便,其实,Web Service也可以

手把手教你绘制超逼真的积雪场景

  Step 1 在图片上新建图层.选择地面区域并用带点灰蓝色填充(#d6d8e3) Step 2 使用图层蒙版(如果懒的话可以直接用橡皮擦)把砖柱露出来,我们只需要积雪的区域. Step 3 大致调整下砖柱跟远方的山的形状,让场景更自然. Step 4 创建一个新图层并按住Shift键使用椭圆工具画出一个正圆. Step 5 创建新图层并用灰蓝色(#6d85ad)填充,剪贴蒙版至之前的圆内(按住ALT在两个图层中间点击或者使用CTRL+ALT+G). Step 6 使用柔圆画笔,用比之前更亮的

手把手教你改善界面交互动画

  本文将探究UI设计中动画效果的过度应用,通过对比早期的视觉设计,为UI动画的有效设计提供一些建议,另外附上实战案例,手把手教你改进文中案例的交互动画哟. 遗憾的是,这并非某个做作的反面案例--而是某个近期客户处拿来的实例. 简介 自70-80年代CRT屏幕上映第一幅光栅图形以来,人们对数字视觉设计的态度便不断进化.与其他艺术领域不同,数字设计的潮流始终随可用工具的进化而变化. 我们已经见证了设备显示能力的不断进步--从有限的CGA分辨率 (320 x 200) 到VGA(640 x 480)

手把手教你安装Android x86

话说最近操作系统这个话题的确是非常火爆.也许是借助于Windows 8消费者预览版的光芒,凡是与系统搭边的东西大家好像都喜欢与Windows 8进行比较.不管结果如何,笔者相信软件不同于硬件,只有适合自己的软件才是最重要的. 当然介于现在可以使用的系统众多,其中Android x86版也是大家关注的焦点.许多人都希望能够尝试一下不同于Windows的体验以及感受.但是也许是受限于个人能力,许多入门玩家更多地是选择驻足观看而不是亲身体验.这其中很大一部分原因要归结为这些玩家不了解不同系统的安装方法

PS手把手教你绘制超逼真的湖面冰层

  Step 1 按照透视定义水的区域. Step 2 新建图层,使用矩形选框工具(M)选择水的区域,使用任意颜色填充. Step 3 使用图层蒙版或橡皮擦工具露出砖柱部分.我们将使用这一图层作为剪贴图层. Step 4 复制(CTRL+J)背景图层,并将其剪贴至上一图层(CTRL+ALT+G).使用滤镜>模糊>高斯模糊--这能创建冰层厚度效果. Step 5 冰会有反射效果,背景的反射效果很容易,我们要花费更多工夫在砖柱的反射上.反射需要符合透视效果!使用钢笔工具(P)选择前面的砖柱,将路径

手把手教你用photoshop做重影效果教程

  手把手教你用photoshop做重影效果教程在网上看到一个重影效果,我觉得对于摄影后期处理是一个很好的技巧,然后用我自己理解的把他再重做了一遍,希望让大家更好理解   分类: PS图片处理