最近两周,PHPTrace发布了0.3版本,这次新版本发布距离上一次更新将近两个月。在这段时间里,我们放缓了新功能的开发,重新推敲这个工具能够为大家带来的价值,并且在细节和稳定性方面都有了很大的提升。

PHPTrace是什么? PHPTrace是一个低开销的用于跟踪、分析PHP运行情况的工具。

它可以跟踪PHP在运行时的函数调用、请求信息、执行流程,并且提供有过滤器、统计信息 、当前状态等实用功能。在任何环境下,它都能很好的定位阻塞问题以及在高负载下Debug,尤其是线上产品环境

下面将分为两部分,首先会简单介绍下新版本带来的改动,然后展开讲下我们是如何确保PHPTrace在线上运行时稳定、低开销的。

新版本改动

PECL

相信有心的同学一定发现PHPTrace出现在PECL了。

没错,我们将新版本发布到了PHP官方的扩展库中,伴随而来的还有:

  • 开源协议变更为Apache 2.0
  • 扩展的名称变更为trace

关注细节

为了将trace功能本身做到极致,我们对PHP的扩展做了重构,并且着重完善了很多细节:

  • 新增对main函数includerequire闭包匿名函数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脚本进行了测试,结果如下:

bench

关于测试结果,在这里需要解释一下,上面两个测试的环境都是比较孤立的,排除了数据库、网络、接口等层面的影响,所以对性能影响的比例会被放大一些。在实际线上运行时的影响会比表中的数据低很多。

兼容性

相对于性能来讲,稳定性则更为重要。和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