Tideways和xhgui打造PHP非侵入式监控平台

当我们发现生产环境的某个接口执行时间特别长时应该怎么做?直接登录线上机器单步调试?打大量的log然后分析? 一般我们可以把分析流程拆分为如下几步操作:

  1. 分析开发环境下执行是否会慢;如果是代码问题,在开发环境下就能检测出来;
  2. 分析预发环境执行是否会慢;如果是数据库或者第三方扩展问题,在预发环境就能检查出来。
  3. 从生产环境摘一台机器,分析代码执行慢的原因;如果是机器的问题,在生产环境就能检查出来。

1,2,3步骤都需要去分析代码,看哪部分执行时间长。如果人工一句一句代码去排查,不但要耗费大量时间还会导致用户流失。大多时候我们会使用第三方的分析工具tideways或者xhprof来快速发现问题。选择哪一个工具比较好呢?xhprof虽然来自facebook但已经很久不更新,官方源已经显示This package is abandoned and no longer maintained(此包已废弃,不再维护)。tideways恰好相反,一直有商业公司在维护,并且积极的支持了PHP7。两个扩展都是开源的,综上所述我建议大家选择tideways来分析代码。

tideways扩展能把每条请求生成详细的执行日志,通过对日志做简单的分析就能看到程序哪部分耗时最长,这里可以使用xhprof的UI程序(xhprof生成的日志和tideways生成的日志格式通用),交互虽然不大友好但是够用了。如果想有更好的视觉效果,建议下载xhgui,一款基于Bootstrap的xhprof UI程序。

在开始搭建PHP非侵入式监控平台之前,我需要解释几个问题。

一. Tideways这家公司如何盈利?

Tideways这家公司与Sentry的营销模式一样,都是卖存储服务和数据分析服务。

tideways.so扩展是开源的可以免费使用。但是tideways.so扩展只能生成日志文件,我们获得日志文件后还需要花很长时间去整理和分析。如果你购买了Tideways的服务,就能无缝的将日志存储到他们的服务器,登录他们提供的后台就能看到项目代码和服务器的运行状况。加上各种可视化的图表展示体验非常的好,有很多大公司愿意付费。

二. 安装扩展后代码改动会不会很大?

tideways.so扩展提供的监控方式是非侵入式的监控,不会对当前项目有任何的影响。我们只需要在Nginx配置文件中加上一行配置即可:

fastcgi_param PHP_VALUE “auto_prepend_file=/home/admin/xhgui/external/header.php”;

代码的含义:在执行主程序前都运行我们指定的PHP脚本

具体如何安装这个服务,我在文章的下半部分会详细说明。现在仅需要知道『非侵入式的监控』不用改动一行项目代码。

三. 每个请求都生成日志会不会影响服务性能?

用户的每次请求都生成执行日志对服务性能会有轻微的影响。虽然tideways.so扩展提供的监控方式是非侵入式的,但对CPU和内存的消耗是不可忽略的。为了减少对内存和CPU的消耗,我们可以控制生成日志的频率,还能编写生成日志的规则。默认频率为1%(每100个请求生成1条日志,这里的概率非绝对)。

如果有多台服务器,只需要对一台进行监控,机器比较多的话可以每个机房一台。

搭建非侵入式监控环境

extension=mongodb.so
extension=tideways.so
  • 安装mongodb-server
  • 安装xhgui;
cd xhgui-branch
php install.php

你也可以通过Composer去安装,composer require laynefyc/xhgui-chinese

修改配置文件,如果你的MongoDB安装在当前机器可以不用修改xhgui的配置文件,否则你需要在配置文件中修改MongoDB的连接ip和域名,路径如下:xhgui/config/config.default.php

// Can be either mongodb or file.
   /*
   'save.handler' => 'file',
   'save.handler.filename' => dirname(__DIR__) . '/cache/' . 'xhgui.data.' . microtime(true) . '_' . substr(md5($url), 0, 6),
   */
   'save.handler' => 'mongodb',

   // Needed for file save handler. Beware of file locking. You can adujst this file path
   // to reduce locking problems (eg uniqid, time ...)
   //'save.handler.filename' => __DIR__.'/../data/xhgui_'.date('Ymd').'.dat',
   'db.host' => 'mongodb://127.0.0.1:27017',
   'db.db' => 'xhprof',
  • 测试MongoDB连接情况并优化索引;
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 } )
  • 配置Nginx;

    fastcgi_param PHP_VALUE "auto_prepend_file=/Users/markstory/Sites/xhgui/external/header.php";

本文转载 http://blog.it2048.cn/article-tideways-xhgui/