资讯专栏INFORMATION COLUMN

php-stacktrace: PHP进程外查看函数调用堆栈

xiyang / 2231人阅读

摘要:要看到具体的函数就需要用扩展或者用调试,高级点还可以用。就是要跟踪的进程。原理众所周知,是用写的,而各种函数调用的信息都会用语言的来表示,所以只要两步就能拿到堆栈信息读取进程的内存在内存里找到函数调用堆栈信息第一步可以通过或实现。

生产环境多多少少会遇到CPU占用很高或者卡住的PHP进程,这时怎样才能知道这个进程在干啥呢?

一个方法是strace跟踪系统调用和参数,这样能大概知道PHP进程在干啥。要看到具体的PHP函数就需要用PHP扩展(xdebug、xhprof)或者用GDB调试,高级点还可以用DTrace。

上周发现了ruby-stacktrace,它直接读取ruby进程的内存来获取堆栈信息,不用GDB和扩展,所以性能很好,于是我也照着写了一个php-stacktrace,算是勉强能用的玩具。

使用

使用比较简单,下载解压即可:

$ ./php-stacktrace --help
php-stacktrace 0.1
Sampling profiler for PHP programs

USAGE:
    php-stacktrace   

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

ARGS:
          trace or top or oneshot
        Path to php debuginfo
              PID of the PHP process you want to profile

三个参数都是必填的。

COMMAND可以是tracetoponeshotoneshot只查看一次就退出,tracetop会一直跟踪,trace的输出可以用来生成火焰图,top统计函数耗时。

DEBUGINFO是调试信息文件的路径,Linux通常要独立安装debuginfo包,因为不会从elf里解析路径,所以要通过这个参数指定,通常的路径是/usr/lib/debug/.dwz/php....(在隐藏目录里,是个小坑)。

PID就是要跟踪的PHP进程ID。

顺带一提,只支持非线程安全的PHP 7.1。

原理

众所周知,Zend VM是用C写的,而各种PHP函数调用的信息都会用C语言的struct/union来表示,所以只要两步就能拿到堆栈信息:

读取PHP进程的内存

在内存里找到函数调用堆栈信息

第一步可以通过ptraceprocess_vm_readv实现。ptrace就是调试器所用的方法,它可以暂停PHP进程然后读取内存。process_vm_readv可以不暂停进程,性能可能更好,但是不可靠,因为PHP还在执行,堆栈信息不断变化,很容易读到错误的内存。

第二步就需要DWARF调试信息了,调试信息里记录了结构体大小、字段偏移信息,通过这些信息我们就可以准确地去读内存然后做解析。

原理还是很简单的。

下一步

复制vm_stack,尽量在一次process_vm_readv拿到主要的堆栈信息

增加作用域信息,现在只有函数名

完善错误处理,现在的代码是一团糟

多学点Rust

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30615.html

相关文章

  • 2017回顾

    摘要:按使用的语言来总结一下年。第三个后端项目,还算比较成功,上线了大半年,没有明显的性能问题,做修改也是非常容易。还用了一个集群去做部署先是阿里云的集群方案,后是,集群监控日志采集配置管理等等都没少弄。 showImg(https://segmentfault.com/img/bV0VHw?w=1495&h=1144); 按使用的语言来总结一下2017年。 TypeScript 用Type...

    springDevBird 评论0 收藏0
  • JVM详解3.JDK监控和故障处理工具

    摘要:点击进入我的博客命令行工具这些工具大多数是类库的一层薄的包装,它们的主要功能代码是在类库中实现的。可视化工具是到目前为止随发布的功能最强大的运行监视和故障处理程序,并且可以预见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。 点击进入我的博客 3.1 JDK命令行工具 showImg(https://segmentfault.com/img/remote/14600000174...

    Keven 评论0 收藏0
  • PHP并发IO编程之路

    摘要:下文如无特殊声明将使用进程同时表示进程线程。收到数据后服务器程序进行处理然后使用向客户端发送响应。现在各种高并发异步的服务器程序都是基于实现的,比如。 并发 IO 问题一直是服务器端编程中的技术难题,从最早的同步阻塞直接 Fork 进程,到 Worker 进程池/线程池,到现在的异步IO、协程。PHP 程序员因为有强大的 LAMP 框架,对这类底层方面的知识知之甚少,本文目的就是详细介...

    Riddler 评论0 收藏0
  • PHP回顾之多进程编程

    摘要:多进程中与多进程相关的两个重要拓展是和。函数执行期间,主进程除了等待无法处理其他任务,所以一般不认为这是多进程编程。回收子进程有两种方式,一种是主进程调用函数等待子进程结束另外一种是处理信号。 转载请注明文章出处: https://tlanyan.me/php-review... PHP回顾系列目录 PHP基础 web请求 cookie web响应 session 数据库操作 加解...

    lifesimple 评论0 收藏0
  • 基本性能分析,省了几百万美元

    摘要:本文是关于我如何应用基本性能分析技术,借助火焰图做了一处小改进,使得我们计算机集群的状况获得了倍的改善,并在第二年帮助节省了几百万刀。最终,通过对平均大小在的事件进行批量插入,我们的吞吐量获得了的提高。 本文是关于我如何应用基本性能分析技术,借助火焰图做了一处小改进,使得我们 Postgres 计算机集群的 CPU 状况获得了 10 倍的改善,并在第二年帮助 Heap 节省了几百万刀。针对用...

    张宪坤 评论0 收藏0

发表评论

0条评论

xiyang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<