Linux 的/proc/stat文件包含很多信息,但是看起来有些杂乱,到底都是些什么内容呢,今天仔细研究一下,先看一下stat文件内容:
- [root@localhost ~]# cat /proc/stat
- cpu 7543 0 6902 10332516 11903 2770 28485 0
- cpu0 7543 0 6902 10332516 11903 2770 28485 0
- intr 104942647 104103305 1274 0 3 3 0 5 0 3 0 0 0 2400 0 0 324441 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45657 0 0 0 0 0 0 0 118 0 0 0 0 0 0 0 465438 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1919702
- btime 1323717585
- processes 21449
- procs_running 1
- procs_blocked 0
/proc/stat 每列第一行表示项目内容,其后每列为对应的信息
- cpu - 整体 CPU 各项使用时间
- cpu0/cpu1... - 个别 CPU 各项使用时间
- ctxt - 显示系统经历过的 context switch 次数。
- btime - 计算机开机的时间,以由 epoch (1970 年 1 月 1 日) 至开机时间的秒数表示。
- processes - 开机后 fork 的次数
- procs_running - 在可运行 (runnable) 状态的进程数目,Linux 2.5.45 开始支持
- procs_blocked - 被阻截 (blocked) 直至输入/输出完成的进程数目,Linux 2.5.45 开始支持
CPU 各项时间 (cpu/cpu0/cpu1...)
显示 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 开始支持(本例中无此项)
基本要素搞清楚了,怎么计算CPU使用率呢?我们继续:
- CPU总时间:total=user+nice+system+idle+iowait+softirq+steal_time+guest
- CPU繁忙时间:time=user+nice+system+iowait+softirq+steal_time+guest
- 间隔1秒钟2次获取CPU总时间:total1、total2
- 和CPU繁忙时间:time1、time2
- CPU使用率=(time2-time1)/(total2-total1)
-
计算方法有了,具体用什么语言实现呢?
- 我们使用PHP的形式来在页面上对CPU使用率进行展现,以下是用到的代码:
- cat index.php
- $mode = "/(cpu)[\s]+([0-9]+)[\s]+([0-9]+)[\s]+([0-9]+)[\s]+([0-9]+)[\s]+([0-9]+)[\s]+([0-9]+)[\s]+([0-9]+)[\s]+([0-9]+)/";
- $string=shell_exec("more /proc/stat");
- preg_match_all($mode,$string,$arr);
- //print_r($arr);
- $total1=$arr[2][0]+$arr[3][0]+$arr[4][0]+$arr[5][0]+$arr[6][0]+$arr[7][0]+$arr[8][0]+$arr[9][0];
- $time1=$arr[2][0]+$arr[3][0]+$arr[4][0]+$arr[6][0]+$arr[7][0]+$arr[8][0]+$arr[9][0];
- sleep(1);
- $string=shell_exec("more /proc/stat");
- preg_match_all($mode,$string,$arr);
- $total2=$arr[2][0]+$arr[3][0]+$arr[4][0]+$arr[5][0]+$arr[6][0]+$arr[7][0]+$arr[8][0]+$arr[9][0];
- $time2=$arr[2][0]+$arr[3][0]+$arr[4][0]+$arr[6][0]+$arr[7][0]+$arr[8][0]+$arr[9][0];
- $time=$time2-$time1;
- $total=$total2-$total1;
- //echo "CPU amount is: ".$num;
- $percent=bcdiv($time,$total,3);
- $percent=$percent*100;
- echo "CPU Usage is: ".$percent."%";
- ?>
实现效果
继续实现针对内存的监控
- $str=shell_exec("more /proc/meminfo");
- $mode="/(.+):\s*([0-9]+)/";
- preg_match_all($mode,$str,$arr);
- $pr=bcdiv($arr[2][1],$arr[2][0],3);
- $pr=1-$pr;
- $pr=$pr*100;
- echo $pr."%";
看看效果
参考
阅读(9258) | 评论(0) | 转发(0) |