zoukankan      html  css  js  c++  java
  • gdb+zbacktrace找到cpu过高php代码

    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

    如果PATH环境变量中没有php,gdb时需要指定绝对路径,如gdb /usr/local/bin/php

    常用指令

    • 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 + czbacktracec 查看程序在哪段PHP代码发生循环
    • 找到对应的PHP代码进行解决

    您的资助是我最大的动力!
    金额随意,欢迎来赏!

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

    如果,想给予我更多的鼓励,求打

    因为,我的写作热情也离不开您的肯定支持,感谢您的阅读!

  • 相关阅读:
    关于在MDK中使用 printf 函数
    Stm32 SWD 下载 调试配置
    STM32使用以下规则对过滤器编号:
    STM32的can现场总线实验心得
    0R电阻作用
    Android activity 亮度调整
    电源信息监控
    android 圆环进度view
    com.google.zxing:core 生成二维码的简单使用
    自定义控件 监控宿主activity的生命周期
  • 原文地址:https://www.cnblogs.com/GreenForestQuan/p/10972021.html
Copyright © 2011-2022 走看看