计算总的 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;
(fyxichen)