Linux下CPU使⽤率详解
CPU其实就是你运⾏的程序占⽤的CPU资源,表⽰你的机器在某个时间点的运⾏程序的情况。越⾼,说明你的机器在这个时间上运⾏了很多程序,反之较少
Top命令是下常⽤的系统性能分析⼯具,能实时查看系统中各个进程资源占⽤情况
top - 10:02:17 up 14 days, 19:18,  4 users,  load average: 2.11, 2.32, 2.14
Tasks: 251 total,  1 running, 247 sleeping,  3 stopped,  0 zombie
Cpu(s):  0.5%us,  0.8%sy,  0.4%ni, 98.1%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    23591M total,    23181M used,      409M free,      861M buffers
Swap:    12288M total,    1026M used,    11262M free,    16459M cached
PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
39494 i2kuser  20  0 15.5g 2.7g  12m S      6 11.8  1245:06 java
37462 i2kuser  20  0 1906m 753m  11m S      3  3.2 558:53.85 java
20073 root      17  -3  423m 154m  16m S      2  0.7 480:39.09 pmu.bin
1459 root      39  19 12528 2036  592 S      1  0.0  6:06.54 get_os_statisti
855 root      39  19    0    0    0 S      0  0.0  65:07.89 kipmi0
21846 root      20  0  9072 1288  856 R      0  0.0  0:00.17 top
32669 oracle    20  0 11.8g  27m  24m S      0  0.1  3:47.58 oracle
32679 oracle    20  0 11.7g  62m  60m S      0  0.3  16:04.39 oracle
1 root      20  0 10560  87
2  736 S      0  0.0  0:11.27 init
2 root      20  0    0    0    0 S      0  0.0  0:00.18 kthreadd
查看CPU那⼀⾏,Cpu(s): 0.5%us, 0.8%sy, 0.4%ni, 98.1%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Google上解释为:
us: is meaning of "user CPU time"
sy: is meaning of "system CPU time"
ni: is meaning of" nice CPU time"
id: is meaning of "idle"
wa: is meaning of "iowait"
hi:is meaning of "hardware irq" (servicing hardware interrupts)
si : is meaning of "software irq" (servicing software interrupts)
st : is meaning of "steal time" (time in involuntary wait by virtual cpu while hypervisor is servicing another processor)
  中⽂解释为:
%us⽤户空间占⽤cpu百分⽐;
%sy内核空间占⽤cpu百分⽐;
%ni⽤户进程空间内改变过优先级的进程占⽤cpu百分⽐;
%id空闲cpu百分⽐,反映⼀个系统cpu的闲忙程度。越⼤越空闲;
%wa等待输⼊输出(I/O)的cpu百分⽐;
%hi指的是cpu处理硬件中断的时间;
%si值的是cpu处理软件中断的时间;
%st当 hypervisor 服务另⼀个虚拟处理器的时候,虚拟 CPU 等待实际 CPU 的时间的百分⽐
  CPU使⽤率可以直接从TOP命令得出
在Linux的内核中,有⼀个全局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同⽽不同。系统⾥定义了⼀个常数HZ,代表每秒种最⼩时间间隔的数⽬。这样jiffies的单
位就是 1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最⼩时间间隔了。每个CPU时间⽚,Jiffies都要加1。 CPU的利⽤率就是⽤执⾏⽤户态+系统态的Jiffies除
以总的Jifffies来表⽰。
在Linux系统中,CPU利⽤率的计算来源在/proc/stat⽂件,这个⽂件的头⼏⾏记录了每个CPU的⽤户态,系统态,空闲态等状态下的不同的Jiffies,常⽤的监控软件就是利
⽤/proc/stat⾥⾯的这些数据来计算CPU的利⽤率的。
包含了所有CPU活动的信息,该⽂件中的所有值都是从系统启动开始累计到当前时刻。
i2000:~ # cat /proc/stat
cpu  11772990 3685567 11586702 994389437 1502196 0 617801 0 0 0
cpu0 1925911 145536 1479330 123377541 944584 0 71441 0 0 0
cpu1 1493902 723778 1332508 123809933 398061 0 186171 0 0 0
cpu2 1218152 138174 1327108 125164685 28448 0 67759 0 0 0
cpu3 1408917 788649 1408734 124241479 31922 0 64644 0 0 0
cpu4 1347669 144848 1477635 124881583 38168 0 54423 0 0 0
cpu5 1318674 827204 1696224 124014206 24080 0 63939 0 0 0
cpu6 2189237 147904 1743240 123789739 16803 0 57403 0 0 0
cpu7 870526 769470 1121920 125110268 20126 0 52016 0 0 0
intr 6041226474 39 9 0 2 31344 0 2 0 356 0 0 29 130 0 879833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 110214 0 94382684 987 0 83207017 751 0 120017596 99 0 23038227 0 1319554 0 0 0 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 11176275226
btime 1440513807
processes 83672461
procs_running 1
procs_blocked 0
softirq 5289823244 0 2558726670 741 402209688 239962 0 3821129 628773714 0 1696051340
  参数解释
user (432661) 从系统启动开始累计到当前时刻,⽤户态的CPU时间(单位:jiffies),不包含 nice值
为负进程。1jiffies=0.01秒
nice (13295) 从系统启动开始累计到当前时刻,nice值为负的进程所占⽤的CPU时间(单位:jiffies)
system (86656) 从系统启动开始累计到当前时刻,核⼼时间(单位:jiffies)
idle (422145968) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
iowait (171474) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies),
irq (233) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
softirq (5346) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)
CPU时间=user+system+nice+idle+iowait+irq+softirq
“intr”这⾏给出中断的信息,第⼀个为⾃系统启动以来,发⽣的所有的中断的次数;然后每个数对应⼀个特定的中断⾃系统启动以来所发⽣的次数。
“ctxt”给出了⾃系统启动以来CPU发⽣的上下⽂交换的次数。
“btime”给出了从系统启动到现在为⽌的时间,单位为秒。
“processes (total_forks) ⾃系统启动以来所创建的任务的个数⽬。
“procs_running”:当前运⾏队列的任务的数⽬。
“procs_blocked”:当前被阻塞的任务的数⽬。
那么CPU利⽤率的计算⽅法:可以使⽤取两个采样点,计算其差值的办法。
(idle2-idle1)/cpu2-cpu1
shell脚本如下:
#!/bin/bash
CPU_1=$(sed -n '1p' /proc/stat | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
IDE_1=$(echo $CPU_1 | awk '{print $4}')
Total_1=$(echo $CPU_1 | awk '{print $1+$2+$3+$4+$5+$6+$7}')
echo ">>>>>>>>"
echo "sleep 5 "
linux下的sleep函数sleep 5
echo "sleep 5 "
CPU_2=$(sed -n '1p' /proc/stat | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}') IDE_2=$(echo $CPU_2 | awk '{print $4}')
Total_2=$(echo $CPU_2 | awk '{print $1+$2+$3+$4+$5+$6+$7}')
IDE=`expr $IDE_2 - $IDE_1`
Total=`expr $Total_2 - $Total_1`
tem_rate=`expr 1-$IDE/$Total | bc -l`
rate=`expr $tem_rate*100 | bc -l`
display_rate=`expr "scale=3; $rate/1" |bc`
#display
echo "The CPU useage rate is : $display_rate%"
echo " "
echo "Now use TOP command to caculate."
rate_top=$(top -n 1 | grep "Cpu" | awk '{print $5}' | cut -d "%" -f 1)
display_rate_top=`expr 100.000-$rate_top|bc -l`
echo "The CPU useage rate is : $display_rate_top%"
echo ">>>>>>>>"
exit 0

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论