Linux计算cpu使用率详解程序员

计算总的 CPU 使用率 TOTALCPUUSE 
 
1)采样两个足够短的时间间隔的 CPU 快照,即读取 /proc/stat 文件,获取两个时间点的下列数据: 
 
CPUT1 (user1, nice1, system1, idle1, iowait1, irq1, softirq1, stealstolen1, guest1); 
CPUT2 (user2, nice2, system2, idle2, iowait2, irq2, softirq2, stealstolen2, guest2); 
2)计算总的 CPU 时间 totalCPUTime: 
 
CPUTime1 = user1 + nice1 + system1 + idle1 + iowait1 + irq1 + softirq1 + stealstolen1 + guest1; 
CPUTime2 = user2 + nice2 + system2 + idle2 + iowait2 + irq2 + softirq2 + stealstolen2 + guest2; 
totalCPUTime = CPUTime2 – CPUTime1; 
 
3)计算 CPU 空闲时间 idleCPUTime: 
 
idleCPUTime = idle2 – idle1; 
 
4)计算总的 CPU 使用率 totalCPUUse: 
 
totalCPUUse = (totalCPUTime – idleCPUTime) / totalCPUTime; 
 
计算某一进程的 CPU 使用率 PROCESSCPUUSE 
 
1)采样两个足够短的时间间隔的 CPU 快照和对应的进程快照,即读取 /proc/stat 文件,获取两个时间点的下列数据: 
 
CPUT1 (user1, nice1, system1, idle1, iowait1, irq1, softirq1, stealstolen1, guest1); 
CPUT2 (user2, nice2, system2, idle2, iowait2, irq2, softirq2, stealstolen2, guest2); 
读取 /proc/[PID]/stat 文件,获取两个时间点的下列数据: 
 
ProcessT1 (utime1, stime1, cutime1, cstime1); 
ProcessT2 (utime2, stime2, cutime2, cstime2); 
2)计算总的 CPU 时间 totalCPUTime 和进程时间 processTime: 
 
CPUTime1 = user1 + nice1 + system1 + idle1 + iowait1 + irq1 + softirq1 + stealstolen1 + guest1; 
CPUTime2 = user2 + nice2 + system2 + idle2 + iowait2 + irq2 + softirq2 + stealstolen2 + guest2; 
totalCPUTime = CPUTime2 – CPUTime1; 
 
processTime1 = utime1 + stime1 + cutime1 + cstime1; 
processTime2 = utime2 + stime2 + cutime1 + cstime2; 
processTime = processTime2 – processTime1; 
 
3)计算该进程的 CPU 使用率 processCPUUse: 
 
processCPUUse = processTime / totalCPUTime; 
 
计算某一线程的 CPU 使用率 threadCPUUse 
 
1)采样两个足够短的时间间隔的 CPU 快照和对应的线程快照,即读取 /proc/stat 文件,获取两个时间点的下列数据: 
 
CPUT1 (user1, nice1, system1, idle1, iowait1, irq1, softirq1, stealstolen1, guest1); 
CPUT2 (user2, nice2, system2, idle2, iowait2, irq2, softirq2, stealstolen2, guest2); 
读取 /proc/[PID]/task/[TID]/stat 文件,获取两个时间点的下列数据: 
 
threadT1 (utime1, stime1); 
threadT2 (utime2, stime2); 
2)计算总的 CPU 时间 totalCPUTime 和线程时间 threadTime: 
 
CPUTime1 = user1 + nice1 + system1 + idle1 + iowait1 + irq1 + softirq1 + stealstolen1 + guest1; 
CPUTime2 = user2 + nice2 + system2 + idle2 + iowait2 + irq2 + softirq2 + stealstolen2 + guest2; 
totalCPUTime = CPUTime2 – CPUTime1; 
 
threadTime1 = utime1 + stime1; 
threadTime2 = utime2 + stime2; 
threadTime = threadTime2 – threadTime1; 
 
3)计算该线程的 CPU 使用率 threadCPUUse: 
 
threadCPUUse = threadTime / totalCPUTime; 
 
 
 
2.5、多核情况下 CPU 使用率的计算 
 
2.5.1、基本思想 
 
首先,通过读取 /proc/stat 文件获取总的 CPU 时间,读取 /proc/[PID]/stat 获取进程 CPU 时间,读取 /proc/[PID]/task/[TID]/stat 获取线程 CPU 时间,读取 /proc/cpuinfo 获取 CPU 个数。 
 
在多核情况下计算进程或线程的 CPU 使用率,用上面的方式得到的通常是相对于 CPU 所有核的总共时间的占用率,而我们通常习惯得到进程或线程对某一个单核的占用率。所以我们可以按上面的方式计算得到 CPU 占用率,然后把结果乘上 CPU 的核数,即可得到进程或线程相对于一个单核的占用率。 
 
2.5.2、计算总的 CPU 使用率 
 
同 2.4.2。 
 
2.5.3、计算某一进程的 CPU 使用率 mProcessCPUUse 
 
1)同 2.4.3 计算某一进程的 CPU 使用率 processCPUUse; 
 
2)读取 /proc/cpuinfo 文件获取逻辑 CPU(processor) 的个数(参见 1.1): processorNum 
 
3)多核情况下该进程的 CPU 使用率 mProcessCPUUse: 
 
mProcessCPUUse = processCPUUse * processorNum; 
 
2.5.4、计算某一线程的 CPU 使用率 mThreadCPUUse 
 
1)同 2.4.4 计算某一线程的 CPU 使用率 threadCPUUse; 
 
2)读取 /proc/cpuinfo 文件获取逻辑 CPU(processor) 的个数(参见 1.1): processorNum 
 
3)多核情况下该线程的 CPU 使用率 mThreadCPUUse: 
 
mThreadCPUUse = threadCPUUse * processorNum;

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/3054.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论