Linux下CPU使用率详解
CPU使用率其实就是你运行的程序占用的CPU资源,表示你的机器在某个时间点的运行程序的情况。使用率越高,说明你的机器在这个时间上运行了很多程序,反之较少
Top命令是Linux下常用的系统性能分析工具,能实时查看系统中各个进程资源占用情况
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 872 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的利用率的。
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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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”:当前被阻塞的任务的数目。
#!/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 sec begin....." sleep 5 echo "sleep 5 sec end......." 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