【转】手把手教你用Strace诊断问题

原博客地址:http://huoding.com/2015/10/16/474

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

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

top

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

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

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

shell> strace -p <PID>

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

shell> strace -cp <PID>

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

strace -cp

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

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 系统调用:

shell> strace -eclone php -r ‘exec("ls");‘

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

时间: 2024-10-13 16:01:10

【转】手把手教你用Strace诊断问题的相关文章

Android开发之手把手教你写ButterKnife框架(二)

欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52664112 本文出自:[余志强的博客] 上一篇博客Android开发之手把手教你写ButterKnife框架(一)我们讲了ButterKnife是什么.ButterKnife的作用和功能介绍以及ButterKnife的实现原理. 本篇博客主要讲在android studio中如何使用apt. 一.新建个项目, 然后创建一个module名叫processor 新建m

手把手教你实现Spring ioc

手把手教你实现Spring ioc "Don't call us, we'll call you(不要联系我,我会主动联系你)" 这是好莱坞很经典的一句话,应用在ioc(控制反转)领域,发现理解起来相得益彰--你作为用户不需要控制业务实体的生成,交给我容器来控制,这就是控制反转.不过,这样理解起来也有点麻烦,套用面向对象大师Martin Fowler的说法更为贴切: "Dependency Inversion(依赖注入)" 当容器中所有的实体bean 都被管理起来的

深入理解iPhone数据持久化(手把手教你iphone开发 – 基础篇)

在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库中.symbian中因为权限认证的原因,在3rd上大多数只能访问应用程序的private目录或其它系统共享目录.在iphone中,apple博采众长,提供了多种数据持久化的方法,下面笔者会逐个进行详细的讲解. iphone提供的数据持久化的方法,从数据保存的方式上讲可以分为三大部分:属性列表.对象归档.嵌入式数据库(SQLite3).其他方法. 一.属

Android消息推送:手把手教你集成小米推送

前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 该文档基于小米推送官方Demo,并给出简易推送Demo 看该文档前,请先阅读我写的另外两篇文章: 史上最全解析Android消息推送解决方案 Android推送:第三方消息推送平台详细解析 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo

(转)手把手教你自制微信公众号流量监控系统

手把手教你自制微信公众号流量监控系统 一.首先是使用的工具: 基于搜狗微信搜索的微信公众号爬虫接口.Flask.ZUI框架. 第一个接口也是我开发的,欢迎star哈~ 二.获取数据 使用第一个接口获取公众号数据~ 可以看到,公众号的一般信息已经拿到手. 现在,将其集成到我们的网站上: (嗯,UI比较简单....) 三.监控 还是使用第一个接口监控数据: 这里做了一个嵌套排序,可以按照阅读量排序. 集成到网站上:四.具体的文章流量 继承到网站: 如上图所示,既可以监控微信号“NUAA_1952”的

手把手教你建github技术博客by hexo

适合人群 喜欢写Blog的人 有一定的编程基础 爱折腾的人 熟练使用版本控制Git 了解使用Github 熟悉基本的MarkDown语法 环境准备 安装Git 下载 msysgit 并执行即可完成安装. 安装Node.js 在 Windows 环境下安装 Node.js 非常简单,仅须下载安装文件并执行即可完成安装. 安装hexo 利用 npm 命令即可安装.(在任意位置点击鼠标右键,选择Git bash) npm install -g hexo 问题 * npm ERR! registry e

手把手教你搭建LyncServer2013之准备篇(一)

这次实验的拓扑结构如下: 首先准备AD域,把DC这台服务器提升为域服务器,在这里,域服务器的安装就不上图了,DNS会随域控制器的安装一起安装,这次安装的Lync版本为Lync Server 2013,规划的Lync内部WEB地址和外部WEB地址一样,都为pool01.iSusan.cn,而两台Lync前端做为DNS轮询负载,所以在DNS下需要加入如下A记录: 192.168.137.12 pool01.iSusan.cn 192.168.137.13 pool01.iSusan.cn 192.1

手把手教你搭建LyncServer2013之CA准备(二)

首先进行CA服务的安装,安装完后在组策略中配置计算机证书自动申请 到此,证书服务器已经安装完成,下一步开始配置计算机自动证书申请 手把手教你搭建LyncServer2013之CA准备(二),布布扣,bubuko.com

手把手教你搭建LyncServer2013之Lync后端存储准备(三)

这次实验的Lync后端存储安装的是SQL Server 2012,配置了高可用,两台做Mirror,一台做见证服务器,实现故障的自动转移,SQL Server的安装需要.net Framwork 3.5的支持,所以在安装SQL之前,我们先来安装.net Framework 3.5 安装完.net Framework 3.5后,我们开始第一台SQL Server 2012的安装 到此第一台Lync后端存储服务器已经安装好,因为我这次实验中需要安装监控和存档角色,所以在安装数据库的时候选择了三个功能