位置: 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是什么)

  • 华为手机微信语音聊天的小窗口怎么关闭(华为手机微信语音声音小怎么调)

    华为手机微信语音聊天的小窗口怎么关闭(华为手机微信语音声音小怎么调)

  • 打印机能用几年(一个打印机能用几年)

    打印机能用几年(一个打印机能用几年)

  • 8p画质模糊怎么回事儿(iphone8画质不清晰)

    8p画质模糊怎么回事儿(iphone8画质不清晰)

  • pr右下角有个红色警告(pr右下角有个红色警告然后电脑就黑屏了)

    pr右下角有个红色警告(pr右下角有个红色警告然后电脑就黑屏了)

  • 安卓充电头可以充苹果吗(安卓充电头可以充苹果13吗)

    安卓充电头可以充苹果吗(安卓充电头可以充苹果13吗)

  • 苹果手机一直黑屏转圈怎么回事(苹果手机一直黑屏怎么办)

    苹果手机一直黑屏转圈怎么回事(苹果手机一直黑屏怎么办)

  • 手机qq直播画面不清晰怎么办(qq如何直播手机画面)

    手机qq直播画面不清晰怎么办(qq如何直播手机画面)

  • 为什么华为手机微信不显示内容(为什么华为手机突然黑屏然后按开机键都不显示)

    为什么华为手机微信不显示内容(为什么华为手机突然黑屏然后按开机键都不显示)

  • 奔腾g630相当于酷睿i几(奔腾g630相当于amd的哪一个)

    奔腾g630相当于酷睿i几(奔腾g630相当于amd的哪一个)

  • 手机上面出个hd是什么(手机上面出个hd1是什么)

    手机上面出个hd是什么(手机上面出个hd1是什么)

  • 新换的苹果不显示通讯录怎么办(快速开始 旧iphone没显示)

    新换的苹果不显示通讯录怎么办(快速开始 旧iphone没显示)

  • 笔记本快捷键怎么设置(笔记本快捷键怎么关机重启)

    笔记本快捷键怎么设置(笔记本快捷键怎么关机重启)

  • 970am中文什么意思(970 am是什么意思)

    970am中文什么意思(970 am是什么意思)

  • 耳机盒可以单独充电吗(耳机盒可以单独换吗)

    耳机盒可以单独充电吗(耳机盒可以单独换吗)

  • p10plus可以人脸解锁吗(华为p10怎么开启人脸)

    p10plus可以人脸解锁吗(华为p10怎么开启人脸)

  • ps辅助线怎么删除(ps辅助线怎么删除一条)

    ps辅助线怎么删除(ps辅助线怎么删除一条)

  • vivox23充电多久充满(vivox20充电多久)

    vivox23充电多久充满(vivox20充电多久)

  • 手机电池损耗多少更换(手机电池损耗多有危险吗)

    手机电池损耗多少更换(手机电池损耗多有危险吗)

  • 什么叫ipv6网络(什么是ipv6网络协议)

    什么叫ipv6网络(什么是ipv6网络协议)

  • 苹果x屏幕是2k吗(iphonex是不是2k屏幕)

    苹果x屏幕是2k吗(iphonex是不是2k屏幕)

  • jkm_al00是什么型号(jkm al00是什么型号)

    jkm_al00是什么型号(jkm al00是什么型号)

  • pcb布线技巧(pcb布线规则和技巧在哪里学)

    pcb布线技巧(pcb布线规则和技巧在哪里学)

  • vivo怎么隐藏返回键(vivo手机怎么样隐藏返回键)

    vivo怎么隐藏返回键(vivo手机怎么样隐藏返回键)

  • p30怎么关后台(华为p30如何关闭后后运行程序)

    p30怎么关后台(华为p30如何关闭后后运行程序)

  • 苹果备忘录旧密码忘了(苹果备忘录旧密码怎么找回)

    苹果备忘录旧密码忘了(苹果备忘录旧密码怎么找回)

  • 企业信用公示的时效是多久
  • 金税四期主要监管什么
  • 代理费住宿费都包括什么
  • 建筑业工会经费0.12% 怎么来的
  • 自然人管理系统银行信息
  • 个体工商户生产经营所得怎么申报
  • 转让固定资产发生的费用计入什么科目
  • 税控系统维护费账务处理
  • 个税申报没交会收滞纳金吗
  • 园林绿化公司要交税吗
  • 水利建设专项收入的税率是多少?
  • 减税必须通过开户银行吗
  • 2019年基金市场
  • 生育津贴还扣税吗
  • 企业销售使用过的汽车如何开票
  • 员工福利专票分录
  • 行业协会会费收缴标准
  • 年初建账的期初余额
  • symtray.exe - symtray是什么进程 有何作用
  • unsupportedfirsthd解决办法
  • 设计费要计入固定费用吗
  • 环评费入账的会计分录是什么啊
  • 财政收回额度怎么记账
  • 怎么取消网络手动连接
  • wordpress 常用函数
  • w10电脑节能模式
  • 微软输入法卸载不了
  • vue qrcode生成二维码
  • 刷票系统能看出来吗
  • 建筑企业总包方都有哪些印花税
  • iis制作网页
  • 外贸企业进项发票能是外贸企业吗
  • 一证通网上报税流程
  • php xdebug配置
  • opencv调用yolov8
  • High-resolution image reconstruction with latent diffusion models from human brain activity
  • imu模型
  • thinkphp怎么用
  • php页面刷新
  • 房地产企业出售房产增值税
  • wordpress限制ip访问
  • 跨年进项税额未做账
  • 车辆上牌费用会涨吗
  • 连锁店会计的工作内容
  • 利润表年报本期金额填什么
  • mysql5.7.17在win2008R2的64位系统安装与配置实例
  • 什么情况下要缴纳房产税
  • 车间管理人员差旅费
  • 交易性金融资产公允价值变动怎么算
  • 委托加工账务处理受托方会计分录
  • 其他应付款如何清零
  • 进项转出再转入
  • 工程挂靠取得的收入怎么做账?
  • 咨询服务费可以全额扣除吗
  • 取得资产需要付出成本吗
  • 坐车时的保险费怎么算
  • 托收承付的承付是指
  • 本月增值税申报截止日
  • sql server数据库怎么导出
  • innodb数据和索引文件
  • solaris命令
  • ubuntu搭建vsftp
  • centos作用
  • ubuntu安装配置静态ip地址
  • mac系统常见问题
  • win8桌面键盘
  • linux arp -s
  • win10搜索不到无线网卡
  • win8怎么快速开机
  • linux下忘记mysql密码的几种找回方法(推荐)
  • ajax怎么用
  • pygame rect.move
  • js限制输入字符长度
  • 安卓权限管理app
  • 百望税控盘电子发票发送邮箱
  • 广东国家电子税务全电发票
  • 怎样查询一个企业是不是一般纳税人
  • 划拨土地是否可以出租的法律规定
  • 个人所得税税前扣除是什么意思
  • 国家土地征收管理办法
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设