你好获取登录信息中




首页 主站 文章列表 分类列表
查看文章返回文章列表

php获取linux状态

发布时间:2016-08-07 19:01:31 by:



  • 此方法仅适用与linux

网上有许多的服务器探针宣称能够监控服务器的CPU及内存使用情况,但是实际使用的时候发现这部分功能基本上是无法正常使用的。检查他们的源代码后发现基本上都是使用了system、exec之类的函数,我们知道很多服务器因为安全的问题禁用了这些功能,自己的服务器或者是vps如果却有需要还能考虑把这些函数从新打开,但是很多空间就无解了。

经过一番努力,找到了一个比较稳妥的方案来检测,它只需要读取几个文件,就能从中获取到很多的信息。并且这些文件默认的权限是444,也就是任何用户都可以读取,当然出于显而易见的原因,任何人都不可能去修改它们。

第一个文件是/proc/stat,我们先看看里面打字写了点什么东西:

  1. cpu 358053 80 323986 102176825 168887 16 3664 3494 0 0
  2. cpu0 358053 80 323986 102176825 168887 16 3664 3494 0 0
  3. 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
  4. ctxt 361424755
  5. btime 1469532425
  6. processes 1134502
  7. procs_running 4
  8. procs_blocked 0
  9. softirq 56111967 2 25189592 0 14408669 0 0 19 0 170701 16342984

显然这是一个关于CPU的文件。我们比较关心第一行的,这是cpu整体的使用情况,可是好像看不太懂啊?于是我去查了下

>显示 CPU 各项使用时间,单位为为 USER_HZ (大部份架构为百分之一秒),一般会有 4 至 8 个时间,分别代表:

  1. user - CPU 花在用户模式的时间,即运行应用程序花费的时间
  2. nice - CPU 花在 nice 值大于一般值 0 (即有较低优先级别) 进程的时间。
  3. system - CPU 花在系统模式即在内核空间 (kernel space) 的时间,即在运行内核工作的时间
  4. idle - CPU 闲置的时间,其值一定为 /proc/uptime 中第二个项目乘 USER_HZ
  5. iowait - CPU 花在等候输入/输出的时间,Linux 2.5.41 开始才开始支援
  6. irq - CPU 花在处理硬件中断 (hardware interrupt) 的时间,Linux 2.6.0-test4 开始支持
  7. softirq- CPU 花在处理 softirq 软件中断的时间,Linux 2.6.0-test4 开始支持
  8. steal_time - 在虚拟环境下 CPU 花在处理其他作业系统的时间,Linux 2.6.11 开始支持
  9. 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这个文件一看就是记录了内存信息,我们看看里面是个什么样子的吧:

  1. MemTotal: 1017216 kB
  2. MemFree: 276128 kB
  3. MemAvailable: 590640 kB
  4. Buffers: 38572 kB
  5. Cached: 374636 kB
  6. SwapCached: 84140 kB
  7. Active: 329264 kB
  8. Inactive: 320832 kB
  9. Active(anon): 12568 kB
  10. Inactive(anon): 236724 kB
  11. Active(file): 316696 kB
  12. Inactive(file): 84108 kB
  13. Unevictable: 0 kB
  14. Mlocked: 0 kB
  15. SwapTotal: 2097148 kB
  16. SwapFree: 1494244 kB
  17. Dirty: 108 kB
  18. Writeback: 0 kB
  19. AnonPages: 153664 kB
  20. Mapped: 21396 kB
  21. Shmem: 12404 kB
  22. Slab: 62256 kB
  23. SReclaimable: 52660 kB
  24. SUnreclaim: 9596 kB
  25. KernelStack: 2224 kB
  26. PageTables: 6180 kB
  27. NFS_Unstable: 0 kB
  28. Bounce: 0 kB
  29. WritebackTmp: 0 kB
  30. CommitLimit: 2605756 kB
  31. Committed_AS: 1774600 kB
  32. VmallocTotal: 34359738367 kB
  33. VmallocUsed: 7300 kB
  34. VmallocChunk: 34359730935 kB
  35. HardwareCorrupted: 0 kB
  36. AnonHugePages: 104448 kB
  37. HugePages_Total: 0
  38. HugePages_Free: 0
  39. HugePages_Rsvd: 0
  40. HugePages_Surp: 0
  41. Hugepagesize: 2048 kB
  42. DirectMap4k: 36856 kB
  43. DirectMap2M: 1011712 kB

这文件就很容易看懂了,第一行是内存总量,第二行是空闲内存,这样都不需要再看呢,这就可以算出内存使用情况(当然咯,如果你需要把缓存的等等的也认为是空闲的话当我没说)

如果对/proc/目录下的东西感兴趣可以自行查阅,网上这方面的说明还是很多的,比如我就参考了《使用/proc/stat文件,用php计算CPU使用率、内存使用率》:http://blog.csdn.net/stormbjm/article/details/19130077

最终源程序如下:

  1. <?php
  2. $fp=fopen('/proc/stat','r');
  3. $list=explode(' ',fgets($fp));
  4. $alltime=0;
  5. for($i=2;$i<count($list);$i++){
  6. $alltime+=$list[$i];
  7. }
  8. echo 'cpu:'.(100-100*$list[5]/$alltime)."%\n";
  9. fclose($fp);
  10. $fp=fopen('/proc/meminfo','r');
  11. $temp=explode(' ',fgets($fp));
  12. $mem_all=$temp[count($temp)-2];
  13. $temp=explode(' ',fgets($fp));
  14. $mem_fre=$temp[count($temp)-2];
  15. echo 'mem:'.(100-100*$mem_fre/$mem_all).'% ';
  16. fclose($fp);
评论
    还没有评论
发表评论
正在等候用户中心返回数据
杂项
。。。