聊一聊 Deliverer 与 Xhprof 的区别

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 前几天有位朋友在公众号问我,Deliverer 和 Xhprof 有什么区别吗?一句话:Xhprof是一个排查性能问题的工具,为系统性能做保障;Deliverer 是一个排查 Bug 的工具,为系统可用性服务。

前几天有位朋友在公众号问我,DelivererXhprof 有什么区别吗?一句话:Xhprof是一个排查性能问题的工具,为系统性能做保障;Deliverer 是一个排查 Bug 的工具,为系统可用性服务。

适用场景

Xhprof

Xhprof是一个排查性能问题的工具,为系统整体性能做保障。比如
发现某个接口比较慢,为了能够更清楚的找到性能瓶颈,则可以这样配置
php.ini配置

extension=xhprof.so
xhprof.output_dir=/tmp/xhprof
auto_prepend_file=/var/www/mengkang.test/header.php
auto_append_file=/var/www/mengkang.test/footer.php

/var/www/mengkang.test/footer.php的具体代码可以是

$xhprof_data = xhprof_disable();

$total_time = $xhprof_data["main()"]["wt"];
$total_time = round($total_time/1000,2);

$XHPROF_ROOT = __DIR__;
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default('/tmp/xhprof');
$run_id = $xhprof_runs->save_run($xhprof_data, "test");

$trace_id = isset($GLOBALS['rpc_trace_id']) ? $GLOBALS['rpc_trace_id'] : "";

$XHPROF_URL='http://mengkang.test/xhprof_html/index.php?time='.$total_time.'&run='.$run_id.'&source=test&trace_id='.$trace_id;

file_put_contents("/tmp/xhprof".date('Ymd').".log",$XHPROF_URL."\n",FILE_APPEND);

其中rpc_trace_id是各个系统自己透传的,方便定位上下游的链路。同时接口的返回值中都会带上这个 requestId(rpc_trace_id),如此之后则再访问 http://mengkang.test/xhprof_html/index.php?time=xxx&run={run_id}&source=test&trace_id=xxx 来跳转到run_id对应的 xhprof 的分析报告上。

还有类似的场景就是针对线上,指定阈值的慢请求(比如响应时间超过 3s)才进行$xhprof_runs->save_run,如果怕有性能损耗,可以抽样或者排重,看业务容忍度。

另一方面,如果业务逻辑中存在 bug 或者写了 exit 代码,最后导致这个性能采集失效,当然可以尝试下通过监听系统信号量的方式来主动调用footer.php的代码。

而且 xhprof 的调用链的查看方式依赖层层点击,不太利于分析。这不是它的缺点,只是说明下这不是它想解决的问题场景

Deliverer

Deliverer 是一个排查 Bug 的工具,为系统可用性服务。在不使用 Deliverer 的情况下,只能使用 strace 来根据系统调用的情况来排查问题,一方面系统调用日志繁杂、特别多;另一方面,看到的都是系统调用的函数,需要反推出在 php 里面的函数或者方法,需要有经验的猜
因为 php-fpm子进程也是常驻的,用strace跟的时候,每个请求的日志也是不分割的,查看起来比较麻烦,并且不知道请求的上下文,针对使用strace遇到的这些小问题,以上就是Deliverer的设计初衷。

https://github.com/zhoumengkang/deliverer
https://gitee.com/zhoumengkang/deliverer
如何安装使用见该项目的 readme

既然是了排查 bug 而生,Deliverer 不仅仅局限于php-fpm模式下的环境,不管是什么入口,只需要监听过滤指定的文件、方法、类名、函数即可。会在日志最前面一行打印 pid、ts、sapi、http 信息、cli 参数,方便我们追踪定位问题的源头。

demo

性能

在数据日志的采集上略有不同,Deliverer 性能损耗更小,因为Xhprof是将 PHP 的zend_executezend_execute_ex包裹一层。而Deliverer是在opcode执行环节中,针对特定的opcode类型做处理,调用次数要少一些,但是都这都是微乎其微的差别。
同时Deliverer只会在开启监听(下载压缩包之后,执行./bin/deliverer -t)之后才会生效,否则是不会采集日志的,所以线上提前安装也没有问题,只要不开启监听,不会有任何性能损耗。

最后

场景不一样而已,xhprof 是一个非常棒的工具,并没有黑它的意思。Deliverer 已支持 PHP5 和 PHP7.

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6月前
|
存储 测试技术 API
PHP 7.4 新特性及性能优化探究
随着互联网和移动应用的不断发展,PHP作为一种流行的服务器端脚本语言,始终保持着其重要性。本文将介绍PHP 7.4的新特性,包括类型属性、预加载、扩展改进等,并深入探讨这些新特性对PHP性能的影响,以及如何优化PHP 7.4代码以提升性能。
|
3月前
|
关系型数据库 数据库 PostgreSQL
【一文搞懂PGSQL】1.简述和安装
PostgreSQL(简称PG或PGSQL)是一款使用C和C++语言开发的开源关系型数据库管理系统。其官网为 [www.postgresql.org](https://www.postgresql.org/),中文社区为 [www.postgres.cn](http://www.postgres.cn)。PG采用了多层逻辑结构:第一层为实例,第二层为数据库(每个实例下可有多个相互独立的数据库),第三层为Schema(每个数据库下包含多个Schema)。每个Schema下可以创建表、视图、索引、函数等数据库对象。
|
3月前
|
设计模式 前端开发 PHP
PHP的异步编程之旅:从基础到深入
在PHP的世界里,异步编程如同一股清流,为传统的同步阻塞模型注入了新的活力。本文将带你领略异步编程的魅力,从理解其基本概念入手,逐步深入到实际应用中。我们将一起探索生成器、Promises/Guzzle、ReactPHP等工具的使用,并了解它们如何提升应用性能,最终实现高效、可扩展的PHP应用。准备好了吗?让我们开始这场异步编程的奇妙旅程!
|
6月前
|
缓存 NoSQL PHP
【PHP开发专栏】PHP缓存机制与实现
【4月更文挑战第29天】本文介绍了PHP缓存的基本概念、策略及实现方式。PHP缓存包括应用缓存、Web服务器缓存、数据库缓存和分布式缓存,常见策略有缓存预热、更新和懒加载。PHP的缓存实现包括文件缓存、APC、OPcache、Memcached和Redis。最佳实践包括缓存热点数据、控制粒度、设置失效策略、保证一致性和确保安全性。文中还提供了一个新闻列表和详情页的缓存实战示例,帮助开发者理解如何在实际项目中应用缓存。
176 1
HHVM是如何提升PHP性能的?底层原理是什么?
HHVM是如何提升PHP性能的?底层原理是什么?
165 0
|
PHP UED
PHP的并发能力是什么意思?底层原理是什么?
PHP的并发能力是什么意思?底层原理是什么?
217 0
|
缓存 算法 NoSQL
PHP的吞吐量是什么意思?底层原理是什么?
PHP的吞吐量是什么意思?底层原理是什么?
140 0
|
缓存 NoSQL PHP
ThinkPHP缓存源码深度解析(2)
ThinkPHP缓存源码深度解析
148 0
ThinkPHP缓存源码深度解析(2)
|
存储 缓存 NoSQL
ThinkPHP缓存源码深度解析(1)
ThinkPHP缓存源码深度解析
136 0
ThinkPHP缓存源码深度解析(1)
|
设计模式 安全 C++
我个人整理的C++单例模式,推荐boost方式(★firecat推荐★)
我个人整理的C++单例模式,推荐boost方式(★firecat推荐★)
948 0