gdb+zbacktrace找到cpu过高php代码
1.最近发现项目的cpu过高。排查问题想不到好方法。在网上找了下。可以使用linux gdb+zbacktrace+php-src来排查php执行过多的程序
top
此时,看到进程PID 16229 占cpu 88.7
gdb -p 16229source /datas/soft/php-src/.gdbinitzbacktrace
这时就能看到导致你的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 + c
、zbacktrace
、c
查看程序在哪段PHP代码发生循环 - 找到对应的PHP代码进行解决
转载于:https://www.cnblogs.com/GreenForestQuan/p/10972021.html
gdb+zbacktrace找到cpu过高php代码相关推荐
- 与服务器竟然打架!java系统线程占用CPU过高问题,到底怎么办?
1.下载Windows系统和应用程序监视工具Process Explorer https://download.sysinternals.com/files/ProcessExplorer.zip[建 ...
- java进程cpu占用高如何排查
问题: 公司参加HW期间,项目两台双活的jboss服务器频繁触发cpu利用率过高告警,cpu利用率长时间在90%以上. 排查思路: 第一步:在两台Linux服务器上,执行top命令,并按大写P以cpu ...
- CPU飙高 解决方法
1, top查找出哪个进程消耗的CPU高(top -c) 2.,top -h -p查找出哪个线程消耗的cpu高(top -h -p pid) 这个命令就能显示刚刚找到的进程的所有线程的资源消耗情况. ...
- oracle查询cpu占用率高,ORACLE CPU过高的sql查询
1. 根据占用CPU高的进程号来查询这个进程执行的SQL语句: CPU过高的进程号: #首先找到CPU过高的进程号 # top -bn1 是静态找到占用最高的进程 [root@localhost ~] ...
- CPU飙高和内存飙高的一般处理步骤
目录 cpu飙高处理步骤 内存飙高处理步骤 GC引起的单核飙高 常见SY飙高 IO飙高 抖动问题 cpu飙高处理步骤 1. top查找出哪个进程消耗的CPU高(top -c) 2. top -h -p ...
- 线上CPU飚高(死循环,死锁……)?帮你迅速定位代码位置
top基本使用: top命令参考本篇文章 查看内存和CPU的top命令,别看输出一大堆,理解了其实很简单 top 命令运行图: 第一行:基本信息 第二行:任务信息 第三行:CPU使用情况 第四行:物理 ...
- linux中找到最耗CPU的那段Java代码
linux下查找java进程占用CPU过高原因 查找进程 top查看进程占用资源情况:top 明显看出java的两个进程22714,12406占用过高cpu. 其他命令列出相关的java进程, 以及对 ...
- windows linux cpu 抢占式 时间片_阿里技术专家谈:CPU飙高,系统性能问题如何排查?...
导读:压测时或多或少都收到过CPU或者Load高的告警,如果是单机偶发性的,经常会认为是"宿主机抢占导致的",那事实是否真是如此呢?是什么引起了这些指标的飙高?网络.磁盘还是高并发 ...
- Linux中Python程序CPU占用高排查
Linux中Python程序CPU占用高排查,Linux中Python程序CPU占用高排查,Linux中Python程序CPU占用高排查 kafka-python==2.0.2和 gevent 新版本 ...
最新文章
- docker下的mysql my.ini_Docker + MySQL 主从环境搭建
- ateq测漏仪f620说明书_上海壁挂式测漏仪安全使用说明,煤气房报警器安装安全使用说明...
- 张学友演唱会成犯罪分子噩梦,阿里云云盾人发布脸对比功能将进一步提升罪犯监察力度...
- 计算机视觉测试数据集 dataset
- 雾霾经济:这10款产品,马云看了都想投资
- JavaScript:从此不再怕闭包
- TListBox的项目个数
- 如何在CRM和C4C中用代码判断当前是否处于configuration模式
- 人工智能AI实战100讲(三)-激光雷达原理和分类
- 14-项目开发总结报告(GB8567——88)
- Hibernate在MyEclipse8.6中生成报错解决方法
- 【转载】前端开发之CSS兼容写法经验总结
- Azkaban的安装部署
- JPA如何查询部分字段
- Web前端:HTML5 CSS3
- ClickHouse的核心特性及架构
- SYNPROXY抵御DDoS攻击的原理和优化
- 推荐几个在线处理文件、图片、音视频的工具,免费又好用!
- Java蚂蚁金服面试
- Android 跳转到高德、百度、腾讯地图进行导航
热门文章
- avast从隔离区恢复后,仍无法打开被误杀文件的解决方案
- 如何创建 SVN 服务器,并搭建自己的 SVN 仓库
- 20155207王雪纯 《Java程序设计》实验一报告
- 解决Ajax中的缓存问题
- laxcus的新功能:支持表跨数据库操作
- ios进度条Demo一个
- Com/ATL编程 一些学习链接
- 提前批无笔试,3天后截止!!字节跳动智能创作实验室-图像团队2022秋招提前批投递...
- 清华博士直播 | 如何让AI模型更皮实、更稳定?
- 致盲目标检测算法,阿里清华发起 “对抗攻击” 挑战赛!