位置: IT常识 - 正文

Linux中计算特定CPU使用率案例详解(linux 计算字符数)

编辑:rootadmin
这篇文章主要介绍了Linux中计算特定CPU使用率案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下... 21-09-02

推荐整理分享Linux中计算特定CPU使用率案例详解(linux 计算字符数),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:linux怎么计算,linux计算pi,linux运算,linux运算,linux 计算命令,linux 算数,linux计算pi,linux计算sha1,内容如对您有帮助,希望把文章链接给更多的朋友!

Linux中计算特定CPU使用率 需求解决方案拓展参考

需求

在Linux中可以通过top指令查看某一进程占用的CPU情况,也可以查看某一个CPU使用率情况(先top指令,然后按数字“1”键即可显示每一个CPU的使用情况),如下图:

而我们的需求是:如何得到一个CPU的占用率呢?

解决方案

1. 背景知识

在/proc/stat中可以查看每一个CPU的使用情况的,如下图:

Linux中计算特定CPU使用率案例详解(linux 计算字符数)

其中cpu(0/1/2/…)后面的那十个数字含义如下:

/proc/statkernel/system statistics. Varies with architecture. Common entries include:user nice system idle iowait irq softirq steal guest guest_nicecpu 4705 356 584 3699 23 23 0 0 0 0cpu0 1393280 32966 572056 13343292 6130 0 17875 0 23933 0The amount of time, measured in units of USER_HZ(1/100ths of a second on most architectures, usesysconf(_SC_CLK_TCK) to obtain the right value), thatthe system ("cpu" line) or the specific CPU ("cpuN"line) spent in various states:user (1) Time spent in user mode.nice (2) Time spent in user mode with low priority(nice).system (3) Time spent in system mode.idle (4) Time spent in the idle task. This valueshould be USER_HZ times the second entry in the/proc/uptime pseudo-file.iowait (since Linux 2.5.41)(5) Time waiting for I/O to complete. Thisvalue is not reliable, for the following rea‐sons:1. The CPU will not wait for I/O to complete;iowait is the time that a task is waiting forI/O to complete. When a CPU goes into idlestate for outstanding task I/O, another taskwill be scheduled on this CPU.2. On a multi-core CPU, the task waiting for I/Oto complete is not running on any CPU, so theiowait of each CPU is difficult to calculate.3. The value in this field may decrease in cer‐tain conditions.irq (since Linux 2.6.0-test4)(6) Time servicing interrupts.softirq (since Linux 2.6.0-test4)(7) Time servicing softirqs.steal (since Linux 2.6.11)(8) Stolen time, which is the time spent inother operating systems when running in a virtu‐alized environmentguest (since Linux 2.6.24)(9) Time spent running a virtual CPU for guestoperating systems under the control of the Linuxkernel.guest_nice (since Linux 2.6.33)(10) Time spent running a niced guest (virtualCPU for guest operating systems under the con‐trol of the Linux kernel).

2.计算具体CPU使用率

有了上面的背景知识,接下来我们就可以计算具体CPU的使用情况了。具体计算方式如下:

Total CPU time since boot = user+nice+system+idle+iowait+irq+softirq+stealTotal CPU Idle time since boot = idle + iowaitTotal CPU usage time since boot = Total CPU time since boot-Total CPU Idle time since bootTotal CPU percentage = Total CPU usage time since boot/Total CPU time since boot * 100%

有了上面的计算公式,计算某一CPU使用率或者系统总的CPU占用率也就是不难了。示例:计算系统整体CPU占用情况首先从/proc/stat中获取 t1时刻系统总体的user、nice、system、idle、iowait、irq、softirq、steal、guest、guest_nice的值,得到此时Total CPU time since boot(记为total1)和 Total CPU idle time since boot(记为idle1)。其次,从/proc/stat中获取t2时刻系统总的Total CPU time since boot(记为total2)和Total CPU idle time since boot(记为idle2)。(方法同上一步)最后,计算t2与t1之间系统总的CPU使用情况。也就是:CPU percentage between t1 and t2 = ((total2-total1)-(idle2-idle1))/(total2-total1)* 100%其中, ((total2-total1)-(idle2-idle1))实际上就是t1与t2时刻之间系统CPU被占用的时间(总时间-空闲时间)。下面是一段计算时间段内CPU被占用情况的脚本:

#!/bin/bash# by Paul Colby (http://colby.id.au), no rights reserved ;)PREV_TOTAL=0PREV_IDLE=0while true; do# Get the total CPU statistics, discarding the 'cpu ' prefix.CPU=(`sed -n 's/^cpu\s//p' /proc/stat`)IDLE=${CPU[3]} # Just the idle CPU time.# Calculate the total CPU time.TOTAL=0for VALUE in "${CPU[@]}"; dolet "TOTAL=$TOTAL+$VALUE"done# Calculate the CPU usage since we last checked.let "DIFF_IDLE=$IDLE-$PREV_IDLE"let "DIFF_TOTAL=$TOTAL-$PREV_TOTAL"let "DIFF_USAGE=(1000*($DIFF_TOTAL-$DIFF_IDLE)/$DIFF_TOTAL+5)/10"echo -en "\rCPU: $DIFF_USAGE% \b\b"# Remember the total and idle CPU times for the next check.PREV_TOTAL="$TOTAL"PREV_IDLE="$IDLE"# Wait before checking again.sleep 1done拓展

在内核中,关于/proc/stat中文件的实现函数如下:

附注:内核版本3.14.69,文件为 /fs/proc/stat.c#include <linux/cpumask.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/interrupt.h>#include <linux/kernel_stat.h>#include <linux/proc_fs.h>#include <linux/sched.h>#include <linux/seq_file.h>#include <linux/slab.h>#include <linux/time.h>#include <linux/irqnr.h>#include <asm/cputime.h>#include <linux/tick.h>#ifndef arch_irq_stat_cpu#define arch_irq_stat_cpu(cpu) 0#endif#ifndef arch_irq_stat#define arch_irq_stat() 0#endif#ifdef arch_idle_timestatic cputime64_t get_idle_time(int cpu){cputime64_t idle;idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE];if (cpu_online(cpu) && !nr_iowait_cpu(cpu))idle += arch_idle_time(cpu);return idle;}static cputime64_t get_iowait_time(int cpu){cputime64_t iowait;iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT];if (cpu_online(cpu) && nr_iowait_cpu(cpu))iowait += arch_idle_time(cpu);return iowait;}#elsestatic u64 get_idle_time(int cpu){u64 idle, idle_time = -1ULL;if (cpu_online(cpu))idle_time = get_cpu_idle_time_us(cpu, NULL);if (idle_time == -1ULL)/* !NO_HZ or cpu offline so we can rely on cpustat.idle */idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE];elseidle = usecs_to_cputime64(idle_time);return idle;}static u64 get_iowait_time(int cpu){u64 iowait, iowait_time = -1ULL;if (cpu_online(cpu))iowait_time = get_cpu_iowait_time_us(cpu, NULL);if (iowait_time == -1ULL)/* !NO_HZ or cpu offline so we can rely on cpustat.iowait */iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT];elseiowait = usecs_to_cputime64(iowait_time);return iowait;}#endifstatic int show_stat(struct seq_file *p, void *v){int i, j;unsigned long jif;u64 user, nice, system, idle, iowait, irq, softirq, steal;u64 guest, guest_nice;u64 sum = 0;u64 sum_softirq = 0;unsigned int per_softirq_sums[NR_SOFTIRQS] = {0};struct timespec boottime;user = nice = system = idle = iowait =irq = softirq = steal = 0;guest = guest_nice = 0;getboottime(&boottime);jif = boottime.tv_sec;for_each_possible_cpu(i) {user += kcpustat_cpu(i).cpustat[CPUTIME_USER];nice += kcpustat_cpu(i).cpustat[CPUTIME_NICE];system += kcpustat_cpu(i).cpustat[CPUTIME_SYSTEM];idle += get_idle_time(i);iowait += get_iowait_time(i);irq += kcpustat_cpu(i).cpustat[CPUTIME_IRQ];softirq += kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ];steal += kcpustat_cpu(i).cpustat[CPUTIME_STEAL];guest += kcpustat_cpu(i).cpustat[CPUTIME_GUEST];guest_nice += kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE];sum += kstat_cpu_irqs_sum(i);sum += arch_irq_stat_cpu(i);for (j = 0; j < NR_SOFTIRQS; j++) {unsigned int softirq_stat = kstat_softirqs_cpu(j, i);per_softirq_sums[j] += softirq_stat;sum_softirq += softirq_stat;}}sum += arch_irq_stat();seq_puts(p, "cpu ");seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(user));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(nice));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(system));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(idle));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(iowait));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(irq));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(softirq));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(steal));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(guest));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(guest_nice));seq_putc(p, '\n');for_each_online_cpu(i) {/* Copy values here to work around gcc-2.95.3, gcc-2.96 */user = kcpustat_cpu(i).cpustat[CPUTIME_USER];nice = kcpustat_cpu(i).cpustat[CPUTIME_NICE];system = kcpustat_cpu(i).cpustat[CPUTIME_SYSTEM];idle = get_idle_time(i);iowait = get_iowait_time(i);irq = kcpustat_cpu(i).cpustat[CPUTIME_IRQ];softirq = kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ];steal = kcpustat_cpu(i).cpustat[CPUTIME_STEAL];guest = kcpustat_cpu(i).cpustat[CPUTIME_GUEST];guest_nice = kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE];seq_printf(p, "cpu%d", i);seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(user));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(nice));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(system));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(idle));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(iowait));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(irq));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(softirq));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(steal));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(guest));seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(guest_nice));seq_putc(p, '\n');}seq_printf(p, "intr %llu", (unsigned long long)sum);/* sum again ? it could be updated? */for_each_irq_nr(j)seq_put_decimal_ull(p, ' ', kstat_irqs_usr(j));seq_printf(p,"\nctxt %llu\n""btime %lu\n""processes %lu\n""procs_running %lu\n""procs_blocked %lu\n",nr_context_switches(),(unsigned long)jif,total_forks,nr_running(),nr_iowait());seq_printf(p, "softirq %llu", (unsigned long long)sum_softirq);for (i = 0; i < NR_SOFTIRQS; i++)seq_put_decimal_ull(p, ' ', per_softirq_sums[i]);seq_putc(p, '\n');return 0;}static int stat_open(struct inode *inode, struct file *file){size_t size = 1024 + 128 * num_possible_cpus();char *buf;struct seq_file *m;int res;/* minimum size to display an interrupt count : 2 bytes */size += 2 * nr_irqs;/* don't ask for more than the kmalloc() max size */if (size > KMALLOC_MAX_SIZE)size = KMALLOC_MAX_SIZE;buf = kmalloc(size, GFP_KERNEL);if (!buf)return -ENOMEM;res = single_open(file, show_stat, NULL);if (!res) {m = file->private_data;m->buf = buf;m->size = ksize(buf);} elsekfree(buf);return res;}static const struct file_operations proc_stat_operations = {.open= stat_open,.read= seq_read,.llseek= seq_lseek,.release= single_release,};static int __init proc_stat_init(void){proc_create("stat", 0, NULL, &proc_stat_operations);return 0;}fs_initcall(proc_stat_init);参考

http://man7.org/linux/man-pages/man5/proc.5.html

https://github.com/pcolby/scripts/blob/master/cpu.sh

https://elixir.bootlin.com/linux/v3.14.69/source/fs/proc/stat.c

到此这篇关于Linux中计算特定CPU使用率案例详解的文章就介绍到这了,更多相关Linux中计算特定CPU使用率内容请搜索电脑学习网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持电脑学习网!

本文链接地址:https://www.jiuchutong.com/zhishi/278044.html 转载请保留说明!

上一篇:爱荷华州中部的高架栈桥 (© Kelly van Dellen/Getty Images Plus)(爱荷华州的首府)

下一篇:mhotkey.exe是什么进程 有什么作用 mhotkey进程查询(onekey.exe是什么)

  • 腾讯电脑管家怎么禁止广告(腾讯电脑管家怎么用QQ登录)

    腾讯电脑管家怎么禁止广告(腾讯电脑管家怎么用QQ登录)

  • 微信注销还能恢复吗(微信注销还能恢复账号吗)

    微信注销还能恢复吗(微信注销还能恢复账号吗)

  • 双十一退回的红包还能用吗(2020双十一退货红包退回吗?)

    双十一退回的红包还能用吗(2020双十一退货红包退回吗?)

  • 淘宝未付款订单怎么取消(怎么关闭淘宝未付款订单)

    淘宝未付款订单怎么取消(怎么关闭淘宝未付款订单)

  • ipad蓝牙搜不到罗技键盘(ipad蓝牙搜不到红米buds4)

    ipad蓝牙搜不到罗技键盘(ipad蓝牙搜不到红米buds4)

  • 华为mate30下面三个键如何设置(华为mate30下面三个键不灵敏怎么办)

    华为mate30下面三个键如何设置(华为mate30下面三个键不灵敏怎么办)

  • 计算机的操作系统是(计算机的操作系统有哪些功能)

    计算机的操作系统是(计算机的操作系统有哪些功能)

  • vi818a是什么手机(vivo v1818a是什么手机)

    vi818a是什么手机(vivo v1818a是什么手机)

  • 引入线索二叉树的目的(引入二叉线索树的目的是为了能方便的找到双亲)

    引入线索二叉树的目的(引入二叉线索树的目的是为了能方便的找到双亲)

  • 声音锁有什么用(声音锁是干什么用的)

    声音锁有什么用(声音锁是干什么用的)

  • 手机装卡的地方打不开(手机装卡的地方怎么打开?)

    手机装卡的地方打不开(手机装卡的地方怎么打开?)

  • 苹果手机上的通讯录怎么弄到另一个手机上(苹果手机上的通讯录怎么删除)

    苹果手机上的通讯录怎么弄到另一个手机上(苹果手机上的通讯录怎么删除)

  • 苹果11配套的耳机是不是无线的(苹果11配套耳机是几代)

    苹果11配套的耳机是不是无线的(苹果11配套耳机是几代)

  • 怎么把分页改成一页(分页怎么变成竖版)

    怎么把分页改成一页(分页怎么变成竖版)

  • 手机代码是什么(手机的代码大全)

    手机代码是什么(手机的代码大全)

  • 微信里草稿怎么恢复(微信里草稿怎么保存)

    微信里草稿怎么恢复(微信里草稿怎么保存)

  • 华为荣耀20i支持nfc功能吗(华为荣耀20i支持otj)

    华为荣耀20i支持nfc功能吗(华为荣耀20i支持otj)

  • 文件夹如何按序号排列(文件夹如何按序排列图片)

    文件夹如何按序号排列(文件夹如何按序排列图片)

  • 交换机和路由器的概念(交换机和路由器相比主要的区别有)

    交换机和路由器的概念(交换机和路由器相比主要的区别有)

  • 如何创建脚本文件(如何创建脚本文件myscript)

    如何创建脚本文件(如何创建脚本文件myscript)

  • 导航窗格在哪里(word文档中导航窗格在哪里)

    导航窗格在哪里(word文档中导航窗格在哪里)

  • 办公打印机的使用步骤(办公打印机的使用)

    办公打印机的使用步骤(办公打印机的使用)

  • 画世界图层最多可以创建几个呢(画世界图层最多有几个)

    画世界图层最多可以创建几个呢(画世界图层最多有几个)

  • 如何通过微信发十几分钟的视频(如何通过微信发送大文件)

    如何通过微信发十几分钟的视频(如何通过微信发送大文件)

  • windows如何打开摄像头(tar文件在windows如何打开)

    windows如何打开摄像头(tar文件在windows如何打开)

  • 加班费要计入个人账户吗
  • 海外工作薪资比国内高多少
  • 企业所得税年报过了申报期还能修改吗
  • 雇佣退休人员工伤赔偿标准
  • 未过户的车辆对车辆影响
  • 固定资产原值的含义
  • 应付账款 暂估
  • 房屋租赁合同印花税租赁双方各自要交多少
  • 总公司购固定资产分摊每家店面怎么来做账
  • 当月发的奖金怎么扣个税
  • 增值税免税收入进项税额转出
  • 增值税申报表能更正申报吗
  • 弥补以前年度亏损从哪里取数
  • 机动车发票认证了的发票怎么红冲
  • 普票没有税号可以开票吗
  • 小微企业如何备案
  • office软件图标不显示
  • 应如何做会计分录表
  • win10怎么看已安装的驱动
  • php小程序开发完整教程
  • linux监控系统命令
  • ph是什么文件
  • Win11怎么设置屏幕熄灭时间
  • 外贸企业出口退税账务处理
  • 房地产企业哪些成本上升了
  • linux块设备驱动详解
  • 金钱树的养殖方法 盆栽
  • 支出的科目有哪些
  • php获取指定数量的数据
  • 基于Pytorch的风格转换
  • html如何导入excel
  • 投标代理服务
  • 小规模纳税人增值税税率
  • 农民专业合作社名词解释
  • 股东股权转让是什么意思
  • 代开发票是否代征城建税和教育费附加?
  • 一般纳税人按简易办法计税销售额
  • sql server怎么创建约束
  • 购进交通运输设备怎么做账
  • 外聘专家机票能抵扣增值税吗
  • 金税四期能监控到公户吗
  • 企业投资股权收益如何征税
  • 免税收入就是不征收收入,均属于税收优惠范畴
  • 开票金额大于收入增值税申报表填写
  • 电子商业承兑会不会拿不到钱
  • 搬迁赔偿款
  • 可供分配的利润是什么意思
  • 政府补贴项目需要审批吗
  • 包工包料工程如何报价合理
  • 车船税没有发票可以入账吗
  • 房屋租赁的注意问题
  • 银行汇票可用于异地结算吗
  • 管理费用和销售费用都有职工薪酬
  • 将IBM ServeRAID 8i卡的驱动整合到Win2003安装光盘里
  • 宏基aspire s3适用固态硬盘
  • win10 edge浏览器在哪里
  • ubuntu文本编辑器怎么打开
  • w10 2021年更新
  • win8系统怎么关机
  • win10升级 其他用户
  • linux中比较文件链接数的变化
  • 水模拟软件
  • drawcalls2000多
  • css一般可以放在几个地方
  • 利用用英文怎么翻译
  • js中的date函数
  • vue devtools功能
  • 一个治疗Unity的Prefab强迫症患者的小招(Prefab变成红色的问题)
  • JavaScript焦点事件、鼠标事件和滚轮事件使用详解
  • 用原生js实现过什么功能
  • jQuery插件cxSelect多级联动下拉菜单实例解析
  • 跨浏览器插件
  • 税务稽查总队
  • 申报参保时间怎么填
  • 2021年吉林省城乡居民基础养老金是多少
  • 蜀山区税务局工资待遇
  • 小学语文教学的核心素养
  • 执法事业单位改革最新进展
  • 国税增值税申报怎么记账凭证填写
  • 代理记账公司有什么风险吗?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设