1.最近发现项目的cpu过高。排查问题想不到好方法。在网上找了下。可以使用linux gdb+zbacktrace+PHP-src来排查PHP执行过多的程序
top
此时,看到进程PID 16229 占cpu 88.7
gdb -p 16229 source /datas/soft/PHP-src/.gdbinit zbacktrace
这时就能看到导致你的cpu过高的程序
最后,我这边一看就是读取redis的频率过高的原因。每500毫秒请求一次。前一次请求没有释放,后一次请求又来了。后面把swoole-timer 时间改成每秒执行。
PHP-src【SourceCode:https://github.com/php/php-src】
gdb工具的使用
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,可以用来调试C/C++开发的程序,PHP和Swoole是使用C语言开发的,所以可以用GDB来调试PHP+Swoole的程序。
gdb调试是命令行交互式的,需要掌握常用的指令。
使用方法
gdb -p 进程ID
gdb PHP
gdb PHP core
gdb有3种使用方式:
- 跟踪正在运行的PHP程序,使用gdb -p 进程ID
- 使用gdb运行并调试PHP程序,使用gdb PHP -> run server.PHP 进行调试
- PHP程序发生coredump后使用gdb加载core内存镜像进行调试 gdb PHP core
常用指令
p
:print,打印C变量的值c
:continue,继续运行被中止的程序b
:breakpoint,设置断点,可以按照函数名设置,如b zif_PHP_function
,也可以按照源代码的行数指定断点,如b src/networker/Server.c:1000
t
:thread,切换线程,如果进程拥有多个线程,可以使用t指令,切换到不同的线程ctrl + c
:中断当前正在运行的程序,和c指令配合使用n
:next,执行下一行,单步调试info threads
:查看运行的所有线程l
:list,查看源码,可以使用l 函数名
或者l 行号
bt
:backtrace,查看运行时的函数调用栈finish
:完成当前函数f
:frame,与bt配合使用,可以切换到函数调用栈的某一层r
:run,运行程序
zbacktrace
zbacktrace是PHP源码包提供的一个gdb自定义指令,功能与bt指令类似,与bt不同的是zbacktrace看到的调用栈是PHP函数调用栈,而不是C函数。
下载PHP-src,解压后从根目录中找到一个.gdbinit
文件,在gdb shell中输入
source .gdbinit
zbacktrace
.gdbinit还提供了其他更多指令,可以查看源码了解详细的信息。
使用gdb+zbacktrace跟踪死循环问题
gdb -p 进程ID
- 使用
ps aux
工具找出发生死循环的Worker进程ID gdb -p
跟踪指定的进程- 反复调用
ctrl + c
、zbacktrace
、c
查看程序在哪段PHP代码发生循环 - 找到对应的PHP代码进行解决
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。