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

  • 三星buds2怎么看耳机电量(三星buds2怎么看耳机盒电量)

    三星buds2怎么看耳机电量(三星buds2怎么看耳机盒电量)

  • 华为路由器登录密码是什么(华为路由器登录密码)

    华为路由器登录密码是什么(华为路由器登录密码)

  • 华为nova5pro智能语音助手在哪个功能里(华为nova5pro智能语音小艺能改吗)

    华为nova5pro智能语音助手在哪个功能里(华为nova5pro智能语音小艺能改吗)

  • 拼多多店铺等级lv3(拼多多店铺等级三级)

    拼多多店铺等级lv3(拼多多店铺等级三级)

  • 拼多多的黑卡怎么用(拼多多的黑卡怎么开通)

    拼多多的黑卡怎么用(拼多多的黑卡怎么开通)

  • 苹果手机微信删了能恢复吗(苹果手机微信删了怎么办)

    苹果手机微信删了能恢复吗(苹果手机微信删了怎么办)

  • oppoa91微信视频怎么美颜(oppoa72手机微信视频怎么样)

    oppoa91微信视频怎么美颜(oppoa72手机微信视频怎么样)

  • win10电脑网络属性打不开(win10网络类型在哪里设置)

    win10电脑网络属性打不开(win10网络类型在哪里设置)

  • ipv6地址数为多少位(ipv6的地址数量是)

    ipv6地址数为多少位(ipv6的地址数量是)

  • mt6799处理器相当于骁龙哪款(mtk6799处理器相当于高通多少)

    mt6799处理器相当于骁龙哪款(mtk6799处理器相当于高通多少)

  • 表格顶端标题怎么设置(表格顶端标题怎么做)

    表格顶端标题怎么设置(表格顶端标题怎么做)

  • 手机上面出个hd收费吗(手机上面出个HD怎么取消)

    手机上面出个hd收费吗(手机上面出个HD怎么取消)

  • qq个性赞在哪里设置(qq 个性赞)

    qq个性赞在哪里设置(qq 个性赞)

  • 华为地图在哪打开(华为的地图叫什么)

    华为地图在哪打开(华为的地图叫什么)

  • 直接拔u盘会怎么样(拔u盘直接拔可以吗)

    直接拔u盘会怎么样(拔u盘直接拔可以吗)

  • 魅族16T怎么打开个人助理(魅族16t怎么打开隐藏空间)

    魅族16T怎么打开个人助理(魅族16t怎么打开隐藏空间)

  • 虚拟化的四大特性(虚拟化的4个本质特征)

    虚拟化的四大特性(虚拟化的4个本质特征)

  • 拉黑了对方能发信息吗(拉黑了对方能发信息给对方吗)

    拉黑了对方能发信息吗(拉黑了对方能发信息给对方吗)

  • pr怎么创建项目(pr怎么创建项目改尺寸)

    pr怎么创建项目(pr怎么创建项目改尺寸)

  • 抖音怎么保存静态壁纸(抖音怎么保存静态视频)

    抖音怎么保存静态壁纸(抖音怎么保存静态视频)

  • 小米9有几个版本(小米9有几个版本型号)

    小米9有几个版本(小米9有几个版本型号)

  • 360sd.exe是什么进程 360sd.exe可以删除吗(360devm.sys是什么文件)

    360sd.exe是什么进程 360sd.exe可以删除吗(360devm.sys是什么文件)

  • 前端学习之HTML(前端html模板)

    前端学习之HTML(前端html模板)

  • 前端开发是做什么的?工作职责(前端开发做什么副业)

    前端开发是做什么的?工作职责(前端开发做什么副业)

  • vue 实现动态路由(vue3.0动态路由)

    vue 实现动态路由(vue3.0动态路由)

  • 若依框架前端Vue项目分析实战(若依框架前端发请求)

    若依框架前端Vue项目分析实战(若依框架前端发请求)

  • 福利费的进项税额会计分录
  • 间接税种有哪些
  • 工程中常见的土方工程有哪些
  • 出资款在现金流中怎么体现
  • 企业电子支付
  • 非贸易付汇去银行汇款流程
  • 物业费专用发票税率
  • 印花税减半征收优惠政策2022
  • 建筑物加高违法么
  • 管理费用是进项还是销项
  • 代收代付如何进行账务处理?
  • 开票商品名称是什么意思
  • 刚升级一般纳税人可以申请贷款吗
  • 长期应付款账面价值和账面余额
  • 个税申报表怎么打印
  • 工资薪金支出税收额是什么意思
  • 大宗物资吧
  • 纳税额和纳税总额
  • 网上申报附加税怎么报
  • 一式三联的收据哪一联要盖财务章
  • 商誉减值可以避税吗
  • 融资租入固定资产改建支出计入
  • macos catalina新功能
  • linux压缩.gz
  • compaq-rba.exe是哪个方面的进程 作用是什么 compaq-rba进程查询
  • 期货保证金的计算公式当日盈亏怎么算
  • 应交营业税计算公式
  • echart设置legend
  • php文件上传用什么请求方法
  • canvas软件教程
  • 前端bs是什么
  • 发现新大陆的是麦哲伦还是哥伦布
  • 日记账对方科目是什么意思
  • 印花税的缴税对象是
  • 股东借款属于什么科目
  • 购买垃圾桶计入什么科目
  • 年底应交增值税销项税额要结平吗
  • html导航链接
  • php_fileinfo不支持
  • 个体户可以开多少免税发票
  • 国家税务总局金税四期
  • 银行贷款是应付账款吗
  • 契税和印花税的会计分录
  • 企业收到的政府部门工作经费
  • 按揭房办理抵押贷款
  • 暂估入库需要入什么科目
  • 交易性金融资产的账务处理
  • 哪几种情况涉及到进项税额的转出
  • 微信支付属于现金支付还是转账支付
  • 职工住房补贴能否计入工资总额在税前扣除?
  • 结算金额和付款金额
  • 兼职会计做什么工作
  • MYSQL updatexml()函数报错注入解析
  • win10系统的邮件和日历跟outlook一样嘛
  • linux系统中的一切都归结为
  • 电脑界面显示windows
  • windows显示缩略图
  • mac不小心把硬盘删了怎么办
  • pax是什么文件
  • win7关闭右下角操作中心
  • 云存储服务怎么打开
  • win7系统待机设置
  • win8怎么打开桌面
  • unity 插件开发
  • 使用jquery实现的项目
  • shell 递归
  • pycharm官方教程
  • javascript模块化规范
  • 在dos下删除文件
  • 超级给力的好人有哪些
  • windows,linux
  • 如何编写高质量创业计划书实验小结
  • android studio项目无法运行
  • python tcp编程
  • jquery点击事件有什么方法显示
  • 百旺税控密码忘记了怎么找回
  • 个体工商户票种核定金额应该填多少
  • 天津电子税务局官网登录入口网页版
  • 实名办税信息采集的身份证件
  • 个人所得税优惠政策最新2023年度
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设