性能分析是衡量应用程序在代码级别的相对性能。性能分析将捕捉的事件包括:CPU的使用,内存的使用,函数的调用时长和次数,以及调用图。性能分析的行为也会影响应用性能。php
影响的程度取决于基准测试。基准测试在外部执行,用于衡量应用真实性能。所谓真实性能,即终端用户所体验的应用表现。html
在考虑是否进行性能分析时,你首先要想:应用是否存在性能问题?若是有,你要进一步考虑:这个问题有多大?java
若是你不这样作,将会陷入一个陷阱——过早优化,这可能会浪费你的时间。git
为了评断应用是否存在性能问题,你应该肯定性能目标。例如,100 个并发用户的响应时间小于 1s 。而后,你须要进行基准测试,看是否达到这个目标。一个常见的错误是,在开发环境进行基准测试。事实上,你必须在生产环境进行基准测试。(实际生产环境或模拟的生产环境,后者很容易在 SaaS 实现(例如:OneAPM PHP 应用性能在线分析示例 )。github
用于基准测试的产品不少,包括 ab,siege 和 JMeter。我我的比较喜欢 JMeter 的功能集,但 ab 和 siege 更加易用。web
一旦你肯定应用存在性能问题,就须要分析其性能,实施改进,而后再一次进行基准测试,查看问题是否解决。每一次变动以后,你都该进行基准测试查看效果。若是你作了不少变动,却发现应用性能有所降低,你就没法肯定具体是哪一次变动致使了这个问题。缓存
下图是我定义的性能生命周期:服务器
致使性能降低的通常缘由中,有些至关出人意料。即使是像 PHP 这样的高级语言,代码的好坏也不多是问题的根源。在当今的硬件配置条件下,CPU 不多是性能限制的缘由。常见的缘由反而是:cookie
数据存储网络
外部资源
糟糕的代码
在 PHP 世界里,有两个大相径庭的的性能分析器——主动和被动。
主动分析器在开发过程当中使用,由开发人员启用。主动分析器收集的信息比被动分析器多,对性能的影响更大。一般,主动分析器不能用在生产环境中。XDebug 就是一种主动分析器。
由于没法在生产环境中使用主动分析器,Facebook 推出了一个被动分析器——XHProf。XHProf 是为了在生产环境中使用而打造的。它对性能的影响最小,同时收集足够的信息用于诊断性能问题。XHProf 和 OneAPM 都是被动分析器。
一般,XDebug 收集的额外信息对于通常的性能问题分析并没必要要。这意味着,被动分析器是用于不间断性能分析的更佳选择,即便是在开发环境中。
XHProf 由 Facebook 开发的,包含一个基本的用户界面用于查看性能数据。此外,Paul Reinheimer 开发了 XHGui 和一个加强的用户界面(UI)用于查看、比较和分析性能数据。
XHProf 可经过 PECL 安装,步骤以下:
$ pecl install xhprof-beta
该 pecl 命令将尝试自动更新你的 php.ini 设置。pecl 尝试更新的文件可使用如下命令找到:
$ pecl config-get php_ini
它会在指定的文件(若是有的话)顶部增长新的配置行。你可能想把他们移到一个更合适的位置。
一旦你编译了该扩展程序,您必须启用它。为此,您须要在 PHP INI 文件添加如下代码:
[xhprof] extension=xhprof.so
以后,结合 XHGui 就能轻松地执行性能分析与检查。
安装 XHGui,必须直接从 git 获取。该项目能够在 github 上找到,地址为 https://github.com/perftools/xhgui
XHGui 要求:
首先,克隆项目到任意位置。在基于 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 是以 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 等等。
在下一篇文章中,咱们将深刻研究 XHGui ,以及用于展现、比较 XHProf 数据的用户界面(本文系应用性能管理领军企业 OneAPM 工程师编译整理) 。