Linux平台Cpu使用率的计算
proc文件系统
/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的。
/proc目录中有一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程在/proc下都对应一个以进程号为目录名的目录/proc/pid,它们是读取进程信息的接口。此外,在Linux 2.6.0-test6以上的版本中/proc/pid目录中有一个task目录,/proc/pid/task目录中也有一些以该进程所拥有的线程的线程号命名的目录/proc/pid/task/tid,它们是读取线程信息的接口。
/proc/cpuinfo文件
该文件中存放了有关cpu的相关信息(型号,缓存大小等)。
[zhengangen@buick ~]$ cat /proc/cpuinfo
processor: 0
vendor_id: GenuineIntel
cpu family: 15
model: 4
model name: Intel(R) Xeon(TM) CPU 3.00GHz
stepping: 10
cpu MHz: 3001.177
cache size: 2048 KB
physical id: 0
siblings: 2
core id: 0
cpu cores: 1
fdiv_bug: no
hlt_bug: no
f00f_bug: no
coma_bug: no
fpu: yes
fpu_exception: yes
cpuid level: 5
wp: yes
flags: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe lm pni monitor ds_cpl cid xtpr
bogomips: 6004.52
说明:以下只解释对我们计算Cpu使用率有用的相关参数。
参数解释
processor(0)cpu的一个物理标识
结论1:可以通过该文件根据processor出现的次数统计cpu的逻辑个数(包括多核、超线程)。
/proc/stat文件
该文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。不同内核版本中该文件的格式可能不大一致,以下通过实例来说明数据该文件中各字段的含义。
实例数据:2.6.24-24版本上的
fjzag@fjzag-desktop:~$ cat /proc/stat
cpu38082 627 27594 893908 12256 581 895 0 0
cpu0 22880 472 16855 430287 10617 576 661 0 0
cpu1 15202 154 10739 463620 1639 4 234 0 0
intr 120053 222 2686 0 1 1 0 5 0 3 0 0 0 47302 0 0 34194 29775 0 5019 845 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1434984
btime 1252028243
processes 8113
procs_running 1
procs_blocked 0
第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义:
参数解析(单位:jiffies)
(jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间)
user(38082)从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含nice值为负进程。
nice(627)从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间
system(27594)从系统启动开始累计到当前时刻,处于核心态的运行时间
idle(893908)从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间iowait(12256)从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)
irq(581)从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4)
softirq(895)从系统启动开始累计到当前时刻,软中断时间(since 2.6.0-test4)stealstolen(0)which is the time spent in other operating systems when running in a virtualized environment(since 2.6.11)
guest(0)which is the time spent running a virtualCPUforguest operating systems under the control of the Linux kernel(since 2.6.24)
结论2:总的cpu时间totalCpuTime = user + nice + system + idle + iowait + irq + softirq+stealstolen+guest
/proc/<pid>/stat文件
该文件包含了某一进程所有的活动的信息,该文件中的所有值都是从系统启动开始累计
到当前时刻。以下通过实例数据来说明该文件中各字段的含义。
[zhengangen@buick ~]# cat /proc/6873/stat
6873(a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 041958 310 025 0 3 0 5882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 0 0 0 0 0 0 0 17 0 0 0
说明:以下只解释对我们计算Cpu使用率有用相关参数
参数解释
pid=6873进程号
utime=1587该任务在用户态运行的时间,单位为jiffies
stime=41958该任务在核心态运行的时间,单位为jiffies
cutime=0所有已死线程在用户态运行的时间,单位为jiffies
cstime=0所有已死在核心态运行的时间,单位为jiffies
结论3:进程的总Cpu时间processCpuTime = utime + stime + cutime + cstime,该值包括其所有线程的cpu时间。
/proc/<pid>/task/<tid>/stat文件
该文件包含了某一进程所有的活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。该文件的内容格式以及各字段的含义同/proc/<pid>/stat文件。
注意,该文件中的tid字段表示的不再是进程号,而是linux中的轻量级进程(lwp),即我们通常所说的线程。
结论4:线程Cpu时间threadCpuTime = utime + stime
系统中有关进程cpu使用率的常用命令
ps命令
通过ps命令可以查看系统中相关进程的Cpu使用率的信息。以下在linux man文档中对ps命令输出中有关cpu使用率的解释:
CPU usage is currently expressed as the percentage of time spent running during the entire lifetime of a process. This is not ideal, and it does not conform to the standards that ps otherwise conforms to. CPU usage is unlikely to add up to exactly 100%.
%cpucpu utilization of the process in "##.#" format. It is the CPU time useddivided by the time the process has been running (cputime/realtime ratio),expressed as a percentage. It will not add up to 100% unless you are lucky.
结论5:ps命令算出来的cpu使用率相对于进程启动时的平均值,随着进程运行时间的增大,该值会趋向于平缓。
top命令
通过top命令可以查看系统中相关进程的实时信息(cpu使用率等)。以下是man文档中对top命令输出中有关进程cpu使用率的解释。
#C--Last used CPU (SMP)A number representing the last used processor. In a trueSMPenvironmentthiswilllikely changefrequentlysincethekernel intentionally uses weak affinity.Also, the very act of running top may break this weak affinity and cause more processes tochangeCPUsmoreoften (because of the extra demand for cpu time).
%CPU--CPU usageThetask’s share of the elapsed CPU time since the last screen update, expressed as a percent-age of total CPU time.In a true SMP environment, ifIrix mode is Off, top will operate in Solaris mode where a task’s cpu usage will be divided by the total number of CPUs.
结论6:某一个线程在其运行期间其所使用的cpu可能会发生变化。
结论7:在多核的情况下top命令输出的cpu使用率实质是按cpu个数*100%计算的。
单核情况下Cpu使用率的计算
基本思想
通过读取/proc/stat、/proc/<pid>/stat、/proc/<pid>/task/<tid>/stat以及/proc/cpuinfo这几个文件获取总的Cpu时间、进程的Cpu时间、线程的Cpu时间以及Cpu的个数的信息,然后通过一定的算法进行计算(采样两个足够短的时间间隔的Cpu快照与进程快照来计算进程的Cpu使用率)。
总的Cpu使用率计算
计算方法:
1、采样两个足够短的时间间隔的Cpu快照,分别记作t1,t2,其中t1、t2的结构均为:
(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元组;
2、计算总的Cpu时间片totalCpuTime
a)把第一次的所有cpu使用情况求和,得到s1;
b)把第二次的所有cpu使用情况求和,得到s2;
c)s2 - s1得到这个时间间隔内的所有时间片,即totalCpuTime = j2 - j1 ;
3、计算空闲时间idle
idle对应第四列的数据,用第二次的第四列-第一次的第四列即可
idle=第二次的第四列-第一次的第四列
6、计算cpu使用率
pcpu =100* (total-idle)/total
某一进程Cpu使用率的计算
计算方法:
1.采样两个足够短的时间间隔的cpu快照与进程快照,
a)每一个cpu快照均为(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元组;
b)每一个进程快照均为(utime、stime、cutime、cstime)的4元组;
2.分别根据结论2、结论3计算出两个时刻的总的cpu时间与进程的cpu时间,分别记作:totalCpuTime1、totalCpuTime2、processCpuTime1、processCpuTime2
3.计算该进程的cpu使用率pcpu = 100*(processCpuTime2 – processCpuTime1) / (totalCpuTime2 – totalCpuTime1)(按100%计算,如果是多核情况下还需乘以cpu的个数);
实验数据
实验一:监控一空循环的进程的cpu使用率。
|
说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。
|
按以上方法计算得到的cpu使用率
|
通过top命令得到的
|
99.50083
98.333336
98.0
98.83138
99.0
99.0
99.83361
98.83527
98.4975
|
PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND
7639 fjzag200206m10m 7136 S992.21:00.74 java
7639 fjzag200206m10m 7136 S992.21:03.71 java
7639 fjzag200206m10m 7136 S992.21:06.67 java
7639 fjzag200206m10m 7136 S992.21:09.63 java
7639 fjzag200206m10m 7136 S982.21:12.59 java
7639 fjzag200206m10m 7136 S992.21:15.55 java
7639 fjzag200206m10m 7136 S1002.21:18.55 java
7639 fjzag200206m10m 7136 S1002.21:21.54 java
7639 fjzag200206m10m 7136 S992.21:24.52 java
7639 fjzag200206m10m 7136 S982.21:27.46 java
|
实验二:监控jconsole进程的cpu使用率。
|
说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。
|
按以上方法计算得到的cpu使用率
|
通过top命令得到的
|
8.681135
12.0
10.350584
7.6539097
7.6539097
5.0
13.021703
11.0
8.666667
|
PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND
7753 fjzag200252m72m22m S10 14.40:18.70 jconsole
7753 fjzag200252m72m22m S12 14.40:19.07 jconsole
7753 fjzag200252m72m22m S11 14.40:19.39 jconsole
7753 fjzag200252m72m22m S7 14.40:19.61 jconsole
7753 fjzag200252m72m22m S7 14.40:19.83 jconsole
7753 fjzag200252m72m22m S5 14.40:19.97 jconsole
7753 fjzag200252m72m22m S14 14.40:20.38 jconsole
7753 fjzag200252m72m22m S10 14.40:20.68 jconsole
7753 fjzag200252m72m22m S9 14.50:20.96 jconsole
|
某一线程Cpu使用率的计算
计算方法:
1.采样两个足够短的时间隔的cpu快照与线程快照,
a)每一个cpu快照均为(user、nice、system、idle、iowait、irq、softirq、stealstealon、guest)的9元组;
b)每一个线程快照均为(utime、stime)的2元组;
2.分别根据结论2、结论4计算出两个时刻的总的cpu时间与线程的cpu时间,分别记作:totalCpuTime1、totalCpuTime2、threadCpuTime1、threadCpuTime2
3.计算该线程的cpu使用率pcpu = 100*(threadCpuTime2 – threadCpuTime1) / (totalCpuTime2 – totalCpuTime1)(按100%计算,如果是多核情况下还需乘以cpu的个数);
实验数据
实验一:监控一空循环的线程的cpu使用率。
|
说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。
|
按以上方法计算得到的cpu使用率
|
通过top命令得到的
|
98.83138
97.00997
96.98997
97.49583
98.169716
96.8386
97.333336
93.82304
98.66667
|
PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND
7649 fjzag200206m10m 7136 R972.27:22.94 java
7649 fjzag200206m10m 7136 R972.27:25.86 java
7649 fjzag200206m10m 7136 R972.27:28.76 java
7649 fjzag200206m10m 7136 R992.27:31.72 java
7649 fjzag200206m10m 7136 R982.27:34.65 java
7649 fjzag200206m10m 7136 R962.27:37.53 java
7649 fjzag200206m10m 7136 R982.27:40.47 java
7649 fjzag200206m10m 7136 R962.27:43.34 java
7649 fjzag200206m10m 7136 R972.27:46.25 java
|
实验二:监控jconsole程序某一线程的cpu使用率。
|
说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。
|
按以上方法计算得到的cpu使用率
|
通过top命令得到的
|
1.3400335
6.644518
1.3333334
0.6677796
0.6666667
1.3333334
1.3333334
|
PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND
7755 fjzag200251m72m22m S1 14.40:11.92 jconsole
7755 fjzag200251m72m22m S7 14.40:12.12 jconsole
7755 fjzag200251m72m22m S2 14.40:12.18 jconsole
7755 fjzag200251m72m22m S0 14.40:12.18 jconsole
7755 fjzag200251m72m22m S1 14.40:12.20 jconsole
7755 fjzag200251m72m22m S1 14.40:12.24 jconsole
7755 fjzag200251m72m22m S1 14.40:12.28 jconsole
|
多核情况下cpu使用率的计算
以下通过实验数据来说明多核情况下某一进程cpu使用率是按cpu个数*100%计算的.
实验一
描述:
在双核的情况下作的一组实验,第一组数据是通过ps-eLo pid,lwp,pcpu | grep 9140命令查看进程号为9140的进程中各线程的详细信息。第二组数据是通过ps命令查看进程号为9140进程的cpu使用率。
数据一:
pidlwp%cpu
914091400.0
914091410.0
914091420.0
914091430.0
914091440.0
914091490.0
914091500.0
914091510.0
914091520.1
9140915396.6该线程是一个空循环
9140915495.9该线程是一个空循环
以上除了红色标注出来的两个线程以外,其他的线程都是后台线程。
数据二:
pid%cpu
9140193
实验二
描述:
在单核的情况下作的一组实验,第一组数据是通过ps-eLo pid,lwp,pcpu | grep 6137命令查看进程号为6137的进程中各线程的详细信息。第二组数据是通过ps命令查看进程号为6137进程的cpu使用率。
数据一:
pidlwp%cpu
613761370.0
613761380.1
613761430.0
613761440.0
613761450.0
613761460.0
613761470.0
613761480.0
613761490.0
61376150 46.9空循环线程
61376151 46.9空循环线程
以上除了红色标注出来的两个线程以外,其他的线程都是后台线程。
数据二
pid %cpu
6137 92.9
主要问题:
1.不同内核版本/proc/stat文件格式不大一致。/proc/stat文件中第一行为总的cpu使用情况。
各个版本都有的4个字段: user、nice、system、idle
2.5.41版本新增字段:iowait
2.6.0-test4新增字段:irq、softirq
2.6.11新增字段:stealstolen:which is the time spent in other operating
systems when running in a virtualized environment
2.6.24新增字段:guest:which is the time spent running a virtualCPUforguest operating systems under the control of the Linux kernel
2./proc/pid/task目录是Linux 2.6.0-test6之后才有的功能。
3.关于出现cpu使用率为负的情况,目前想到的解决方案是如果出现负值,连续采样计算cpu使用率直到为非负。
4.有些线程生命周期较短,可能在我们采样期间就已经死掉了.
分享到:
相关推荐
在本例中,GTK被用来开发一个系统监视器,能够以图形化的方式展示系统监控状态,如CPU使用率、内存使用情况、网络带宽等。 使用GTK库实现的系统监视器通常会包括以下功能: 1. **CPU监控**:通过读取`/proc/stat`...
// CPU占用率计算原理:// 1、读取/proc/pid/stat文件,其中记录了从开机到现在,本进程所占用的CPU时间(单位jiffies)// 2、然后再读取/proc/stat文件,其中记录了从开机到现在,系统所占用的CPU时间(单位jiffies...
例如,可能包括CPU使用率、内存利用率、磁盘I/O、网络流量等关键指标。 通过这个监控器,用户可以轻松地: 1. **监控CPU负载**:查看单个CPU或所有CPU的使用率,了解系统是否过载。 2. **监控内存状态**:分析物理...
2.获取系统的CPU使用率:要获取系统的CPU使用率,可以通过读取/proc目录中的文件来实现。例如,读取/proc/stat文件,可以获取系统的CPU使用率信息。 3.获取系统的内存使用情况:要获取系统的内存使用情况,可以通过...
linux下c/c++ 实现cpu使用率查询,内存使用率查询,当个程序使用查询 主要应用/proc/stat /proc/meminfo /proc/pid/stat /proc/pid/status 等文件中的内容进行计算
在实际编程中,为了得到瞬时CPU使用率,往往需要连续两次读取`/proc/stat`,并比较两次读取之间的变化。这样可以避免因短时间内CPU状态波动导致的误差。 最后,`cpu_linux.cpp`可能就是实现这一功能的源代码文件。...
在C++编程中,获取CPU使用率是一项常见的需求,无论是为了监控系统性能,还是分析某个特定进程的资源消耗。本文将详细讲解如何使用C++来获取系统整体的CPU使用率以及单个进程的CPU使用率。 首先,我们需要理解CPU...
在Linux系统中,使用Qt库开发应用程序时,可以利用各种系统接口来获取CPU使用率、内存占用、网络流量、磁盘I/O速度以及磁盘剩余空间等关键信息。以下将详细讲解如何通过Qt来实现这些功能。 1. CPU使用率: 在Linux...
在深入探讨如何在Linux中计算CPU使用率之前,我们需要先了解几个基本概念: 1. **用户态时间(user)**:CPU在用户态下执行的时间。 2. **系统态时间(system)**:CPU在内核态下执行的时间。 3. **空闲时间(idle)...
由于OpenWRT也是基于Linux内核,因此计算CPU使用率的方法与标准Linux系统相同,即通过读取`/proc/stat`文件来获取信息。 通过编写这样的程序,可以周期性地监控CPU使用率,从而对系统负载有清晰的认识。在高负载...
- `/proc/stat`:系统整体的统计信息,如CPU使用、进程切换次数等。 - `/proc/diskstats`:硬盘I/O统计。 6. **文件系统信息**: - `/proc/mounts`:列出所有已挂载的文件系统及其相关信息。 - `/proc/file...
通过读取和解析 `/proc/stat` 文件,我们可以获取到CPU的使用情况,并计算出CPU使用率。下面将详细介绍如何利用C语言编写一个小程序来计算Linux和OpenWRT系统的CPU使用率。 首先,`/proc/stat` 文件是Linux内核提供...
对于Linux,`/proc/stat`文件中包含了CPU的用户时间、内核时间等,通过计算它们的差值和总时间,可以得到CPU的使用率。`/proc/meminfo`文件则包含了内存的总量、已用量等,通过计算可得出内存使用率。 在macOS中,...
在Linux系统中,可以通过`/proc/stat`文件获取这些信息。Go语言可以使用`os`和`ioutil`包来读取该文件,然后解析其内容。以下是一个简单的示例: ```go import ( "bufio" "fmt" "io/ioutil" "os" "strconv" ...
- CPU使用率计算通常基于`/proc/stat`中记录的CPU时间,包括用户时间(user),系统时间(sys),空闲时间(idle)以及iowait等。这些时间值在连续两次读取时的差值可以用于计算CPU使用率。 4. **CPU使用率计算**...
"linux-让多核CPU达到指定的CPU使用率脚本"是一个旨在提升机器CPU使用率的实用工具,它能帮助系统管理员更好地控制和利用计算资源。下面我们将详细探讨相关知识点。 1. **CPU使用率**: - CPU使用率是指CPU在单位...
在Linux系统中,CPU利用率的计算涉及到对/proc文件系统的理解和分析。/proc文件系统是一个虚拟文件系统,它提供了获取系统信息和与内核交互的途径。在这个文件系统中,有两个关键的文件——/proc/cpuinfo和/proc/...
总之,这个程序展示了如何在Red Hat Linux环境下通过编程方式获取和计算CPU使用率。通过深入理解`/proc/stat`文件和C语言的文件操作,我们可以开发出更复杂的监控工具来满足不同的系统监控需求。
在Linux操作系统中,编写C程序来获取CPU使用率和内存使用情况是通过读取特定的系统文件完成的,这些文件位于`/proc`目录下。`/proc`是一个虚拟文件系统,它提供了关于系统状态的实时信息。以下是如何通过C程序实现这...