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

  • 单反佳能5d4(单反佳能尼康)(5d4 佳能)

    单反佳能5d4(单反佳能尼康)(5d4 佳能)

  • 什么播放器可以倍速播放(什么播放器可以投屏)

    什么播放器可以倍速播放(什么播放器可以投屏)

  • 华为mate40发布日期(华为mate50pro发布会)

    华为mate40发布日期(华为mate50pro发布会)

  • 支付宝把银行卡里的钱转到余额怎么操作(支付宝把银行卡解绑)

    支付宝把银行卡里的钱转到余额怎么操作(支付宝把银行卡解绑)

  • 华为nova7如何批量删除联系人(华为nova 7怎样)

    华为nova7如何批量删除联系人(华为nova 7怎样)

  • 魅族黑屏后不能唤醒屏幕(魅族手机黑屏后打不开怎么办)

    魅族黑屏后不能唤醒屏幕(魅族手机黑屏后打不开怎么办)

  • 美图秀秀怎么做动漫照片(美图秀秀怎么做壁纸)

    美图秀秀怎么做动漫照片(美图秀秀怎么做壁纸)

  • 朋友圈出现一条横线是什么意思(朋友圈出现一条杠是什么意思)

    朋友圈出现一条横线是什么意思(朋友圈出现一条杠是什么意思)

  • 苹果11如何添加门禁(苹果11如何添加门禁卡)

    苹果11如何添加门禁(苹果11如何添加门禁卡)

  • 抖音每天私信上限(抖音每天私信上限会限流吗)

    抖音每天私信上限(抖音每天私信上限会限流吗)

  • 微博草稿怎样恢复(微博草稿箱里的东西怎么恢复)

    微博草稿怎样恢复(微博草稿箱里的东西怎么恢复)

  • word批量替换多个文件内容(word里面批量替换)

    word批量替换多个文件内容(word里面批量替换)

  • 抖音为什么会被限流(抖音为什么会被盗号)

    抖音为什么会被限流(抖音为什么会被盗号)

  • vivo手机虚电怎么解决(vivo手机虚电怎么解决的视频)

    vivo手机虚电怎么解决(vivo手机虚电怎么解决的视频)

  • 华为影视vip会员有什么用(华为影视vip会员能看什么)

    华为影视vip会员有什么用(华为影视vip会员能看什么)

  • realme x2怎么自拍(realmex2拍照技巧)

    realme x2怎么自拍(realmex2拍照技巧)

  • 微信不联网计步吗(不联网微信运动计步吗)

    微信不联网计步吗(不联网微信运动计步吗)

  • 拼多多退货多了有影响吗(拼多多退货多了是不是没有运费险了)

    拼多多退货多了有影响吗(拼多多退货多了是不是没有运费险了)

  • 陌陌可以通过手机号加好友吗(陌陌可以通过手机号添加吗)

    陌陌可以通过手机号加好友吗(陌陌可以通过手机号添加吗)

  • 联想笔记本开启vt(联想笔记本开启触摸板)

    联想笔记本开启vt(联想笔记本开启触摸板)

  • 全网通4g和移动4g有什么区别(全网4g和移动4g)

    全网通4g和移动4g有什么区别(全网4g和移动4g)

  • persfw.exe是什么进程 persfw进程查询(perl.exe是什么程序?)

    persfw.exe是什么进程 persfw进程查询(perl.exe是什么程序?)

  • 【Vant4】Vant4 样式不显示问题 && Toast 轻提示不显示 && Notify 消息提示不显示(vant3.0)

    【Vant4】Vant4 样式不显示问题 && Toast 轻提示不显示 && Notify 消息提示不显示(vant3.0)

  • 一般纳税人优惠政策最新2022标准
  • 个人所得税查询工资与实际工资不符是为何
  • 如何计提当月的个人所得税?
  • 关税是直接税还是间接税
  • 设备转产需要停止折旧吗
  • 代收款是否开具发票
  • 进口商品仓库
  • 每月先报税还是先清卡
  • 简易征收增值税怎么做账
  • 应收账款待转销和应交税费待转销
  • 费用化支出期末结转
  • 同一控制下资产收购
  • 公司收到一张专用发票
  • 在建工程明细科目
  • 单位收到社保补缴通知书后怎么办
  • 转出未交增值税怎么算
  • 捐赠允诺是否有法律约束力?
  • 即征即退收入是否计入所得税
  • 上海地方教育费附加减半征收2018
  • 季度所得税报表怎么填
  • 研发支出采用什么明细账
  • 购买汽车分期付款利息怎么算
  • 总分机构异地移送
  • 物业公司收取的广告费开什么发票
  • 存货跌价准备的金额
  • 财务线上线下是什么意思
  • 合同尾款一般多少
  • windows7便签删除了怎么恢复
  • rasman.exe - rasman是什么进程 有什么作用
  • win10电源和睡眠设置不起作用
  • linux系统基础教程
  • phpdie
  • 公司赞助是什么意思
  • laravel dump
  • 资产负债表中其他应付款根据什么填列
  • 增值税减免附加税怎么处理
  • Laravel 5.3 学习笔记之 错误&日志
  • 融资租入固定资产的改建支出
  • 工会经费计税依据比例
  • 合伙企业需要申报哪些税
  • 开具利息收入发票需不需要有经营范围
  • 申请高新技术企业要具备哪些条件
  • 哪些人需要税务会计
  • 新销售收入的确认条件
  • 企业的纳税申报数据来源于
  • 公对公转账在手机上怎么操作
  • 增值税销项税额属于什么科目
  • 支付货款怎么做记账凭证
  • 采购商品未入库已经付款会计分录
  • 事业单位利息收入的正确分录
  • 退货只能退一半价钱合理吗
  • 票据行为的构成要件
  • 费用分摊科目
  • 进项大于销项月末怎么处理
  • 车辆保险费计入现金流量表哪里
  • 残保金在网上怎么申报
  • 企业预付账款是什么意思
  • 如何跨数据库查询
  • 数据库复制数据sql语句
  • mysql 创建root用户和普通用户及修改删除功能
  • qq windows
  • win8系统怎样
  • linux深入理解
  • 电脑bios怎么分区
  • 安装windows 8.1
  • win10更新后qq打不开
  • javascript基础编程
  • android recycleview 刷新
  • vue.js 开发工具
  • 深入理解两个大计重要论断心得体会
  • JavaScript中length属性的使用方法
  • 基于nodejs的框架
  • jquery过滤选择器按照过滤规则分类包括?
  • javascript例题
  • 有关的拼音
  • 税务局 章
  • 残疾人交房产契税有优惠吗
  • 福利企业免税有哪些项目
  • 山东省国家税务局威海培训中心
  • 深圳国税系统
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设