早些年,假如你知道有个 strace 呼吁,就很牛了,而此刻各人根基都知道 strace 了,假如你碰着机能问题求助别人,十有八九会发起你用 strace 挂上去看看,不外当你挂上去了,看着满屏翻腾的字符,却十有八九看不出个所以然。本文通过一个简朴的案例,向你展示一下在用 strace 诊断问题时的一些套路。
如下真实案例,如有类似,实属一定!让我们看一台高负载处事器的 top 功效:
能力:运行 top 时,按「1」打开 CPU 列表,按「shift+p」以 CPU 排序。
在本例中各人很容易发明 CPU 主要是被若干个 PHP 历程占用了,同时 PHP 历程占用的较量多的内存,不外系统内存另有结余,SWAP 也不严重,这并不是问题主因。
不外在 CPU 列表中能看到 CPU 主要耗损在内核态「sy」,而不是用户态「us」,和我们的履历不符。Linux 操纵系统有许多用来跟踪措施行为的东西,内核态的函数挪用跟踪用「strace」,用户态的函数挪用跟踪用「ltrace」,所以这里我们应该用「strace」:
不外假如直接用 strace 跟踪某个历程的话,那么期待你的往往是满屏翻腾的字符,想从这里看出问题的症结并不是一件容易的工作,亏得 strace 可以按操纵汇总时间:
通过「c」选项用来汇总各个操纵的总耗时,运行后的功效或许如下图所示:
很明明,我们能看到 CPU 主要被 clone 操纵耗损了,还可以单独跟踪一下 clone:
shell> strace -T -e clone -p <PID>
shell> strace -T -e clone -p <PID> |
通过「T」选项可以获取操纵实际耗损的时间,通过「e」选项可以跟踪某个操纵:
很明明,一个 clone 操纵需要几百毫秒,至于 clone 的寄义,参考 man 文档:
简朴来说,就是建设一个新历程。那么在 PHP 里什么时候会呈现此类系统挪用呢?查询业务代码看到了 exec 函数,通过如下呼吁验证它确实会导致 clone 系统挪用:
shell> strace -eclone php -r ‘exec(“ls”);’
最后再考各人一个题:假如我们用 strace 跟踪一个历程,输出功效很少,是不是说明历程很空闲?其实试试 ltrace,,大概会发明别有洞天。记着有内核态和用户态之分。