欢迎来到云服务器

系统配置

Linux利用Strace调试历程的能力

早些年,假如你知道有个 strace 呼吁,就很牛了,而此刻各人根基都知道 strace 了,假如你碰着机能问题求助别人,十有八九会发起你用 strace 挂上去看看,不外当你挂上去了,看着满屏翻腾的字符,却十有八九看不出个所以然。本文通过一个简朴的案例,向你展示一下在用 strace 诊断问题时的一些套路。

如下真实案例,如有类似,实属一定!让我们看一台高负载处事器的 top 功效:

Linux利用Strace调试历程的能力

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

在本例中各人很容易发明 CPU 主要是被若干个 PHP 历程占用了,同时 PHP 历程占用的较量多的内存,不外系统内存另有结余,SWAP 也不严重,这并不是问题主因。

不外在 CPU 列表中能看到 CPU 主要耗损在内核态「sy」,而不是用户态「us」,和我们的履历不符。Linux 操纵系统有许多用来跟踪措施行为的东西,内核态的函数挪用跟踪用「strace」,用户态的函数挪用跟踪用「ltrace」,所以这里我们应该用「strace」:

不外假如直接用 strace 跟踪某个历程的话,那么期待你的往往是满屏翻腾的字符,想从这里看出问题的症结并不是一件容易的工作,亏得 strace 可以按操纵汇总时间:

通过「c」选项用来汇总各个操纵的总耗时,运行后的功效或许如下图所示:

Linux利用Strace调试历程的能力

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


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

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

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

Linux利用Strace调试历程的能力

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

Linux利用Strace调试历程的能力

简朴来说,就是建设一个新历程。那么在 PHP 里什么时候会呈现此类系统挪用呢?查询业务代码看到了 exec 函数,通过如下呼吁验证它确实会导致 clone 系统挪用:

shell> strace -eclone php -r ‘exec(“ls”);’

最后再考各人一个题:假如我们用 strace 跟踪一个历程,输出功效很少,是不是说明历程很空闲?其实试试 ltrace,,大概会发明别有洞天。记着有内核态和用户态之分。

腾讯云代理

Copyright © 2003-2021 MFISP.COM. 国外vps服务器租用 梦飞云服务器租用 版权所有 粤ICP备11019662号