暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

使用/proc/stat文件中的内容计算CPU的使用率

watson 2025-03-14
11

 在Linux系统中,/proc/stat文件是一个非常重要的资源,它提供了关于系统CPU活动的详细信息。这个文件位于系统的/proc目录下,是一个伪文件系统,它以文件系统的方式为内核与进程提供通信接口。用户和应用程序可以通过读取/proc/stat来获取系统的信息,并可以改变内核的某些参数。


/proc/stat文件内容概述


      /proc/stat文件记录了所有CPU活动的信息,这些信息是从系统启动开始累计到当前时刻的。文件中包含多行数据,每一行代表一个CPU核心(如果系统是多核的话)。每一行的数据格式如下:


cpu 65376847 3627562405159 10834971593 3765180 93399 2395097 0

cpu0 7680302 5263 111909 1355640955 47680 0 185343 0

cpu1 6527638 2261 327795 1356540189 249151 1 24242 0



每一行的第一个字段是“cpu”或“cpuN”(N代表核心编号),接下来的数字分别代表不同的CPU状态:


user(用户态CPU时间):从系统启动开始累计到当前时刻,用户态的CPU时间,不包含nice值为负进程。

nice(低优先级进程的CPU时间):从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间。

system(核心态CPU时间):从系统启动开始累计到当前时刻,核心时间。

idle(空闲时间):从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间。

iowait(硬盘IO等待时间):从系统启动开始累计到当前时刻,硬盘IO等待时间。

irq(中断处理时间):从系统启动开始累计到当前时刻,服务中断的时间。

softirq(软中断处理时间):从系统启动开始累计到当前时刻,服务软中断的时间。

steal(虚拟化环境中被其他操作系统占用的时间)。

guest(运行虚拟CPU为客户操作系统的时间)。

guest_nice(运行低优先级虚拟CPU为客户操作系统的时间)。

计算CPU使用率的方法


       为了计算CPU的使用率,我们需要读取/proc/stat文件两次,两次读取之间间隔一个较短的时间段。计算步骤如下:


第一次读取:记录下每个CPU状态的时间值,记作t1。

第二次读取:在间隔一段时间后,再次记录每个CPU状态的时间值,记作t2。

计算总CPU时间片:将两次读取的所有CPU状态值分别求和,得到s1和s2。总CPU时间片为totalCpuTime = s2 - s1。

计算空闲时间:空闲时间为idle2 - idle1。

计算CPU使用率:CPU使用率计算公式为pcpu = 100 * (totalCpuTime - idle) / totalCpuTime。


示例代码


以下是一个简单的C语言示例代码,用于计算CPU使用率:


#include <stdio.h>

#include <stdlib.h>


int main() {

    FILE *fp;

    long int user1, nice1, sys1, idle1, iowait1, irq1, softirq1, steal1, guest1, guest_nice1;

    long int user2, nice2, sys2, idle2, iowait2, irq2, softirq2, steal2, guest2, guest_nice2;

    float usage;


    // 第一次读取

    fp = fopen("/proc/stat", "r");

    fscanf(fp, "%*s %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", &user1, &nice1, &sys1, &idle1, &iowait1, &irq1, &softirq1, &steal1, &guest1, &guest_nice1);

    fclose(fp);


    // 等待一段时间

    sleep(1);


    // 第二次读取

    fp = fopen("/proc/stat", "r");

    fscanf(fp, "%*s %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", &user2, &nice2, &sys2, &idle2, &iowait2, &irq2, &softirq2, &steal2, &guest2, &guest_nice2);

    fclose(fp);


    // 计算总CPU时间和空闲时间

    long int total1 = user1 + nice1 + sys1 + idle1 + iowait1 + irq1 + softirq1 + steal1 + guest1 + guest_nice1;

    long int total2 = user2 + nice2 + sys2 + idle2 + iowait2 + irq2 + softirq2 + steal2 + guest2 + guest_nice2;

    long int totalCpuTime = total2 - total1;

    long int idle = idle2 - idle1;


    // 计算CPU使用率

    usage = (float)(totalCpuTime - idle) / totalCpuTime * 100;

    printf("CPU usage: %.2f%%\n", usage);


    return 0;

}

      这段代码通过读取/proc/stat文件两次,计算出在这段时间间隔内的CPU使用率。请注意,这个示例代码仅适用于单核CPU的情况。对于多核CPU,需要对每个核心分别计算使用率,然后取平均值。


总结


      通过/proc/stat文件,Linux系统提供了关于CPU活动的详细信息。利用这些信息,我们可以准确地计算出CPU的使用率,这对于系统监控和性能调优非常重要。理解/proc/stat文件中的各个参数的含义是计算CPU使用率的基础,而通过编程读取和处理这些数据则可以实现自动化监控。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论