标签:xhprof

浏览模式: 标准 | 列表 | 图文
转perfgeeks的:记一次tps提升,做的配置变更

转perfgeeks的:记一次tps提升,做的配置变更

这次的转贴内容其实更象一个找到问题的过程,可以用来参考也可以用来思考,当你遇到问题的时候应该怎么做。
原文地址在:http://www.perfgeeks.com/?p=668
内容如下:

记一次tps提升,做的配置变更

tps低,响应时间高,并发能力差。

1.应用本身,通过xhprof找出问题代码。产生系统内核调用函数尽量避免调用。比如is_file(), time(),require/include代替require_once/include_once等。
2.尽量使用memcached缓存系统配置、模块数据、还有用户数据。减少mysqli_query()执行次数,它比较耗资源。开启mysqld的slow_query日志功能,优化那些较慢的sql查询语句。
2.通过xhprof,我们发现load和run源文件需要不少的挂钟时间,可以开启apc缓存opcode,同时设置apc.stat=off。还可以使用apc的apc_define_constants()代替php的define()
3.通过apc和memcached,收效可见,但是tps并没有提升到理想状态,同时tps不稳定,还会触底。php代码本身的优化效果甚微,对tps贡献不大。
4.重新编译php,将不必要的模块和功能禁用掉,只编译需要的。
5.配置php.ini,将不必要的模块去掉,比如gd(我们的应用不需要处理图片),soap,xhprof,mssql等。通过pmap或者lsof 可以查看一个php-cgi加载了哪些模块。减少模块加载,可以节约内存。尽量通过php.ini进行php设置,避免在代码中调用init_set操 作。比如设置时区,设置session等等。尤其data.timezone需要配置。
6.通过禁用xhprof,大概可以省下5000个cs。xhprof用完了,就应该关闭。
7.正确地设置php-fpm.max_children数量。过多的max_children浪资内存资源,还会增加cs。当然,过少的max_children会响应502。可以通过top命令观察,调整该值。
8.php-fpm使用sock方式配置。php-fpm.listen_address=/var/run/php-cgi.sock,同时nginx也需要配置fastcgi_pass指向该sock文件。
9.设置nginx.worker_processes,分别尝试了2、4、8几个值。网上大量资料说设置为cpu数*核数,其实更需要根据你的需求来设 定这个值。worker值越大,表示同时处理量大但速度更慢,相反表示处理速度能力强但数量更小。如果做为反向代理服务器,worker值可以大一点,如 果做为web逻辑服务器,值可以小一点。
10.网络IO,选择支持多路复用模型epoll,FreeBSD采用kqueue。如果网站流量小,选择select也还是不错的。
11.开启持久连接机制keep-alive,keep-alive可以复用tcp/ip连接,大量地减少了accept()系统内核调用。这里将nginx.keepalive_timeout设置为60.注意http/1.1默认开启keep-alive
12.gzip,压缩http响应输出。当响应输出量足够小,使用gzip压缩并没有意义。可以通过gzip_min_length指定跳过gzip压缩。
13.关闭nginx.access_log。通过access_log off可以不记录日志。减少不必要的磁盘I/O操作。如果开启日志功能,最好写个脚本将日志按量分割成更小的文件。
14.对于静态资源服务器,可以开启sendfile功能和设置expires缓存新鲜期。
15.将selinux设置为disabled,命令setenforce 0,只是将selinux设置为permissive,该模式会执行安全策略检查并打印警告。
16.通过chkconfig管理系统随机开启的守护进程。将不必要启动的守护进程关闭,比如sendmail, portmap, atd, netfs, nfslock等。这些守护进程浪费内存空间。
17.关闭防火墙,iptables –flush可以清除所有防火墙规则。
18.将不必要的进程关闭。比如/sbin/mingetty只需要开启3个就足够用,可以在/etc/inittab配置。比如gdm进程,通过 /etc/inittab将id:5:initdefault:改为id:3:initdefault:。等等。通过ps -ef可以查看你当前打开的进程,请确定每一个进程都”出师有名”。
19.资源限制,每个进程可以打开的文件最大数量默认是1024,通过ulimit设置更大的值(ulimit -SHn 65535)。如果没有生效,可以编辑资源限制配置文件/etc/security/limits.conf。同时别忘记了将php- fpm.rlimit_files和nginx的worker_rlimit_nofile、worker_connections设置同样大小。
20.优化磁盘IO,添加挂载参数noatime。可以编辑/etc/fstab,注意不要在/etc/fstab增加挂载参数data=writeback,会导致磁盘挂载为ro。
21.关闭ipv6内核模块
22.增加dns查询记录至/etc/hosts。比如222.73.211.215 www.perfgeeks.com
23.调整内核参数。经过一番折腾,tps有提升,但是不稳定,通过sysctl调整内核参数则稳定了。
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_recycle = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800

#net.ipv4.tcp_fin_timeout = 30
#net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024 65535

通过一番辛苦,tps终于从120升到了810,并且tps曲线平衡(几乎时条直线),cpu资源的利用率也很平衡80%的us和20%的sys。 要提高tps,首先要保证单个请求响应时间不能过长。响应时间过大,tps较难提升。更少的上下文切换和更少的系统内核调用,更少的IO操作可以换得更大 的tps。通过strace可以统计出调用了哪些系统内核调用,帮助你优化应用。减少上下文切换最有效的办法就是减少进程数量。

ubuntu 下安装xhprof

ubuntu 下安装xhprof

说实话,第一次知道xhprof是在某次小型聚会上,当时echo演示了一下xhprof的作用,并稍作了一些介绍。嗯横,当时出了点小故障,xhprof,安装一直失败,最后就看了一下代码和一些图形界面分析的演示。
由于昨天刚刚安装ubuntu开始了我的装B之旅,所以我偷偷的看了看xhprof,想看看是否能够正常安装。却发现,原来是这样的简单。。。

$wget http://pecl.php.net/get/xhprof-0.9.2.tgz
嗯,这个版本是pecl上最新的版本了。很久没有更新过了。
$tar zxf xhprof-0.9.2.tgz
$cd xhprof-0.9.2
$apt-get install php5-dev
这一步必须,否则无法使用phpize来编译这个so,大约需要20多M的下载,安装完之后,继续。。
$cd extension
$phpize
$./configure –with-php-config=/usr/bin/php-config
这是由于我们的PHP也是apt-get 回来的,所以就不用变了啦。
$make && make install
编译完后,会提示你make test
$make test
当然,在运行途中没有出错的话,可以不运行。
然后,到ini存放的目录里建一个xhprof.ini
$cd /etc/php5/conf.d/
$vim xhprof.ini
输入以下内容。。。
[xhprof]
extension=xhprof.so
xhprof.output_dir=/opt/xhprof/
上面这个dir默认是不存在的,所以需要到/opt/目录下新建一下这个目录。反正都是在自己的机器上,直接chmod 0777 就完事了
嗯横,现在重启一下apache2
$/etc/init.d/apache2 restart
看一下PHPINO,会发现里面多了xhprof了,就两行信息。。。
测试代码可以看一下官方的documention。地址在:http://mirror.facebook.net/facebook/xhprof/doc.html
可以根据doc中的例子写一个简单的代码测试一下:

<?php

function bar($x) {
if ($x > 0) {
bar($x - 1);
}
}

function foo() {
for ($idx = 0; $idx < 2; $idx++) {
bar($idx);
$x = strlen("abc");
}
}

// start profiling
xhprof_enable();

// run program
foo();

// stop profiler
$xhprof_data = xhprof_disable();

// display raw xhprof data for the profiler run
print_r($xhprof_data);

Over了

XHProf介绍

XHProf介绍

上次我在博客里提到xhprof是文锋的一次聚会,其中echo就提出了这个xhprof,轻量级,fackbook常用,当然echo他们用的也很多。

说实话我在之前没有了解过xhprof,大多数情况下还是用xdebug,但在线上的时候,肯定是不敢开这样耗资源的玩意。所以就对xhprof关心了一点点。再后来看了一点资料,同时echo那天也贴出了部分代码,也基本上是在用概率的方式提取LOG,或者指定某种具体条件的情况下记录,以节省资源。

今天在闲逛的时候看到有人把中文手册翻译了。感慨万分,好久没有做过这种事情了。不是我太懒,而是真的做不来。

原文在这里:http://www.162cm.com/p/xhprofdoc.html

作者这样介绍自己:

翻译:徐仁禄  <xurenlu [at] gmail.com > 
原文地址: http://mirror.facebook.net/facebook/xhprof/doc.html
初次翻译,大部分是google translate tookit工具给翻的,稍微修改了下。如遇错误,还请来信指出。谢谢!

内容如下:

目录

  1. 导言
  2. XHProf 概况
  3. 安装XHProf扩展
  4. 使用XHProf进行性 能分析
  5. 设 置XHProf用户界面
  6. 在生产环境中使用 XHProf注意事项
  7. 轻量级采样模式
  8. 附加功 能
  9. 信赖
  10. 鸣 谢
  1. 导言

    XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情 况。一个函数的开销,可细分成调用者和被调用者的开销。原始数据收集部分是用纯C实现的,是一个名叫xhprof的 Zend扩展 。XHProf有一个简单的HTML的用户界面( PHP写成的)。基于浏览器的性能分析用户界面能更容易查看,或是与同行们分享成果。也能绘制调用关系图。

    XHProf报告往往可以有助于理解被执行的代码的结构。的等级性质的报告可用来确定,例如,什么链要求导致了所谓的特殊 功能得到。

    XHProf可以比较两次运行的结果(又名“差异报告”)或是从多次运行得到的汇总数据。差异和汇总报告,就像单一运行报 告一样,也提供“平板”以及“分层”的性能分析视图。

    XHProf是一种轻量级的性能分析工具。在数据收集阶段,它记录调用次数的追踪和包容性的指标弧在动态 callgraph的一个程序。它独有的数据计算的报告/后处理阶段。在数据收集时,XHProfd通过检测循环来处理递归的函数调用,并通过给递归调用 中每个深度的调用一个有用的命名来避开死循环。

    XHProf的轻量级性质和汇聚功能,使得它非常适合用于收集“生产环境”的性能统计数据的统计。[见用于生产环境的补充 说明。 ]


    例如,XHProfLive (不属于开源的工具包),是Facebook使用的一个全系统的性能监测系统,建立在XHProf的基础之上 。 XHProfLive不断收集函数级别的Profiler资料,这些资料来自生产环境中运行中的示例页面[用xhprof来收集] 。然后XHProfLive汇总指定的时候,页面类型,来取得各个页面的性能数据,可以帮助解决各种问题,如:特定的某个网页的函数级的性能情况怎样?在 所有网页中,或者对某一具体的网页,foo 函数的开销如何?在过去的一小时/天/周中,哪些函数返回的次数最多?某个页面/函数的执行时间的变化趋势如何?等等。


    由Facebook最初开发的XHProf在2009年3月开放源代码。

  2. XHProf概况

    XHProf提供的功能:

    • 扁平的性能概要(截 图 )

      提供函数级别的性能信息,例如调用次数,其中包括/独家壁时间,内存使用情况,和CPU时间。

    • 分层剖析(父/子{0视图){/0} ( 截 图 )

      对每一个函数,它提供了一个断点,个崩溃的要求和时间每母公司(来电)和儿童(被调用) ,如:

      • 哪些函数调用了指定的函数,各自调了多少次?
      • 一个特定的函数调用了哪些函数?
      • 在被一个特定的函数调用时,某个函数一共耗去了多少时间 。
    • 差异报告

      出于各种原因,您可能需要比较从两个XHProf运行中得到的数据-找出是什么造成了从一个版本到另一个版本的退 步,或是评估您将要做的优化的性能提升。

      阿差异报告考虑两分,作为输入,并提供两个平面功能级别差异的信息,和层次信息(细目差异的父母/儿童职能)的每 个功能。

      差异报告里的“平板”视图指出了最主要的退步或改进。

      点击差异报告平板视图中的函数,进入“层次”(或父/子)视图。我们可以得到的具体的父子函数的差异。

    • Callgraph视图

      性能数据也可以通过callgraph视图来查看 。callgraph 会高亮显示程序的关键路径。

    • 内存剖析

      XHProf的内存剖析模式能有助于跟踪那些申请大量内存的函数。

      值得澄清的是,XHProfu并不严格跟踪所有分配/释放内存的操作。相反,它使用了一种简化思路。他记录了每个 函数进入和结束后的内存的增减。它还记录每个函数分配内存的峰值的变化。

    • XHProf记录include, include_once, require and require_once require_once操作,就像他们是函数一样。那些被包含文件的名字被用来产生假的函数的名字。
    • 术语表

      1. Inclusive Time (或子树执行时间) :[包括子树执行时间的所有执行时间。]
      2. Exclusive Time/Self Time :[函数执行本身的时间花费。]不包括子树执行时间。
      3. Wall时间 :又名经过的时间或挂钟时间。
      4. CPU时间 : CPU时间在用户空间+ CPU时间在内核空间
    • 特殊函数的命名约定

      1. main():一个虚构的函数,这是所有调用的根节点。
      2. load::<filename> 和 run_init::<filename>:

        XHProf 跟踪PHP的include/require操作,和跟踪函数调用一样。

        例如, include “lib/common.php"; 操作看起来像调了两个XHProf函数:

        • load::lib/common.php - 内核加载和编译文件的工作。[注:如果您使用的了PHP的opcode 缓存比如APC之类的,只有当缓存失效时才会去编译。
        • run_init::lib/common.php -由于包含操作引起的初始化操作等。
      3. foo@<n> :意味着这是一个foo()函数的递归调用。<n>代表递归深度。递归可能是直接的,(比如由于foo() --> foo() ) ,也可能是间接的(如由于foo()-> goo() ->foo()。
    • 限制

      真正的层次剖析器会在每一个数据采集点记录完全的调用堆栈。接下来,能够回答这些问题,如:第三次foo()调用 的开销是多少?或是当调用栈是a()->b()->bar()时bar()函数的开销是多少?

      XHProf只记录一级的调用上下文,因此只能回答关于一级一级函数调用的问题。事实证明,在实践中这是最主要的 利用情况。

      为了使这个更具体,看看下面的例子。

      假设你有:

      1 call from a() --> c()
      1 call from b() --> c()
      50 calls from c() --> d()

      虽然XHProf可以告诉你, d()被c()调用了50次,却不能告诉你,有多少次分别是由a()和b()引起的。[我们可以推测,也许有25次是因为a(),有25次是由于b(), 但未必如此。 ]

      然而在实践中,这没什么大不了。

  3. 安装XHProf扩展

    这个扩展在"extension"子目录里。


    注:Windows的版本还没有实现。目前我们已经在Linux/FreeBSD 上测试了xhprof。

    0.9.2及以上版本的XHProf也正计划着移植到Mac OS下。[我们在Mac OS 10.5下测试过。]

    注: XHProf使用RDTSC指令(时间戳计数器)来实现一个真正的低资源消耗的计数器[针对elapsed time]。因此目前xhprof还 只适用于x86架构。此外,因为RDTSC的数据不能在CPU间同步,在剖析时xhprof会将程序绑定在单个 的CPU。

    如果SpeedStep技术是打开的,XHProf的基于RDTSC定时器的功能就不能正 常工作了。这项技术在某些英特尔处理器上是可用的。[注:苹果台式机和笔记本电脑一般都将SpeedStep技术预设开启。使用XHProf,您需要禁用 SpeedStep技术。 ]


    下面的步骤,应该在Linux / Unix环境下进行。

    % cd <xhprof_source_directory>/extension/
    % phpize
    % ./configure --with-php-config=<path to php-config >
    % make
    % make install
    % make test

    php.ini文件 :您可以更新您的php.ini文件来自动加载您的扩展。将以下内容添加到你的php.ini文件。

    [xhprof]
    extension=xhprof.so
    ;
    ; directory used by default implementation of the iXHProfRuns
    ; interface (namely, the XHProfRuns_Default class) for storing
    ; XHProf runs.
    ;
    xhprof.output_dir=<directory_for_storing_xhprof_runs >
  4. 使用XHProf来做性能分析

    用下面的示例程序来试着产生一些原始的性能数据:

    foo.php

    <?php

    function bar($x) {
    if ($x > 0) {
    bar($x - 1);
    }
    }

    function foo() {
    for ($idx = 0; $idx < 2; $idx++ ) {
    bar($idx);
    $x = strlen("abc");
    }
    }

    // start profiling
    xhprof_enable();

    // run program
    foo();

    // stop profiler
    $xhprof_data = xhprof_disable();

    // display raw xhprof data for the profiler run
    print_r($xhprof_data);

    运行上面的测试程序:

    % php -dextension=xhprof.so foo.php

    你应该得到的输出如下:

    Array
    (
    [foo==>bar] => Array
    (
    [ct] => 2 # 2 calls to bar() from foo()
    [wt] => 27 # inclusive time in bar() when called from foo()
    )

    [foo==>strlen] => Array
    (
    [ct] => 2
    [wt] => 2
    )

    [bar==>bar@1] => Array # a recursive call to bar()
    (
    [ct] => 1
    [wt] => 2
    )

    [main()==>foo] => Array
    (
    [ct] => 1
    [wt] => 74
    )

    [main()==>xhprof_disable] => Array
    (
    [ct] => 1
    [wt] => 0
    )

    [main()] => Array # fake symbol representing root
    (
    [ct] => 1
    [wt] => 83
    )

    )

    注:The raw data only contains "inclusive" metrics. For example, the wall time metric in the raw data represents inclusive time in microsecs. Exclusive times for any function are computed during the analysis/reporting phase.

    注意:默认情况下只有调用次数和占用时间是记录了的。您也可以选择同时记录CPU 时间和/或单纯记录内存使用量。将下面这一行:

    xhprof_enable();
    换成:
    xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); ;

    您应该得到如下的输出:

    Array
    (
    [foo==>bar] => Array
    (
    [ct] => 2 # number of calls to bar() from foo()
    [wt] => 37 # time in bar() when called from foo()
    [cpu] => 0 # cpu time in bar() when called from foo()
    [mu] => 2208 # change in PHP memory usage in bar() when called from foo()
    [pmu] => 0 # change in PHP peak memory usage in bar() when called from foo()
    )

    [foo==>strlen] => Array
    (
    [ct] => 2
    [wt] => 3
    [cpu] => 0
    [mu] => 624
    [pmu] => 0
    )

    [bar==>bar@1] => Array
    (
    [ct] => 1
    [wt] => 2
    [cpu] => 0
    [mu] => 856
    [pmu] => 0
    )

    [main()==>foo] => Array
    (
    [ct] => 1
    [wt] => 104
    [cpu] => 0
    [mu] => 4168
    [pmu] => 0
    )

    [main()==>xhprof_disable] => Array
    (
    [ct] => 1
    [wt] => 1
    [cpu] => 0
    [mu] => 344
    [pmu] => 0
    )

    [main()] => Array
    (
    [ct] => 1
    [wt] => 139
    [cpu] => 0
    [mu] => 5936
    [pmu] => 0
    )

    )

    在分析时跳过内置函数

    默认情况下, PHP的内置函数(如strlen )也被分析了。如果您不希望分析内置函数(为了进一步减少性能分析的开销貌相或减小产生的原始数据) ,您可以使用XHPROF_FLAGS_NO_BUILTINS标 志,例如:

    // do not profile builtin functionsxhprof_enable ( XHPROF_FLAGS_NO_BUILTINS ) ;

    在性能分析时忽略特定函数( 0.9.2或更高版本支持)

    从0.9.2版本的xhprof ,你可以告诉XHProf在性能分析时忽略一些指定函数。这样,您就可以忽略,像功能用于间接函数调用,如call_user_func和call_user_func_array的 函数 。这些不必要的中间层,因为他们乱七八糟的父-子关系和间接的互相调用,使XHProf报告难以理解。

    要设定要忽略的函数列表,可以在分析时给xhprof_enable函 数 指定第二个参数[是个可选参数] 。例如,

    // elapsed time profiling; ignore call_user_func* during profiling
    xhprof_enable(0,
    array('ignored_functions' => array('call_user_func',
    'call_user_func_array')));

    or,

    // elapsed time + memory profiling; ignore call_user_func* during profiling
    xhprof_enable(XHPROF_FLAGS_MEMORY,
    array('ignored_functions' => array('call_user_func',
    'call_user_func_array')));
  5. 设置XHProf用户界面

    1. PHP源码目录结构

      XHProf的用户界面的由PHP实现。代码存放在两个子目录中: xhprof_html/和xhprof_lib/ 。

      xhprof_html目录包含了3个顶级PHP页面。

      • index.php :查看一个单一运行或差异报告。
      • callgraph.php :以图片的形式查看一次XHProf运行的调用关系图。
      • typeahead.php :在XHProf的报告中被后台调用来进行函数的自动补全。

      该xhprof_lib目录包含进行分析和显示的支持代码 (计算 扁平的性能信息,计算diffs,从多次运行中汇总数据等等) 。

    2. Web服务器配置:您需要确保您的Web服务器有权限读取xhprof_html/目 录可,并且能运行PHP脚本。

    3. 管理XHProf运行

      客户端能很灵活地保存他们从XHProf运行中得到的XHProf原始数据。用户界面层 的XHProf提供了一个 iXHProfRuns接口(见xhprof_lib / utils / xhprof_runs.php ),客户端可以利用。这使得客户端能够告诉用户界面层,如何获取XHProf运行后产生的对应数据。

      XHProf的UI 库自带的有一个基于文件的iXHProfRUns接口实现,即“ XHProfRuns_Default”(见xhprof_lib/utils/xhprof_runs.php)。这个自带的实现将XHProf运行结 果存在ini配置的xhprof.output_dir参 数指定的某个目录下。

      一次XHProf运行,必须用一个命名空间和运行编号来唯一确定。

      一)XHProf数据的永久保存 :

      假设您使用的iXHProfRuns接口的XHProfRuns_Default这 个默认实现方式,一个典型的XHProf运行并保存结果的操作可能就是这样子的:

      // start profiling
      xhprof_enable();

      // run program
      ....

      // stop profiler
      $xhprof_data = xhprof_disable();

      //
      // Saving the XHProf run
      // using the default implementation of iXHProfRuns.
      //
      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();

      // Save the run under a namespace "xhprof_foo".
      //
      // **NOTE**:
      // By default save_run() will automatically generate a unique
      // run id for you. [You can override that behavior by passing
      // a run id (optional arg) to the save_run() method instead.]
      //
      $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

      echo "---------------\n".
      "Assuming you have set up the http based UI for \n".
      "XHProf at some address, you can view run at \n".
      "http://<xhprof-ui-address >/index.php?run=$run_id&source=xhprof_foo\n".
      "---------------\n";

      上述代码就会将运行结果保存在xhprof.output_dir ini参数指定的特定目录下。文件的名称可能会是49bafaa3a3f66.xhprof_foo类似的东 东 ;两部分分别是运行编号( “ 49bafaa3a3f66 ” )和命名空间( “ xhprof_foo ” )。[如果您想创建/指定自己的run ID (如数据库中的序列号,或时间戳) ,您可以通过明确的给save_run方法 指定一个run id。

      b )使用自己实现的iXHProfRuns

      如果您希望您的XHProf运行存储在不同的数据库(例如用一个压缩格式,或者其他什么地方比如数据库等),您需实现一个类,这个实必须实现 iXHProfRuns ( )接口。

      您还需要修改“xhprof_html/"目录中3个主要的PHP入口文件 (index.php , callgraph.php , typeahead.php ),使用新的类而不是默认的类XHProfRuns_Default 。改变3个文件的这一行:

      $xhprof_runs_impl = new XHProfRuns_Default();

      您还需要“include”声明了上述class的文件。

    4. 从用户界面中访问各次运行

      一)看单一运行报告

      要查看run id是<run_id>和命名空间是<namespace>的报告,访问URL:

      http://<xhprof-ui-address>/index.php?run=<run_id>&source=<namespace>

      例如,

      http://<xhprof-ui-address>/index.php?run=49bafaa3a3f66&source=xhprof_foo

      二)查看diff报告

      要查看命名空间<namespace>下runid分别是< run_id1>和<run_id2>的两个报告,访问URL:

      http://<xhprof-ui-address>/index.php?run1=<run_id1>&run2=<run_id2>&source=<namespace>

      三)汇总报告

      您也可以指定一组run id来汇总得到您想要的报告视图。

      如果你有三个XHProf运行,都在"benchmark‘命名空间下,run id分别是1,2,3。要查看这些运行的汇总报告:

      http://<xhprof-ui-address>/index.php?run=1,2,3&source=benchmark

      加权汇总 :进一步假设,上述3个运特分别对应三种程序,p1.php,p2.php和p3.php ,通常以20%,30%,50%概率混合:要查看汇总报告所对应的加权平均数这些运行使用:

      http://<xhprof-ui-address>/index.php?run=1,2,3&wts=20,30,50&source=benchmark

  6. 在生产环境中使用XHProf的注意 事 项

    这里给出一些意见和准则。您的情况可能会有所不同:

    • CPU的计时器( getrusage )在Linux上开销很大。为了在函数级别更有用,这个是粗粒度的(毫秒精确度,而不是微秒水平)。因此,使用XHPROF_FLAGS_CPU模式时, 在报告里,数字上的误差往往会更高。

      我们建议在生产环境中使用 "占用时间+内存" 来做性能分析。[注:内存性能分析模式的额外开销很低。 ]


      // elapsed time profiling (default) + memory profiling
      xhprof_enable(XHPROF_FLAGS_MEMORY);
    • 对随机抽样的部分page/request来做性能分析,对于获取您的生产环境的负载 情况特征数据,其实足够好了了。

      分析万分之一的请求,可以用下面的代码:

      if (mt_rand(1, 10000) == 1) {
      xhprof_enable(XHPROF_FLAGS_MEMORY);
      $xhprof_on = true;
      }

      request结束时(或是在退出函数中) ,您可以这么做:

      if ($xhprof_on) {
      // stop profiler
      $xhprof_data = xhprof_disable();

      // save $xhprof_data somewhere (say a central DB)
      ...
      }

      然后,您就可以用xhprof_aggregate_runs()来按时间(比如,每5 分钟/每小时/每天),或是按页面类型/request类型来汇总。

  7. 轻量级采样模式

    Xhprof扩展还提供了一个轻量级采样模式 。采样间隔为0.1秒。采样记录了整个函数调用堆栈。如果想以增加极低的负载作代价来进行性能监控和诊断,采样模式就是你想要的。

    XHProf扩展提供的与采样模式相关的函数有xhprof_sample_enable()和xhprof_sample_disable() 。

    [ 待定 :关于采样模式更详细的文档。 ]

  8. 附加功能

    xhprof_lib/utils/xhprof_lib.php文 件包含额外的库函数,可用于维护/汇总XHProf运行结果。

    例如:

    • xhprof_aggregate_runs() :可用于多次XHProf运行结果汇总到一个单一的运行。这可以帮助您使用XHProf来建立一个全系统“的函数级别”的性能监测工具 。 [例如,您可以在生产环境中定期抽样XHProf的数据,产生小时/日级别的报告。 ]
    • xhprof_prune_run() :汇总大量XHProf运行结果(特别是如果它们对应不同类型的程序)将可能导致callgraph规模变得太大。您可以使用xhprof_prune_run功 能来修剪的callgraph数据中只占总运行时间中很小比例的子树。
  9. 依赖性

    • JQuery的Javascript :在提示和函数名称补齐上 ,我们利用了JQuery这个JavaScript库。JQuery是基于MIT和GPL licencse ( http://docs.jquery.com/Licensing ) 的。XHProf用到的JQuery相关代码,在xhprof_html/jquery子 目录。
    • dot(图像生成工具) :调用关系视图工具( [查看Callgraph ] )这个功能依靠dot工具实现。 “点”是一种绘制/生成有向图的工具。
    • 鸣谢

      查询分析结果的HTML用户界面受到了Oracle 的存储过程语言PL/SQL里的一个相似的小工具的启发。但是仅仅如此,他们的内部性能分析过程是完全不同的。

--EOF--
额,样式我不管了。觉得不好的还是查看原文吧。
PHPChina活动涉及PPT在线观看

PHPChina活动涉及PPT在线观看

上周六的phpchina搞的活动可以通过echo谈xhprof,cache and long-polling查看,其中echo的ppt可以在线观看了,当然你也可以下载到本地。

不得不说的是,ppt上可以展现的内容确实有点少,如果身在上海,没有去听echo讲课,确实有点遗憾。

PPT下载在这里:3804062d1ae2806c13cbf2738d9a048c

phpchina活动-echo谈xhprof,cache and long-polling

pea的活动除了这次外,我是真没有参加过,不过在与会的同时听文峰说也好多时间没办了,所以也没有感觉啥。这次的内容主讲是蛋定工作室www.jt-tech.net的echo,讲了xhprof ,cache,以及long-polling的一些应用及讲解,因为对xhprof以及long-polling有点兴趣,所以就参加了。当然还有另外的原因:echo在群里研究session的时候,非常透彻,也想看看他平时用啥工具之类的;另外就是想看看11爷、四爷以及逍遥等人长啥样。
好象以前在drupal研讨会的时候见过文峰,应该也是4年前了吧,那时候好象他非常胖,也曾经找过我让我谈谈有没有什么 经验可谈的。
值此今天这一课,发现我还是离专业差的很远,都是走的野路子啊。果然是人不学习就要退步,野路子能走一时,是走不了一世的。
看着echo(蛋定工作室)的PPT上那些工具,发现,我除了x-debug外,真是一个都没有用过。丢人,不过想想也没啥,在篱笆的时候性能啥的都扔给运维了,当然他们也没有查出啥问题来,可能还是篱笆的访问量不大的原因吧?现在想想那样垃圾的代码都没有跑出问题而java的一跑就嗝屁了,也真是意外。
谈了很多废话,还是讲讲今天的内容吧,比较有印象的当然也正是我想了解和关注的xhprof以及long-polling。web client cache这玩意还真没有什么 可讲的,对着yahoo的14条军规慢慢查,慢慢改吧。【后来变22条军规了】
xhprof,是facebook提交的pecl库(好象Echo是这么说的),可以在运行时候查看效率,这点其实才是我最关注的。echo说xhprof对于那些只针对某些人出现问题,而其他用户死活折腾不出、故障BUG无法重现的性能优化、log记录非常有用。在看了他给出的wikimedia的图片,以及他实际项目中的代码片段后,觉得果然是非常有意义。对于性能的影响好象也不是很大。
xhprof,在这里我就不多介绍了,google搜索的第一条就是老王的笔记:体验XHProf_老王的技术手册_百度空间,想看的可以移步去参观一下,过两天我也会转到博客上来,毕竟这东西确实值得试一下,特别是想用在wordpress上,看看性能瓶颈到底在哪里,是否可以进行优化。

这张图真的很吸引我,可以让我检查页面中哪些地方消耗的资源最大:
ec1d34a3c897ceb95fc901683d4e990a

long-polling,对于做WEB的人来说,特别是SNS的人,用的地方就多了。目前最多的用途可能就是用来检测是否有系统消息提示,如果一直用ajax,那么你会发现定期polling的时候,很耗资源。如果不信,你可以看一下thinksns,他取信息等 资料就是这样的处理。但其实long-polling也能算是用ajax在获取信息,但他连接后并不能算是断开,由服务器一直在while(true)循环。echo也给了一些测试代码。当然,其实这方面很早就研究和接触过,不过仅限于表面,因为我没有理解当并发非常大时候,这个性能如何处理。echo是说通过ulimit -n 来调整最大用户数和最大进程数来增加,因为理论上都是根据内存大小和利用率来控制,说白了,你没内存,代码再好也经不起折腾。并发也永远上不去。

很多东西,一时间可能用语言无法表达,但总算是有收获,最后抽奖的时候,报数时,号码是13,哦,原来我还是可以装 13的。over
看下一次是否再有收获。上大课确实不如上小课,有时候人多了并不一定能够讲得出话。
听说echo要把PPT放出来,到时候可以看看。
最后说一下web client cache。关于这个玩意,对于if-modified这东西等等,现在用的真是少了,以前在做垃圾网站时,都是强行指定e-tag,内容页的e-tag永远不变,首页、列表表的e-tag一天变一次,以保证性能的最大体现。其实,抛开用户登录,如果内容页是ajax的widget,那真的是可能永远不变的。不过现在都是为了更好的吸引用户,在cms中的相关文章、推荐文章、推广文章等 都是实时更新的,所以效率也相对下降一点点喽。不过,可以考虑e-tag为一天,这样对于当天频繁访问的用户速度会明显增加,但,不知道对搜索引擎会怎么样。
杂谈而己