手把手教你用 strace 诊断问题

简介:

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

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

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

strace -cp

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

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

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

strace -T -e clone -p

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

目录
相关文章
|
3月前
|
数据可视化 Go 数据库
性能分析神器:pprof命令详解与实战
性能分析神器:pprof命令详解与实战
157 0
性能分析神器:pprof命令详解与实战
|
6月前
|
监控 Linux
(四)Linux命令行工具和系统管理:监控、性能分析和故障排除
Linux系统管理员需要具备监控、性能分析和故障排除的能力,以确保系统的稳定性和安全性。本文将介绍如何使用Linux命令行工具进行系统监控、性能分析和故障排除,帮助管理员更好地管理Linux服务器。
79 2
|
10月前
|
监控 安全 编译器
常用问题排查工具和分析神器,值得收藏
常用问题排查工具和分析神器,值得收藏
strace简介
strace命令是一个集诊断、调试、统计与一体的工具,可以用来追踪和调试程序。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间
143 0
|
Arthas 测试技术
《Arthas应用诊断利器-新特征介绍》电子版地址
Arthas应用诊断利器-新特征介绍
105 0
《Arthas应用诊断利器-新特征介绍》电子版地址
|
NoSQL 测试技术
性能测试必备知识(8)- 深入理解“进程状态”
性能测试必备知识(8)- 深入理解“进程状态”
98 0
性能测试必备知识(8)- 深入理解“进程状态”
|
Shell PHP
strace详解及实战
详细参数: -c 统计每一系统调用的所执行的时间,次数和出错的次数等. -d 输出strace关于标准错误的调试信息. -f 跟踪由fork调用所产生的子进程. -ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.
1822 0
利用 strace 分析网络不通问题案例
本章节分享利用 strace 分析网络不通问题的案例
利用 strace 分析网络不通问题案例
|
监控 Linux
自助Linux之问题诊断工具strace
引言 “Oops,系统挂死了..." “Oops,程序崩溃了..." “Oops,命令执行报错..."   对于维护人员来说,这样的悲剧每天都在上演。理想情况下,系统或应用程序的错误日志提供了足够全面的信息,通过查看相关日志,维护人员就能很快地定位出问题发生的原因。
1045 0