用WEB来实现Unix服务器的负载监控

什么是负载监控

    首先我们来看一下是什么是负载监控:  系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中:

  • 它没有在等待I/O操作的结果
  • 它没有主动进入等待状态(也就是没有调用'wait')
  • 没有被停止(例如:等待终止)

有Unix下面用什么指令来查看呢?

$uptime
 
$top

 

比上面我们可以知道可用以用uptime与top来查看。现在我们来看一下它输出的内容的含义:

     主要看load averaqe:后面的内容 0.00, 0.01, 0.00

     后面的三个数字分别记录了一分钟、五分钟、以及十五分钟的系统平均负载,

可能你会这样理解负载均值:三个数分别代表不同时间段的系统平均负载(一分钟、五 分钟、以及十五分钟),它们的数字当然是越小越好。数字越高,说明服务器的负载越大,这也可能是服务器出现某种问题的信号。  而事实不完全如此,是什么因素构成了负载均值的大小,以及如何区分它们目前的状况是 “好”还是“糟糕”?什么时候应该注意哪些不正常的数值?回答这些问题之前,首先需要了解下这些数值背后的些知识。我们先用最简单的例子说明, 一台只配备一块单核处理器的服务器。


交通比喻

    一只单核的处理器可以形象得比喻成一条单车道。设想下,你现在需要收取这条道路的过路费, 忙于处理那些将要过桥的车辆。你首先当然需要了解些信息,例如车辆的载重、以及还有多少车辆正在等待过桥。如果前面没有车辆在等待,那么你可以告诉后面的司机通过。如果车辆众多,那么需要告知他们可能需要稍等一会。

因此,需要些特定的代号表示目前的车流情况,例如:

    0.00 表示目前桥面上没有任何的车流:实际上这种情况与 0.00 和 1.00 之间是相同的,总而言之很通畅,过往的车辆可以丝毫不用等待的通过。

    = 1.00负荷

 

    1.00 表示刚好是在这座桥的承受范围内: 这种情况不算糟糕,只是车流会有些堵,不过这种情况可能会造成交通越来越慢。

    = 0.50负荷

 

        超过 1.00,那么说明这座桥已经超出负荷:交通严重的拥堵。 那么情况有多糟糕? 例如 2.00 的情况说明车流已经超出了桥所能承受的一倍,那么将有多余过桥一倍的车辆正在焦急的等待。3.00 的话情况就更不妙了,说明这座桥基本上已经快承受不了,还有超出桥负载两倍多的车辆正在等待。

      = 1.70负荷

 

    上面的情况和处理器的负载情况非常相似。一辆汽车的过桥时间就好比是处理器处理某线程 的实际时间。Unix 系统定义的进程运行时长为所有处理器内核的处理时间加上线程 在队列中等待的时间。和收过路费的工作人员一样,你当然希望你的汽车(操作)不会被焦急的等待。所以,理想状态下,都希望负载平均值小于 1.00 。当然不排除部分峰值会超过1.00,但长此以往保持这个状态,就说明会有问题,这时候你应该会很焦急。

 

所以你说的理想负荷为 1.00

 

     这种情况其实并不完全正确。负荷 1.00 说明系统已经没有剩余的资源了。在实际情况中 ,有经验的系统管理员都会将这条线划在 0.70,需要进行调查法则,如果长期你的系统负载在 0.70 上下,那么你需要在事情变得更糟糕之前,花些时间了解其原因。

 

现在就要修复法则:1.00

    如果你的服务器系统负载长期徘徊于 1.00,那么就应该马上解决这个问题。否则,你将半夜接到你上司的电话,这可不是件令人愉快的事情。

 

凌晨三点半锻炼身体法则:5.00

    如果你的服务器负载超过了 5.00 这个数字,那么你将失去你的睡眠,还得在会话中说明这情况发生的原因,总之千万不要让它发生。

 

那么多处理器? 我的负荷说3.00,但事情已经运行良好!

   有一个四处理器的系统? 这仍然是3.00负载健康。

   在多处理器系统中,负载是相对于处理器核心数目。 “100%的利用率”标志是在单核心系统,2.00 1.00,在双核心,4.00在四核,等

 = 2.00负载双车道公路

  与CPU一样:1.00负载100%的单芯盒的CPU使用率。 在双核中,有2.00负荷为100%的CPU利用率。


WEB程序来现实监控

      下面是我们这个篇文章的核心内容:如何用WEB程序实时的查看当前服务器的负载呢?我们在现实环境中很难利用PHP去调用一些Unix中需要root权限才能执行的程序,对此,得来绕开这个限制。

     首先先写个c程序中转调用系统命令,然后用PHP去执行此c程序(代码如下:monitor.c)。

 

1#include < stdio.h>
2#include < stdlib.h>
3#include < sys/types.h>
4#include < unistd.h>
5
6int main()
7{
8 uid_t uid ,euid;
9
10 /* 获得当前的uid */
11 uid = getuid();
12
13 /* 获得当前euid */
14 euid = geteuid();
15
16 /* 交换这两个id */
17 if(setreuid(euid, uid))
18 {
19 perror("setreuid");
20 }
21
22 /* 执行将要执行Unix系统命令 */
23 system("/usr/bin/ monitor");
24 return 0;
25}

 

注意:上面代码中的头文件#include <sys/types.h>, 可能会编译错误,请更改为#include < systypes.h>

 

  编译该文件, 编译后会/usr/bin/下生成 monitor 程序。

 

gcc -o ipt-Wall monitor.c,

 

   接下来就是改变此程序的执行权限,不然无法调用。

 

chmod u+s /usr/bin/monitor

 

 然后就是写一段PHP程序来调用刚才生成的monitor程序,代码如下:

 

 

1 <?php
2
3  $last_line = exec('/usr/bin/monitor', $retval);
4  $returnArray = explode("load average: ", $retval[0]);
5
6  $returnString = $returnArray[1];
7  $arr = split(', ', $returnString);
8
9  echo "<h1> Liunx/Unix 服务器PHP负载监控 </h1>";
10  echo "1分钟的负载情况: {$arr[0]} <br />";
11  echo "5分钟的负载情况: {$arr[1]} <br />";
12  echo "15分钟的负载情况: {$arr[2]} <br />";
13
14  ?> 

最后就是要浏览器中开发这个页面就可以看到了如下:

 

 

原创作者:Tiwer

文章出处:http://wgw8299.cnblogs.com/

关于作者:专注于互联网技术研究与开发、企业信息化解决方案。现主要从事PHP, WinForm、ASP.NET、JavaScript、UI、CSS、Linux/Uinx、C++,Google Android等方面的项目开发、架构工作。 

版权说明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted @ 2010-11-05 17:31  wgw8299  阅读(1610)  评论(4编辑  收藏  举报