文档章节

利用PHP实现对服务器性能与状态的监控

大德
 大德
发布于 2012/04/22 14:51
字数 1451
阅读 422
收藏 5
点赞 0
评论 0

最近由于工作上的原因,需要开发一套服务器性能的监控工具,主要是一些同架构同软件配置的服务器。考虑到最近用php比较多,随即决定使用php来实现。主要需要实现的部分功能如下:

  • 1、系统状态,如cpu / 内存 / swap等数据;

  • 2、MySQL的性能与运行状态;

其它主要是配合性的数据存储以及可视化。

1、使用SNMP实现对系统状态的抓取

SNMP的确是一个很方便的协议,用它可以获取网络设备几乎所有的信息,Linux和Win都可以很好的支持。MIB是一个纷杂的数据库,通过筛选可以获取我们所需要的信息。

PHP5对snmp协议v2有较好的支持。为了方便,可以获取一大组数据,将其存储到一个数组中,再从数组中挑选需要的数据。snmp2_real_walk便可以满足这个需求。它的用法如下:

$status = @snmp2_real_walk($host, $community, ".1.3.6.1.4.1.2021",10,5);

  • $host是目标主机

  • $community是其相应的SNMP community code

  • “1.3.6.1.4.1.2021”是我们要获取的数据树

  • 10是超时时间(秒)

  • 5是失败后的重试次数

为了防止出错后报错,使用@强行关闭报错。

获取的结果存储在$status里,之后便可以从$status中定位我们所需要的数据了。MIB可能是用数字组织的,也有可能是一堆名字,具体可以在这里进行查询。需要注意,获取的结果中,值和结果是混合在一起的,需要对字符串进行一定的截取。下面是几个比较常用的值:

$host_status['uptime_1min']   = (float)@substr($status['UCD-SNMP-MIB::laLoad.1'], 9);
$host_status['uptime_5min']   = (float)@substr($status['UCD-SNMP-MIB::laLoad.2'], 9);
$host_status['uptime_15min']  = (float)@substr($status['UCD-SNMP-MIB::laLoad.3'], 9);
$host_status['user_cpu']      = (int)@substr($status['UCD-SNMP-MIB::ssCpuUser.0'], 9);
$host_status['system_cpu']    = (int)@substr($status['UCD-SNMP-MIB::ssCpuSystem.0'], 9);
$host_status['idle_cpu']      = (int)@substr($status['UCD-SNMP-MIB::ssCpuIdle.0'], 9);
$host_status['total_swap']    = (int)@substr($status['UCD-SNMP-MIB::memTotalSwap.0'], 9);
$host_status['available_swap']= (int)@substr($status['UCD-SNMP-MIB::memAvailSwap.0'], 9);
$host_status['total_ram']     = (int)@substr($status['UCD-SNMP-MIB::memTotalReal.0'], 9);
$host_status['used_ram']      = $host_status['total_ram'] - (int)@substr($status['UCD-SNMP-MIB::memAvailReal.0'], 9);
$host_status['cached_memory'] = (int)@substr($status['UCD-SNMP-MIB::memCached.0'], 9);

SNMP采用的是UDP协议,因此数据获取可能会失败,可以考虑在失败之后重试几次。

$i = 0;
    $status = array();
do {
    $i ++;
    $status = @snmp2_real_walk($host, $community, ".1.3.6.1.4.1.2021",10,5);
} while(!(count($status) != 0 OR $i >= 3));

2、获取MySQL数据库的状态数据

获取MySQL的状态较简单,只需要运行下面这个查询即可:

SHOW GLOBAL STATUS

这个查询的结果也非常丰富,只需要从中挑选需要的即可。例如下面的例子获取了若干查询的数量:

$db = @new  mysqli($host, $mysql_user, $mysql_pwd);
  $result = @$db->query("SHOW GLOBAL STATUS");
  $status = array();
  if($result) {
     while($temp = $result->fetch_assoc()) {
         switch($temp['Variable_name']) {
             case "Com_select":
             case "Com_insert":
             case "Com_delete":
             case "Com_update":
             case "Com_change_db":
                 $status[$temp['Variable_name']] = $temp['Value'];
                 break;
             default:
                 break;
         }
  }
   $db->close();
   return $status;
} else
  return false;

唯一需要注意的是,上述值是MySQL服务启动之后的累加值,所以说只要MySQL不重启,这些值是递增的。而在实际分析或者显示时,一般是需要某个时间段内的值,有如下两个思路来应对:

  • 1、获取最新一次的数据时,从数据库中查询到上次获取的值,二者相减,即可得到两次查询内的数据值,这个实现时还需要保存一个额外的临时值以用于作为减数,否则会失去“坐标”;

  • 2、将最新获取的值存储在数据库中,在显示或者读取时,再进行相应的减法操作;

个人比较推荐采用第二种方法,即在使用时再对数据进行处理,这至少遵循了“保存原始数据”这一原则,而且需求是有可能变化的。

3、定期执行PHP脚本获取状态值

PHP本身无法实现定时运行这一功能,因此只有借助其它手段,比如,Linux中的crontab,按设定的规则和时间在后台执行,只需要将定时执行的内容换成命令行下的PHP脚本即可。

下面的这一段PHP可以实现从命令行或URL接受参数并执行相关操作的功能

    $action = '';
    if(isset($_GET['action']))
        $action = $_GET['action'];
    if(isset($argv[1]))
        $action = $argv[1];
    switch($action) {
        case "snmp":
            refresh_host_status_by_snmp();
            break;
        case get_option("refresh_frequency") . "min":
            refresh_order_count();
            refresh_service_status();
            break;
        case "1day":
            refresh_uptime_yesterday_in_service_list();
            save_all_tasks_one_day_details();
            break;
        default:
            echo "help content here.\n";
            break;
    }

将上述脚本保存为cli.php,则可以通过下面两种方法来运行:

  • 1、http://chensd.com/cli.php?action=5min

  • 2、/usr/bin/php cli.php 5min

php执行文件的位置可能会因编译或安装的情况而不一样。

在crontab中添加如下的一行可以每隔五分钟运行一次:

5,10,15,20,25,30,35,40,45,50,55,0 * * * * /usr/bin/php /home/xxx/cli.php 5min

*/5 * * * * /usr/bin/php /home/xxx/cli.php 5min

4、数据的可视化

无论是什么样的人,总是更容易接受图表一些——这个与智商关系不大。

现在的数据可视化技术实在是太丰富了,除了以前比较常见的flash和图片,现在的js可视化技术也进入了实用化阶段,而且将图表的生成工作量转给了客户端浏览器,也没有了插件的依赖,要命的是iOS也没问题……

Highchartsflot都很不错,前者相对更成熟,后者是开源项目,Highcharts母公司新推出了Highstocks也很不错,但是现在还在测试阶段,净highstocks.js都有300多KB。

性能上讲,据称,flot表现1000个点时仍然轻松自如。从我实现的情况来看,highstocks一个图中同时显示3000余个数据依然很流畅,单图15000个数据仍然可以灵活拉动highstocks的时间轴。

© 著作权归作者所有

共有 人打赏支持
大德

大德

粉丝 5
博文 12
码字总数 5148
作品 0
高级程序员
MySQL企业监控系统--MySQL MTOP

MySQLMTOP 是一个由Python+PHP开发的开源MySQL企业监控系统。系统由Python实现多进程数据采集和告警,PHP实现WEB展示和管理。MySQL服务器无需安装任何Agent,只需在监控WEB界面配置相关数据库...

andrew_ru
2014/01/02
35.3K
9
MySQL MTOP —— MySQL 企业监控系统

MySQLMTOP是一个由Python+PHP开发的开源MySQL企业监控系统。系统由Python实现多进程数据采集和告警,PHP实现WEB展示和管理。MySQL服务器无需安装任何Agent,只需在监控WEB界面配置相关数据库...

oschina
2014/01/06
2
0
灰太狼。/MySQLMTOP

#MySQL开源监控系统 MySQL MTOP MySQL MTOP是一个由Python+PHP开发的开源MySQL数据库监控系统。系统由Python实现多进程数据采集和告警,PHP实现WEB展示和管理。MySQL服务器无需安装任何Agent...

灰太狼。
2014/01/02
0
0
基于MySQLMTOP的天兔(Lepus)数据库监控系统V3.0正式发布

天兔(Lepus)数据库监控系统V3.0正式发布 Lepus是一个由Python+PHP开发的数据库企业级监控系统,是作者继MYSQLMTOP开源监控系统(www.mtop.cc)之后,进行了代码重构,重新开发的一套企业系统。...

andrew_ru
2014/08/29
1K
0
利用 NGINX 最大化 Python 性能,第二部分:负载均衡和监控

【编者按】本文主要介绍 [NGINX][1] 的主要功能以及如何通过 [Nginx][2] 优化 [Python][3] 应用性能。本文系国内 [ITOM][4] 管理平台 [OneAPM][5] 编译呈现。 本文上一篇系: [利用 NGINX 最大...

OneAPM蓝海讯通
2016/05/17
37
0
MySQL系列教程(四)

文件打开数(open_files) 我们现在处理MySQL故障时,发现当Openfiles大于openfiles_limit值时,MySQL数据库就会发生卡住的现象,导致Nginx服务器打不开相应页面。这个问题大家在工作中应注意,...

lifetragedy
2016/10/13
0
0
memcached精讲第二部

老男孩之memcached精讲第二部 1.1Memcache 服务器的安装。 Linux,FreeBSD,Solaris,windows。这里以Centos6.4为例进行说明。 软件地址:Memcached 下载地址: libevent 下载地址: 网友安装...

妙曼
2017/02/20
0
0
运维改革探索(一):用多层级监控实现可视化运维

作者介绍 朱祥磊,山东移动BOSS系统架构师,负责业务支撑系统架构规划和建设。获国家级创新奖1项、通信行业级科技进步奖2项、移动集团级业务服务创新奖3项,申请发明专利13项。 当前运营商业...

朱祥磊
2016/11/07
0
0
Linux服务器网络运维监控软件Nagios

要让服务器运行良好而且平稳的话,一个非常艰巨重大的任务就是做好网络运维管理。网络管理员使用了许多工具来监视服务器的运行状况,并查看网络流量的上升和下降状况。他们还必须确保整个服务...

智和网管平台
04/25
0
0
5款监控利器介绍(smokeping、cacti、nagios、zabbix、ntop)

smokeping Smokeping 是rrdtool 的作者Tobi Oetiker 的作品,是用Perl 写的,主要是监视网络性能,包括常规的ping,用echoping监控www 服务器性能,监视dns 查询性能,监视ssh 性能等。底层也...

Jack崔
2017/07/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Android 复制和粘贴功能

做了一回搬运工,原文地址:https://blog.csdn.net/kennethyo/article/details/76602765 Android 复制和粘贴功能,需要调用系统服务ClipboardManager来实现。 ClipboardManager mClipboardM...

她叫我小渝
30分钟前
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
46分钟前
4
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
今天
0
0
Python分析《我不是药神》豆瓣评论

读取 Mongo 中的短评数据,进行中文分词 对分词结果取 Top50 生成词云 生成词云效果 看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任...

猫咪编程
今天
0
0
虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
昨天
1
0
There is no session with id[xxx]

参考网页 https://blog.csdn.net/caimengyuan/article/details/52526765 报错 2018-07-19 23:04:35,330 [http-nio-1008-exec-8] DEBUG [org.apache.shiro.web.servlet.SimpleCookie] - Found......

karma123
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部