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

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
日志服务 SLS,月写入数据量 50GB 1个月
简介: 当我们发现生产环境的某个接口执行时间特别长时应该怎么做?是不是直接登录线上机器单步调试?或者打大量的log然后分析? 一般我们可以把分析流程分为如下几步操作: 分析开发环境下执行是否会慢; 如果是代码问题,在开发环境下就能检测出来; 分析预发环境执行是否会慢; 如果是数据库或者第三方扩展问题,在预发环境就能检查出来。

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

云栖社区的MarkDown渲染做的太差了,编号都错位,大家还是到我的博客看吧

  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-branch/external/header.php";

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

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

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

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

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

搭建非侵入式监控环境

  1. 安装PHP mongodb扩展;

    sudo pecl install mongodb

  2. 安装PHP tideaways扩展;

    tideaways的文档写的非常详细,安装tideaways扩展(官方文档) 这里我用Centos举例。

    1. echo "[tideways]
      name = Tideways
      baseurl = " > /etc/yum.repos.d/tideways.repo

    2. rpm --import https://s3-eu-west-1.amazonaws.com/qafoo-profiler/packages/EEB5E8F4.gpg

    3. yum makecache --disablerepo=* --enablerepo=tideways

    4. yum install tideways-php tideways-cli tideways-daemon

    PS: MarkDown的语法转换可能有部分问题,容易把中划线转没了,这里建议安装时从官网COPY命令,安装tideaways扩展

  3. 修改php.ini文件;

    我们需要在php.ini文件中引入扩展

     [mongodb]
     extension=mongodb.so
     [tideways]
     extension=tideways.so
     ;不需要自动加载,在程序中控制就行
     tideways.auto_prepend_library=0
     ;频率设置为100,在程序调用时能改
     tideways.sample_rate=100
    
  4. 安装mongodb-server(可选择安装mongodb客户端);

    我们需要在系统中安装mongodb-server,用来存储tideways扩展生成的日志。多台服务器也只需要安装一个mongodb-server,用来做日志归拢。如果有单独的mongodb机器,可以跳过这一步。

    Centos下安装MongoDB服务:

    sudo yum install mongodb-server

    启动服务:

    sudo service mongod start

    Centos下安装MongoDB客户端:

    sudo yum install mongodb

  5. 安装xhgui;

     git clone https://github.com/laynefyc/xhgui-branch.git
     cd xhgui
     php install.php
    

    PS: xhgui官方版本已经很久不更新,很多符号和单位都不适合中国用户。为了方便自己,我单独维护了一个版本,不断的在更新中。安装这个版本,将有更好的体验。需要安装原版的请执行下面的命令

     git clone https://github.com/perftools/xhgui
     cd xhgui
     php install.php
    

    如果你的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',
    
  6. 测试MongoDB连接情况并优化索引;

    你在当前机器安装过mongo客户端才能调用mongo命令。

     $ 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 } )
    
  7. 配置Nginx;

    Nginx需要加入两处配置,一个是PHP_VALUE:

     server {
         
       listen 80;
       server_name site.localhost;
       root /Users/markstory/Sites/awesome-thing/app/webroot/;
       fastcgi_param PHP_VALUE "auto_prepend_file=/Users/markstory/Sites/xhgui/external/header.php";
     }
    

    另一个是需要配置一个路径指向5中安装的xhgui的webroot目录,如下配置为单独申请了一个域名:

     server {
         
         listen       80;
         server_name  blog110.it2048.cn;
         root  /home/admin/xhgui-branch/webroot;
    
         location / {
         
             index  index.php;
             if (!-e $request_filename) {
         
                 rewrite . /index.php last;
             }
         }
    
         location ~ \.php$ {
         
             fastcgi_pass   127.0.0.1:9001;
             fastcgi_index  index.php;
             fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
             include        fastcgi_params;
         }
     }
    

如果安装很顺利,此时访问 http://blog110.it2048.cn 能看到效果。详细的效果图可以看这里 https://github.com/laynefyc/xhgui-branch

首页截图
首页截图

瀑布图
瀑布图

函数监控图
函数监控图

最后我们来说说频率如何配置,还是在xhgui的config/config.default.php文件中

'profiler.enable' => function() {
   
    // 如果域名为我们新建的域名则不捕获
    if($_SERVER['SERVER_NAME'] == 'blog110.it2048.cn'){
   
        return False;
    }else{
   
        // 100%采样,默认为1%
        return True;//rand(1, 100) === 42;
    }
}

数据存储到MongoDB之后,UI如何展示需要我们自己探究。比如将英文换成中文,添加曲线图和饼图等等。至此已经能实时监控我们项目的CPU、内存的消耗情况。哪些接口执行慢也能一目了然。https://github.com/laynefyc/xhgui-branch 这是我维护的一个xhpui汉化版本,欢迎使用和 提建议

目录
相关文章
|
JSON 监控 PHP
企业局域网监控软件的扩展性设计:PHP插件开发指南
在企业网络环境中,对局域网进行监控是至关重要的。为了满足不同企业的需求,我们需要一种灵活可扩展的监控软件,能够根据具体情况进行定制和扩展。本文将介绍如何利用PHP插件来实现企业局域网监控软件的扩展性设计,并提供一些代码示例,帮助读者更好地理解和应用这一技术。
237 2
|
20天前
|
监控 算法 安全
基于 PHP 的员工电脑桌面监控软件中图像差分算法的设计与实现研究
本文探讨了一种基于PHP语言开发的图像差分算法,用于员工计算机操作行为监控系统。算法通过分块比较策略和动态阈值机制,高效检测屏幕画面变化,显著降低计算复杂度与内存占用。实验表明,相比传统像素级差分算法,该方法将处理时间缩短88%,峰值内存使用量减少70%。文章还介绍了算法在工作效率优化、信息安全防护等方面的应用价值,并分析了数据隐私保护、算法准确性及资源消耗等挑战。未来可通过融合深度学习等技术进一步提升系统智能化水平。
24 1
|
2月前
|
存储 监控 算法
单位电脑监控软件中 PHP 哈希表算法的深度剖析与理论探究
数字化办公的时代背景下,单位电脑监控软件已成为企业维护信息安全、提升工作效率的关键工具。此类软件可全面监测员工的电脑操作行为,收集海量数据,故而高效管理和处理这些数据显得尤为重要。数据结构与算法在此过程中发挥着核心作用。本文将聚焦于哈希表这一在单位电脑监控软件中广泛应用的数据结构,并通过 PHP 语言实现相关功能,为优化单位电脑监控软件提供技术支持。
51 3
|
2月前
|
存储 监控 算法
论内网电脑监控软件中 PHP 哈希表算法的深度剖析与探究
当代企业网络管理体系中,内网电脑监控软件占据着关键地位。其功能涵盖对员工电脑操作行为的实时监测,以此维护企业信息安全,同时助力企业优化网络资源配置,提升整体工作效能。在构建内网电脑监控软件的诸多技术中,数据结构与算法构成了核心支撑体系。本文聚焦于哈希表这一重要数据结构,深入剖析其在 PHP 语言环境下,如何为内网电脑监控软件的高效运作提供助力,并通过详实的代码示例予以阐释。
51 3
|
3月前
|
存储 监控 算法
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
62 3
|
4月前
|
监控 算法 安全
关于公司电脑桌面监控中 PHP 二叉搜索树算法的深度剖析
在现代企业管理中,公司电脑桌面监控系统通过二叉搜索树(BST)算法保障信息安全和提高效率。本文探讨PHP中的BST在监控场景的应用,包括节点定义、插入与查找操作,并展示如何管理时间戳数据,以快速查询特定时间段内的操作记录。BST的高效性使其成为处理复杂监控数据的理想选择。
43 2
|
4月前
|
缓存 监控 算法
内网监控管理软件:PHP 语言队列算法揭秘
在数字化办公环境中,内网监控管理软件对企业的稳定运行和信息安全至关重要。本文深入介绍PHP中的队列算法及其在内网监控软件中的应用,包括监控数据收集、任务调度和日志记录等场景,通过代码示例展示其实现方法。队列算法可提高性能、保证数据顺序并实现异步处理,为企业提供高效的安全保障。
58 1
|
4月前
|
关系型数据库 MySQL PHP
2025 游戏试玩打码平台PHP源码
2025 游戏试玩打码平台PHP源码
161 0
2025 游戏试玩打码平台PHP源码
|
7月前
|
数据采集 存储 监控
公司监控软件:基于 PHP 的分布式监控系统设计
本文介绍了基于 PHP 的分布式监控系统的设计与实现。该系统包括监控节点、数据采集模块、数据传输模块和监控中心,能够高效地收集、传输和分析各节点的数据,确保系统的稳定运行和安全防护。通过示例代码展示了数据采集、传输及存储的具体实现方法,并强调了安全与可靠性的重要性。
97 3
|
7月前
|
Unix Linux PHP
PHP在Web开发中的平台独立性优势###
本文探讨了PHP的跨平台特性,阐述其作为服务器端脚本语言如何在不同操作系统上无缝运行,以及这一特性为开发者和组织带来的便利性和成本效益。 ###