CPU的User、Nice、System、Wait、Idle各个参数的解释

CPU各个具体的指标含义解释如下:

①CPU(监测到的master主机上的CPU使用情况)

在这里插入图片描述

从图中看出,一共有五个关于CPU的指标。分别如下:

ⓐ User

User表示:CPU一共花了多少比例的时间运行在用户态空间或者说是用户进程(running user space processes)。典型的用户态空间程序有:Shells、数据库、web服务器……

ⓑ Nice

Nice表示:可理解为,用户空间进程的CPU的调度优先级,范围为[-20,19]

You can set the nice value when launching a process with the nice command and then change it with the renice command.
Only the superuser (root) can specify a priority increase of a process.
具体参考:Cpu中的Nice是什么?

ⓒSystem

System的含义与User相似。System表示:CPU花了多少比例的时间在内核空间运行。分配内存、IO操作、创建子进程……都是内核操作。这也表明,当IO操作频繁时,System参数会很高。

When a user space process needs something from the system, for example when it needs to allocate memory, perform some I/O,
or it needs to create a child process, then the kernel is running

ⓓWait

在计算机中,读写磁盘的操作远比CPU运行的速度要慢,CPU负载处理数据,而数据一般在磁盘上需要读到内存中才能处理。当CPU发起读写操作后,需要等着磁盘驱动器将数据读入内存(可参考:JAVA IO 以及 NIO 理解),从而导致CPU 在等待的这一段时间内无事可做。CPU处于这种等待状态的时间由Wait参数来衡量。

cpu is idle while waiting for an I/O operation to complete。The time the CPU spends in this state is shown by the wait statistic.

ⓔIdle

Idel表示:CPU处于空闲状态时间比例。一般而言,idel + user + nice 约等于100%

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用Linux系统提供的/proc/stat文件来获取CPU各个核心的使用率。 具体步骤如下: 1. 打开/proc/stat文件,读取CPU总的使用时间和空闲时间 ``` FILE *fp = fopen("/proc/stat", "r"); char buf[1024]; fgets(buf, sizeof(buf), fp); ``` 2. 解析第一行数据,获取总的CPU使用时间和空闲时间 ``` unsigned long long user, nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice; sscanf(buf, "%*s %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu", &user, &nice, &system, &idle, &iowait, &irq, &softirq, &steal, &guest, &guest_nice); unsigned long long total = user + nice + system + idle + iowait + irq + softirq + steal; unsigned long long idle_time = idle + iowait; ``` 3. 等待一段时间(比如1秒),再次读取/proc/stat文件,计算CPU各个核心的使用率 ``` sleep(1); fseek(fp, 0, SEEK_SET); fgets(buf, sizeof(buf), fp); unsigned long long user2, nice2, system2, idle2, iowait2, irq2, softirq2, steal2, guest2, guest_nice2; sscanf(buf, "%*s %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu", &user2, &nice2, &system2, &idle2, &iowait2, &irq2, &softirq2, &steal2, &guest2, &guest_nice2); unsigned long long total2 = user2 + nice2 + system2 + idle2 + iowait2 + irq2 + softirq2 + steal2; unsigned long long idle_time2 = idle2 + iowait2; unsigned long long diff_total = total2 - total; unsigned long long diff_idle = idle_time2 - idle_time; double usage = (diff_total - diff_idle) * 100.0 / diff_total; ``` 4. 根据CPU核心数,重复步骤2和步骤3,计算每个核心的使用率 ``` int cpu_num = sysconf(_SC_NPROCESSORS_CONF); unsigned long long user_cpu[cpu_num], nice_cpu[cpu_num], system_cpu[cpu_num], idle_cpu[cpu_num], iowait_cpu[cpu_num], irq_cpu[cpu_num], softirq_cpu[cpu_num], steal_cpu[cpu_num], guest_cpu[cpu_num], guest_nice_cpu[cpu_num]; memset(user_cpu, 0, sizeof(user_cpu)); memset(nice_cpu, 0, sizeof(nice_cpu)); memset(system_cpu, 0, sizeof(system_cpu)); memset(idle_cpu, 0, sizeof(idle_cpu)); memset(iowait_cpu, 0, sizeof(iowait_cpu)); memset(irq_cpu, 0, sizeof(irq_cpu)); memset(softirq_cpu, 0, sizeof(softirq_cpu)); memset(steal_cpu, 0, sizeof(steal_cpu)); memset(guest_cpu, 0, sizeof(guest_cpu)); memset(guest_nice_cpu, 0, sizeof(guest_nice_cpu)); fseek(fp, 0, SEEK_SET); fgets(buf, sizeof(buf), fp); for (int i = 0; i < cpu_num; i++) { fgets(buf, sizeof(buf), fp); sscanf(buf, "cpu%d %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu", &i, &user_cpu[i], &nice_cpu[i], &system_cpu[i], &idle_cpu[i], &iowait_cpu[i], &irq_cpu[i], &softirq_cpu[i], &steal_cpu[i], &guest_cpu[i], &guest_nice_cpu[i]); } sleep(1); fseek(fp, 0, SEEK_SET); fgets(buf, sizeof(buf), fp); for (int i = 0; i < cpu_num; i++) { fgets(buf, sizeof(buf), fp); unsigned long long user2_cpu, nice2_cpu, system2_cpu, idle2_cpu, iowait2_cpu, irq2_cpu, softirq2_cpu, steal2_cpu, guest2_cpu, guest_nice2_cpu; sscanf(buf, "cpu%d %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu", &i, &user2_cpu, &nice2_cpu, &system2_cpu, &idle2_cpu, &iowait2_cpu, &irq2_cpu, &softirq2_cpu, &steal2_cpu, &guest2_cpu, &guest_nice2_cpu); unsigned long long total_cpu = user2_cpu + nice2_cpu + system2_cpu + idle2_cpu + iowait2_cpu + irq2_cpu + softirq2_cpu + steal2_cpu; unsigned long long idle_time_cpu = idle2_cpu + iowait2_cpu; unsigned long long diff_total_cpu = total_cpu - (user_cpu[i] + nice_cpu[i] + system_cpu[i] + idle_cpu[i] + iowait_cpu[i] + irq_cpu[i] + softirq_cpu[i] + steal_cpu[i] + guest_cpu[i] + guest_nice_cpu[i]); unsigned long long diff_idle_cpu = idle_time_cpu - idle_cpu[i]; double usage_cpu = (diff_total_cpu - diff_idle_cpu) * 100.0 / diff_total_cpu; } ``` 5. 关闭文件指针,输出CPU各个核心的使用率 ``` fclose(fp); for (int i = 0; i < cpu_num; i++) { printf("CPU%d Usage: %.2f%%\n", i, usage_cpu[i]); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值