PHPTrace 0.3发布,做个靠谱的线上调试工具
最近两周,PHPTrace发布了0.3版本,这次新版本发布距离上一次更新将近两个月。在这段时间里,我们放缓了新功能的开发,重新推敲这个工具能够为大家带来的价值,并且在细节和稳定性方面都有了很大的提升。
PHPTrace是什么? PHPTrace是一个低开销的用于跟踪、分析PHP运行情况的工具。
它可以跟踪PHP在运行时的函数调用、请求信息、执行流程,并且提供有过滤器、统计信息 、当前状态等实用功能。在任何环境下,它都能很好的定位阻塞问题以及在高负载下Debug,尤其是线上产品环境。
下面将分为两部分,首先会简单介绍下新版本带来的改动,然后展开讲下我们是如何确保PHPTrace在线上运行时稳定、低开销的。
新版本改动
PECL
相信有心的同学一定发现PHPTrace出现在PECL了。
没错,我们将新版本发布到了PHP官方的扩展库中,伴随而来的还有:
- 开源协议变更为
Apache 2.0
- 扩展的名称变更为
trace
关注细节
为了将trace功能本身做到极致,我们对PHP的扩展做了重构,并且着重完善了很多细节:
- 新增对
main函数
、include
、require
、闭包
、匿名函数
、eval()
等特殊调用的支持 - 新增对PHP紧急退出后未完成的调用信息的持续收集
- 新增对
Trait
的Alias名称支持 - 新增对PHP 5.1的支持
- 优化
zval
的表现形式,完善对数组、对象的支持 - 优化扩展在非trace期间的性能(通过Zend/bench.php测试与不加载扩展时一致)
在这里可以查看全部改动的说明。
如何保证线上运行时稳定、低开销?
PHPTrace在诞生之初,只是单纯的为了解决360 Web服务在线上运行中遇到的一些疑难杂症,但就是这么一个简单的小需求,真正做起来却遇到了很多挑战。
开源后,在与用户的交流中,也收集到很多反馈,其中很多是关于“在线上生产环境使用是否靠谱的疑虑”。这里想说的是:这些担心并不多余,作为负责任的开发者,保证自己的项目无差错的稳定运行是最基本的品质。
作为PHPTrace的开发者,这种担心其实更多。因为从实现原理上讲,为了追踪到执行过程,PHPTrace的PHP扩展需要将Zend引擎的执行函数zend_execute_ex()
替换掉。这是整个PHP执行过程中最核心的函数,任何开销大的处理或是可能出错误的逻辑都可能导致严重后果。
在经历一些线上问题后,我们总结了对PHPTrace的两大原则性的要求,分别是:低开销,兼容性。根据这两条我们制定了一系列的测试、发布流程,来确保正式版的代码能够满足线上运行的要求。
低开销
额外的性能开销,是开发调试类扩展的硬伤。因为为了调试方便,必须要有更多的额外处理才能获取到丰富的运行时信息,所以像xdebug
这样的工具很少能放到线上环境运行。
PHPTrace在设计开发之初的目标就是为了解决线上问题,所以在仅加载扩展,不开启trace功能时的开销极低。
同时,对于线上环境我们很难频繁以修改php.ini
配置文件的形式来控制扩展的开关。在这方面,PHPTrace通过共享内存中的标志位来控制是否进行处理,做到了随用随开。
下面是两个性能测试,应用测试因为时间关系只使用比较热门的Laravel框架,通过httpd
中的ab
命令对Laravel框架的默认index.php
请求。其中加载xx扩展
特指仅加载扩展,不开启额外功能。
项目 | Requests/s | Percent |
---|---|---|
不加载扩展 | 293 | 100% |
加载trace扩展 | 288 | 98.29% |
加载xdebug扩展 | 132 | 45.05% |
可以看到目前加载PHPTrace与不加载时对整体开销的影响在1%左右,比xdebug要好很多。
为了更深入的验证对性能的影响,我们还使用了PHP官方的Zend/bench.php
脚本进行了测试,结果如下:
关于测试结果,在这里需要解释一下,上面两个测试的环境都是比较孤立的,排除了数据库、网络、接口等层面的影响,所以对性能影响的比例会被放大一些。在实际线上运行时的影响会比表中的数据低很多。
兼容性
相对于性能来讲,稳定性则更为重要。和PHP代码中的常见错误不同,一旦扩展中出现问题,产生的后果可能会大的多。
针对这一点,我们为PHPTrace制定了严格的测试流程,主要包含了:
- 扩展在不同PHP版本下的兼容性、性能开销
- 通用模块的功能测试
- 主流框架的实际运行测试
同时,因为扩展端需要深入到Zend引擎的执行过程中,我们还会在开启trace功能的同时跑完所有PHP源码包里的单元测试,以确保一些较新的问题也能够测试到。
具体的情况可以看下面这个表格,每一行是一个PHP版本,每一列是一个需要通过测试的大项。
Version | shared | static | ||||
编译 | 测试:扩展 | 编译 | 测试:扩展 | 测试:Zend | 功能:Trace | |
5.0.5 | no | no | no | no | no | no |
5.1.1 | yes | no | yes | no | no | yes |
5.2.5 | yes | yes | yes | yes | yes | yes |
5.2.17 | yes | yes | yes | yes | yes | yes |
5.3.10 | yes | yes | yes | yes | yes | yes |
5.3.29 | yes | yes | yes | yes | yes | yes |
5.4.40 | yes | yes | yes | yes | yes | yes |
5.5.10 | yes | yes | yes | yes | yes | yes |
5.5.24 | yes | yes | yes | yes | yes | yes |
5.6.8 | yes | yes | yes | yes | yes | yes |
新功能调查
为了更好的服务PHP开发者,为开源做贡献。我们欢迎大家参与进来一同为PHPTrace做贡献,下面是一个新功能的调查问卷,如果有期待的新功能或是一些建议,欢迎在这里提交。
问卷地址:http://www.diaochapai.com/survey/7686734b-7d57-4733-a7ea-30a7042a98df
我们为此特别准备了一些小礼品,请留下您的联系方式,如果您的建议被采纳,我们会主动联系您。
联系我们:g-infra-webcore(at)list.qihoo.net