PHP 性能分析第一篇: Xhprof & Xhgui 介绍

MicrosoftInternetExplorer4
0
2
DocumentNotSpecified
7.8 磅

Normal

0

@font-face{
font-family:"Times New Roman";
}

@font-face{
font-family:"宋体";
}

p.MsoNormal{
mso-style-name:正文;
mso-style-parent:"";
margin:0pt;
margin-bottom:.0001pt;
mso-pagination:none;
text-align:justify;
text-justify:inter-ideograph;
font-family:'Times New Roman';
mso-fareast-font-family:宋体;
font-size:10.5000pt;
mso-font-kerning:1.0000pt;
}

span.msoIns{
mso-style-type:export-only;
mso-style-name:"";
text-decoration:underline;
text-underline:single;
color:blue;
}

span.msoDel{
mso-style-type:export-only;
mso-style-name:"";
text-decoration:line-through;
color:red;
}
@page{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}@page Section0{
margin-top:72.0000pt;
margin-bottom:72.0000pt;
margin-left:90.0000pt;
margin-right:90.0000pt;
size:595.3000pt 841.9000pt;
layout-grid:15.6000pt;
}
div.Section0{page:Section0;}

注:这是我们 PHP
应用性能分析系列的第一篇,阅读第二篇可深入了解
xhgui
,第三篇则关注于性能调优实践。

什么是性能分析?

性能分析是衡量应用程序在代码级别的相对性能。性能分析将捕捉的事件包括:CPU
的使用,内存的使用,函数的调用时长和次数,以及调用图。性能分析的行为也会影响应用性能。

影响的程度取决于基准测试。基准测试在外部执行,用于衡量应用真实性能。所谓真实性能,即终端用户所体验的应用表现。

什么时候应该进行性能分析?

在考虑是否进行性能分析时,你首先要想:应用是否存在性能问题?如果有,你要进一步考虑:这个问题有多大?

如果你不这样做,将会陷入一个陷阱——过早优化,这可能会浪费你的时间。

为了评断应用是否存在性能问题,你应该确定性能目标。例如,100
个并发用户的响应时间小于
1s
。然后,你需要进行基准测试,看是否达到这个目标。一个常见的错误是,在开发环境进行基准测试。事实上,你必须在生产环境进行基准测试。(实际生产环境或模拟的生产环境,后者很容易在
SaaS
实现(见:
OneAPM
性能在线分析)。

用于基准测试的产品很多,包括 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-getphp_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 -S0: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
数据的用户界面 。

�����x������

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容