Linux系统下使用XHProf和XHGui分析PHP运行性能
作者:Davey Shafik 发布时间:2023-11-14 23:56:33
什么是性能分析?
性能分析是衡量应用程序在代码级别的相对性能。性能分析将捕捉的事件包括:CPU的使用,内存的使用,函数的调用时长和次数,以及调用图。性能分析的行为也会影响应用性能。
什么时候应该进行性能分析?
在考虑是否进行性能分析时,你首先要想:应用是否存在性能问题?如果有,你要进一步考虑:这个问题有多大?
如果你不这样做,将会陷入一个陷阱——过早优化,这可能会浪费你的时间。
为了评断应用是否存在性能问题,你应该确定性能目标。例如,100 个并发用户的响应时间小于 1s 。然后,你需要进行基准测试,看是否达到这个目标。一个常见的错误是,在开发环境进行基准测试。事实上,你必须在生产环境进行基准测试。(实际生产环境或模拟的生产环境,后者很容易在 SaaS 实现。
用于基准测试的产品很多,包括 ab,siege 和 JMeter。我个人比较喜欢 JMeter 的功能集,但 ab 和 siege 更加易用。
一旦你确定应用存在性能问题,就需要分析其性能,实施改进,然后再一次进行基准测试,查看问题是否解决。每一次变更之后,你都该进行基准测试查看效果。如果你做了很多变更,却发现应用性能有所下降,你就无法确定具体是哪一次变更导致了这个问题。
下图是我定义的性能生命周期:
性能下降的一般原因
导致性能下降的一般原因中,有些相当出人意料。即便是像 PHP 这样的高级语言,代码的好坏也很少是问题的根源。在当今的硬件配置条件下,CPU 很少是性能限制的原因。常见的原因反而是:
数据存储
PostgreSQL
MySQL
Oracle
MSSQL
MongoDB
Riak
Cassandra
Memcache
CouchDB
Redis
外部资源
APIs
文件系统
网络接口
外部流程
糟糕的代码
选择哪一种性能分析器?
在 PHP 世界里,有两个截然不同的的性能分析器——主动和被动。
主动 VS 被动性能分析
主动分析器在开发过程中使用,由开发人员启用。主动分析器收集的信息比被动分析器多,对性能的影响更大。通常,主动分析器不能用在生产环境中。XDebug 就是一种主动分析器。
因为无法在生产环境中使用主动分析器,Facebook 推出了一个被动分析器——XHProf。XHProf 是为了在生产环境中使用而打造的。它对性能的影响最小,同时收集足够的信息用于诊断性能问题。XHProf 和 OneAPM 都是被动分析器。
通常,XDebug 收集的额外信息对于一般的性能问题分析并不必要。这意味着,被动分析器是用于不间断性能分析的更佳选择,即使是在开发环境中。
XHProf + XHGui
XHProf 由 Facebook 开发的,包含一个基本的用户界面用于查看性能数据。此外,Paul Reinheimer 开发了 XHGui 和一个增强的用户界面(UI)用于查看、比较和分析性能数据。
安装
安装 XHProf
XHProf 可通过 PECL 安装,步骤如下:
$ pecl install xhprof-beta
该 pecl 命令将尝试自动更新你的 php.ini 设置。pecl 尝试更新的文件可以使用以下命令找到:
$ pecl config-get php_ini
它会在指定的文件(如果有的话)顶部增加新的配置行。你可能想把他们移到一个更合适的位置。
一旦你编译了该扩展程序,您必须启用它。为此,您需要在 PHP INI 文件添加以下代码:
[xhprof]
extension=xhprof.so
之后,结合 XHGui 就能轻松地执行性能分析与检查。
安装 XHGui
安装 XHGui,必须直接从 git 获取。该项目可以在 github 上找到,地址为:https://github.com/perftools/xhgui
XHGui 要求:
PHP 5.3+
ext/mongo
composer
MongoDB (若只需要收集数据,则可选可不选;若需要数据分析,则为必选)
首先,克隆项目到任意位置。在基于 Debian 的 Linux 系统(例如 Ubuntu 等等),可能是 /var/www。在 Mac OS X 系统,可能是 /Library/WebServer/Documents。
$ cd /var/www
$ git clone https://github.com/perftools/xhgui.git
$ cd xhgui
$ php install.php
最后一个命令是运行 composer 以安装依赖并检查 XHGui 缓存目录的权限。如果失败,你可以手动运行 composer install。
下一步,你可能需要创建配置文件。这一步很容易实现,可以使用在 /path/to/XHGui/config/config.default.php 下的默认配置文件。
如果你在本地运行 MongoDB,没有身份验证,则可能不需要这样做。因为它将回退为默认值。而在多服务器环境中,你会需要一个所有服务器都能进行存储的远程 MongoDB 服务器,并进行恰当的配置。
为提高 MongoDB 的性能,你可以运行以下指令以添加索引:
$ mongo
> use xhprof
db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
db.results.ensureIndex( { 'profile.main().wt' : -1 } )
db.results.ensureIndex( { 'profile.main().mu' : -1 } )
db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
db.results.ensureIndex( { 'meta.url' : 1 } )
其他配置
如果你不想在生产环境中安装 mongo ,或无法让 Web 服务器访问 mongo 服务器,您可以将性能分析数据保存在磁盘中,再导入到本地 MongoDB 供以后分析。
为此,请在 config.php 中进行以下修改:
<?php
'save.handler' = 'file',
'save.handler.filename' => '/path/to/xhgui/xhprof-' .uniqid("", true). '.dat',
?>
改变文件中的 save.handler,然后取消批注 save.handler.filename ,为其赋一个恰当的值。
注意:默认每天只保存一个分析文件。
一旦分析数据的准备就绪,你就可以使用 XHGui 附带的脚本导入之:
$php /path/to/xhgui/external/import.php /path/to/file.dat
在此之后的步骤都相同。
运行 XHGui
XHGui 是以 PHP 为基础的 Web 应用程序,你可以以 /path/to/xhgui/webroot 为根文件,设置一个标准的虚拟主机。
或者,你可以简单地使用 PHP 5.4+ cli-server 例如:
$ cd /path/to/xhgui
$ php -S 0:8080 -t webroot/
这将使 XHGui 在所有网络接口都可通过 8080 端口进行通信。
运行性能分析器
运行分析器时,你需要在待分析的所有页面包含 external/header.php 脚本。为此,你可以在 PHP ini 文件设置 auto_prepend_file 。你既可以直接在公共 INI 文件进行设置,也可以限制到单一的虚拟主机。
对于 Apache 服务器,添加以下代码:
php_admin_value auto_prepend_file "/path/to/xhgui/external/header.php"
对于 Nginx 服务器,在服务器配置中添加以下代码:
fastcgi_param PHP_VALUE "auto_prepend_file=/path/to/xhgui/external/header.php";
如果您使用 PHP 5.4+ cli-server(PHP -S),则必须通过命令行标记进行设置:
$ php -S 0:8080 -dauto_prepend_file=/path/to/xhgui/external/header.php
默认情况下,分析器运行时只分析(大约) 1% 的请求。这是由以下 external/header.php 代码控制的:
<?php
if (rand(0, 100) !== 42) {
return;
}
?>
如果你想分析每一个请求(例如,在开发阶段),你可以将这段代码注释掉。如果你想让分析 10% 的请求,你可以做如下改动:
<?php
if (rand(0, 10) !== 4) {
return;
}
?>
这允许你对一小部分用户请求进行分析,而不过多影响单个用户或太多用户。
如果你想在性能分析时进行手动控制,你可以这样做:
<?php
if (!isset($_REQUEST['A9v3XUsnKX3aEiNsUDZzV']) && !isset($_COOKIE['A9v3XUsnKX3aEiNsUDZzV'])) {
return;
} else {
// Remove trace of the special variable from REQUEST_URI
$_SERVER['REQUEST_URI'] = str_replace(array('?A9v3XUsnKX3aEiNsUDZzV', '&A9v3XUsnKX3aEiNsUDZzV'), '', $_SERVER['REQUEST_URI']);
setcookie('A9v3XUsnKX3aEiNsUDZzV', 1);
}
if (isset($_REQUEST['no-A9v3XUsnKX3aEiNsUDZzV'])) {
setcookie('A9v3XUsnKX3aEiNsUDZzV', 0, time() - 86400);
return;
}
?>
这段代码会检查一个随机命名的 GET/POST/COOKIE 变量(在此例中为:A9v3XUsnKX3aEiNsUDZzV),同时创建一个同名的 Cookie ,用于分析该请求的整个过程,例如:表单提交后的重定向,Ajax 请求等等。
此外,它允许一个名为 no-A9v3XUsnKX3aEiNsUDZzV 的 GET/POST 变量来删除 Cookie ,停止分析。
当然,我们欢迎大家尝试使用 OneAPM 来为您的 PHP 和 Java 应用做免费的性能分析。OneAPM 独有的探针能够深入到所有 PHP 和 Java 应用内部完成应用性能管理和监控,包括代码级别性能问题的可见性、性能瓶颈的快速识别与追溯、真实用户体验监控、服务器监控和端到端的应用性能管理。 OneAPM 可以追溯到性能表现差的 SQL 语句 Traces 记录、性能表现差的第三方 API、Web 服务、Cache 等等。


猜你喜欢
- 安装去http://www.mysql.com/downloads/, 选择最下方的MySQL Community Edition,点击My
- 很多时候,查看一个文件夹下的每个文件大小可以轻易的做到,因为文件后面就是文件尺寸,但是如果需要查看一个文件夹下面所有的文件夹对应的尺寸,就发
- <?php /* +---------------------------------------------------------
- 目录1、简介2、正文2.1 where子句位置2.2 操作符2.3 空值null1、简介当我们需要获取数据库表数据的特定子集时,可以使用wh
- 软件测试面试如何测试网页的登录页面这个面试题碰到过很多次, 再次总结下来。具体需求: 有一个登陆页面, 上面有2个textbox, 一个提交
- 1、需求当工作在UNIX Shell下时,我们想使用常见的通配符模式(即:.py,Dat[0-9].csv等)来对文本做匹配。2、解决方案f
- 1. AdaBoost 算法简介Boosting是机器学习的三大框架之一,其特点是,训练过程中的诸多弱模型,彼此之间有着强依赖关系。Boos
- 本文实例讲述了PHP排序二叉树基本功能实现方法。分享给大家供大家参考,具体如下:这里演示了排序二叉树节点的插入,中序遍历,极值的查找和特定值
- 如果不配置.gitignore的文件,带push代码的时候就会把一写不必要的文件push到远程仓库,如.idea文件。如果不小心出现此文件在
- 1.MySQL官网下载压缩版文件,放至安装路径下载zip安装包MySQL :: Download MySQL Community Serve
- 如下所示:alist=[1,2]] >>>[1,2] alist.append([3,4]) >>>[1
- 1、事件冒泡:在javascript事件传播过程中,当事件在一个元素上出发之后,事件会逐级传播给先辈元素,直到document为止,有的浏览
- 关于python 性能提升的一些方案。一、函数调用优化(空间跨度,避免访问内存) 程序的优化核心点在于尽量减少操作跨度,包括代码执
- 早就听说requests的库的强大,只是还没有接触,今天接触了一下,发现以前使用urllib,urllib2等方法真是太搓了……这里写些简单
- 一、需求需求很简单,就是需要查询一个报表,只有1个表,数据量大约60万左右,但是中间有些逻辑。先说明一下服务器配置情况:1核CPU、2GB内
- IT界的每个人都应该知道终端(Terminal)的基本知识,数据科学家也不例外。有时,终端是你的全部,尤其是在将模型和数据管道部署到远程机器
- python闭包关于闭包, 很多blog中都这样解释 :对于一个嵌套定义的函数,外层的函数的返回值是内层函数,而在内层函数中又引用了外层函数
- Python函数函数就是把具有独立功能的代码块封装成一个小模块,可以直接调用,从而提高代码的编写效率以及重用性, 需要注意的是, 函数需要被
- 本文实例讲述了Python数据分析之双色球基于线性回归算法预测下期中奖结果。分享给大家供大家参考,具体如下:前面讲述了关于双色球的各种算法,
- 写了个简洁的隔行变色代码,支持三种动作变化颜色<!DOCTYPE html PUBLIC "-//W3C//DTD XHTM