首页 > 其他 > 详细

strace诊断问题

时间:2020-02-24 17:10:00      阅读:72      评论:0      收藏:0      [点我收藏+]
 
早些年,如果您知道有个strace命令,就很牛了,而现在大家基本都知道strace了,如果您遇到性能问题求助别人,十有八九会建议您用strace挂上去看看,不过当您挂上去了,看着满屏翻滚的字符,却十有八九看不出个所以然。本文通过一个简单的案例,向您展示一下在用strace诊断问题时的一些套路。
如下真实案例,如有雷同,实属必然!让我们看一台高负载服务器的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 ] 选项用来汇总各个操作的总耗时,运行后的结果大概如下图所示:
技术分享图片

 

很明显,我们能看到CPU主要被clone操作消耗了,还可以单独跟踪一下clone :
shell> strace -T -e clone -p <PID>
通过 [ T ] 选项可以获取操作实际消耗的时间,通过 [ e ] 选项可以跟踪某个操作:
技术分享图片

 

很明显,一个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 -e clone php -r exec("ls");
 
最后再考大家一个题:如果我们用 strace 跟踪一个进程,输出结果很少,是不是说明进程很空闲?其实试试 ltrace ,可能会发现别有洞天,记住有内核态和用户态之分。
 
推荐阅读: strace cheat sheet
其他strace选项:https://man.linuxde.net/strace

strace诊断问题

原文:https://www.cnblogs.com/hbgs/p/12357441.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!