关于改善xhprof使用情况的设想


自从去年将xhprof用在生产环境以来,对生产环境的程序调试,性能优化都带来很多便利。但是在使用过程中,还是有一些细节需要改善。

问题

    • xhprof的profile日志直接以文件形式保存在生产服务器上,需要定时清理,或者收集起来移动到查看日志的工具机上。
    • 由于xhprof生成的profile是一个大数组,所以保存到文件时使用了标准的php serialize,日志文件偏大,一个不留神就容易占用很多服务器磁盘空间。
    • 查看日志列表时,一个个点开查看比较费劲。

针对这几个问题,我有一些小小的设想。

日志存放

部署一个中央日志服务器,采用facebook的scribe来收集日志。生产环境的服务器产生的xhprof日志,都写入到scribe的客户端,由客户端自动同步到中央日志服务器的scribe上,不占用本地的存储空间。在代码上的改动也比较小,只要基于iXHProfRuns接口实现一个XhprofRuns类,调整save_run方法的存储方式即可。

更换序列化方法

xhprof默认是将profile信息用php原生的序列化方法处理后进行保存,而我在前两天比较过igbinary vs serialize vs json_encode的性能和占用字节数,这个测试里igbinary在各方面都有一定优势,尤其是占用存储空间会大幅度减小,所以我只要更换序列化方法为igbinary_serialize即可获得改善。

优化列表展示

我已经厌倦挨个查看profile日志的大图,费时费力还没有针对性。所以我现在的做法是,在profile日志的列表中将前1000个日志的总体执行时间直接输出到列表中,并且将执行时间过长的日志用红色粗体标识。做了这个小小的改动之后,当我想要去视察一下运行情况时,就把日志列表中那些红通通的链接点开看看就行了,真正的省时省力。

如何从xhprof日志文件中获取执行时间?简单的代码如下


/**
 * 由xhprof日志获得执行时间
 *
 * @param string $log xhprof日志的文件路径
 * @return int 执行时间
 */
function getSpentTime($log) {
  $profile = unserialize(file_get_contents($log));
  return $profile['main()']['wt'] / 1000;
}

4 responses to “关于改善xhprof使用情况的设想”

  1. 我的做法是直接把保存profile的文件名设定为: {$time}_{$mem}_{$scriptname}_{$timestamp}.{$microtime}
    然后每天直接按文件名排序,取出前几个看看,其他的都删掉。

  2. 命名挺长的,我直接用profile的ctime来排序,然后将日志按日期归档。只保留一个月的,以后用来做比较。

  3. /**
    * 由xhprof日志获得执行时间
    *
    * @param string $log xhprof日志的文件路径
    * @return int 执行时间
    */
    function getSpentTime($log) {
    $profile = unserialize(file_get_contents($log));
    return $profile[‘main()’][‘wt’] / 1000;
    },
    我感觉这种方式适合我,谢谢分享

Leave a Reply

Your email address will not be published. Required fields are marked *