- 此方法仅适用与linux
网上有许多的服务器探针宣称能够监控服务器的CPU及内存使用情况,但是实际使用的时候发现这部分功能基本上是无法正常使用的。检查他们的源代码后发现基本上都是使用了system、exec之类的函数,我们知道很多服务器因为安全的问题禁用了这些功能,自己的服务器或者是vps如果却有需要还能考虑把这些函数从新打开,但是很多空间就无解了。
经过一番努力,找到了一个比较稳妥的方案来检测,它只需要读取几个文件,就能从中获取到很多的信息。并且这些文件默认的权限是444,也就是任何用户都可以读取,当然出于显而易见的原因,任何人都不可能去修改它们。
第一个文件是/proc/stat,我们先看看里面打字写了点什么东西:
- cpu 358053 80 323986 102176825 168887 16 3664 3494 0 0
- cpu0 358053 80 323986 102176825 168887 16 3664 3494 0 0
- intr 167645199 174 10 0 0 628 0 3 0 0 0 0 0 144 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1620246 0 2418 0 3619121 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- ctxt 361424755
- btime 1469532425
- processes 1134502
- procs_running 4
- procs_blocked 0
- softirq 56111967 2 25189592 0 14408669 0 0 19 0 170701 16342984
显然这是一个关于CPU的文件。我们比较关心第一行的,这是cpu整体的使用情况,可是好像看不太懂啊?于是我去查了下
>显示 CPU 各项使用时间,单位为为 USER_HZ (大部份架构为百分之一秒),一般会有 4 至 8 个时间,分别代表:
- user - CPU 花在用户模式的时间,即运行应用程序花费的时间
- nice - CPU 花在 nice 值大于一般值 0 (即有较低优先级别) 进程的时间。
- system - CPU 花在系统模式即在内核空间 (kernel space) 的时间,即在运行内核工作的时间
- idle - CPU 闲置的时间,其值一定为 /proc/uptime 中第二个项目乘 USER_HZ
- iowait - CPU 花在等候输入/输出的时间,Linux 2.5.41 开始才开始支援
- irq - CPU 花在处理硬件中断 (hardware interrupt) 的时间,Linux 2.6.0-test4 开始支持
- softirq- CPU 花在处理 softirq 软件中断的时间,Linux 2.6.0-test4 开始支持
- steal_time - 在虚拟环境下 CPU 花在处理其他作业系统的时间,Linux 2.6.11 开始支持
- guest - 在 Linux 内核控制下 CPU 为 guest 作业系统运行虚拟 CPU 的时间,Linux 2.6.24 开始支持
不过可能因为我们的服务器版本比较新还是怎么的,我们的有10项,但这不是问题,具体有多少项本来就不是确定的,开发的时候我们应该把它当作一个变量来对待,我们真正需要单独读取的是cpu空闲时间idle,它是第4项,肯定是会有的我们就不用担心了。
那么接下来的问题就是我们要如何计算cpu使用率了。我们先看看CPU时间到底是个什么东西:
>现代分时多任务操作系统对 CPU 都是分时间片使用的:比如A进程占用10ms,然后B进程占用30ms,然后空闲60ms,再又是A进程占10ms,B进程占30ms,空闲60ms;如果在一段时间内都是如此,那么这段时间内的占用率为40%。
那么我们就不难发现计算的时候我们只需要先计算CPU当前实际使用时间,再计算CPU的总时间,二者之比不就是CPU使用率吗?不过计算实际使用的实际上稍微有一点困难,但是空闲的倒是可以直接获取,我们只需要用总时间去减空闲时间不就得到了吗?当然,我们还可以用一些数学的方法变换这个式子得到结果,这就不多说了。
后面还有一个CPU0,不用多说说只是CPU各个核心的使用情况,如果想检测每个核心的具体情况或者核心数可以从这里入手,我我这里只有一个核心就不折腾这个了,反正是一样的道理。
至于怎么取到这些值我不多说,方法很多,网上用的是正则,我出于效率的考虑使用了字符串函数,下面的内存使用情况也一样。代码在文章最后给出,可以参考。
接下来是内存,/proc/meminfo这个文件一看就是记录了内存信息,我们看看里面是个什么样子的吧:
- MemTotal: 1017216 kB
- MemFree: 276128 kB
- MemAvailable: 590640 kB
- Buffers: 38572 kB
- Cached: 374636 kB
- SwapCached: 84140 kB
- Active: 329264 kB
- Inactive: 320832 kB
- Active(anon): 12568 kB
- Inactive(anon): 236724 kB
- Active(file): 316696 kB
- Inactive(file): 84108 kB
- Unevictable: 0 kB
- Mlocked: 0 kB
- SwapTotal: 2097148 kB
- SwapFree: 1494244 kB
- Dirty: 108 kB
- Writeback: 0 kB
- AnonPages: 153664 kB
- Mapped: 21396 kB
- Shmem: 12404 kB
- Slab: 62256 kB
- SReclaimable: 52660 kB
- SUnreclaim: 9596 kB
- KernelStack: 2224 kB
- PageTables: 6180 kB
- NFS_Unstable: 0 kB
- Bounce: 0 kB
- WritebackTmp: 0 kB
- CommitLimit: 2605756 kB
- Committed_AS: 1774600 kB
- VmallocTotal: 34359738367 kB
- VmallocUsed: 7300 kB
- VmallocChunk: 34359730935 kB
- HardwareCorrupted: 0 kB
- AnonHugePages: 104448 kB
- HugePages_Total: 0
- HugePages_Free: 0
- HugePages_Rsvd: 0
- HugePages_Surp: 0
- Hugepagesize: 2048 kB
- DirectMap4k: 36856 kB
- DirectMap2M: 1011712 kB
这文件就很容易看懂了,第一行是内存总量,第二行是空闲内存,这样都不需要再看呢,这就可以算出内存使用情况(当然咯,如果你需要把缓存的等等的也认为是空闲的话当我没说)
如果对/proc/目录下的东西感兴趣可以自行查阅,网上这方面的说明还是很多的,比如我就参考了《使用/proc/stat文件,用php计算CPU使用率、内存使用率》:http://blog.csdn.net/stormbjm/article/details/19130077
最终源程序如下:
- <?php
- $fp=fopen('/proc/stat','r');
- $list=explode(' ',fgets($fp));
- $alltime=0;
- for($i=2;$i<count($list);$i++){
- $alltime+=$list[$i];
- }
- echo 'cpu:'.(100-100*$list[5]/$alltime)."%\n";
- fclose($fp);
- $fp=fopen('/proc/meminfo','r');
- $temp=explode(' ',fgets($fp));
- $mem_all=$temp[count($temp)-2];
- $temp=explode(' ',fgets($fp));
- $mem_fre=$temp[count($temp)-2];
- echo 'mem:'.(100-100*$mem_fre/$mem_all).'% ';
- fclose($fp);