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

  • 小米平板5尺寸(小米平板5尺寸是多少厘米)

    小米平板5尺寸(小米平板5尺寸是多少厘米)

  • realme gt neo2怎么关闭HD图标(realmegtneo2怎么刷机)

    realme gt neo2怎么关闭HD图标(realmegtneo2怎么刷机)

  • 苹果如何设置自动开机(苹果如何设置自动关机)

    苹果如何设置自动开机(苹果如何设置自动关机)

  • ios12电量百分比不见了怎么办(电量百分比苹果12)

    ios12电量百分比不见了怎么办(电量百分比苹果12)

  • 戴口罩怎么设置面容(口罩怎么戴才是正确的)

    戴口罩怎么设置面容(口罩怎么戴才是正确的)

  • 打印机无法打印横向(打印机无法打印pdf文件)

    打印机无法打印横向(打印机无法打印pdf文件)

  • 无线有个感叹号是怎么回事(无线有个感叹号怎么解决)

    无线有个感叹号是怎么回事(无线有个感叹号怎么解决)

  • 微信不能发文件夹吗(扫描文件怎么发送到微信)

    微信不能发文件夹吗(扫描文件怎么发送到微信)

  • 华为p40处理器是多少(华为p40处理器是几纳米)

    华为p40处理器是多少(华为p40处理器是几纳米)

  • 为什么流量卡显示2g(为什么流量卡显示一个叉)

    为什么流量卡显示2g(为什么流量卡显示一个叉)

  • 耳机anc什么意思(耳机ac是什么意思)

    耳机anc什么意思(耳机ac是什么意思)

  • cad视图缩放快捷键(cad视图缩放快捷键是哪个)

    cad视图缩放快捷键(cad视图缩放快捷键是哪个)

  • 为什么充电器越来越松(为什么充电器越冲电量越低)

    为什么充电器越来越松(为什么充电器越冲电量越低)

  • 手机qq上svip能隐藏吗(手机qqsvip可以隐藏吗)

    手机qq上svip能隐藏吗(手机qqsvip可以隐藏吗)

  • 探探超级曝光是干嘛的(探探超级曝光好贵)

    探探超级曝光是干嘛的(探探超级曝光好贵)

  • 数字信号和离散信号的区别和联系(数字信号和离散时间信号)

    数字信号和离散信号的区别和联系(数字信号和离散时间信号)

  • 苹果性能小钢炮是什么手机(苹果性能小钢炮6sp)

    苹果性能小钢炮是什么手机(苹果性能小钢炮6sp)

  • iphone低电量模式有什么用(iphone低电量模式充电好不好)

    iphone低电量模式有什么用(iphone低电量模式充电好不好)

  • 怎么取消超级会员自动续费(怎么取消超级会员)

    怎么取消超级会员自动续费(怎么取消超级会员)

  • 手机怎么打出根号(手机怎么打出根号三次方)

    手机怎么打出根号(手机怎么打出根号三次方)

  • 天赋异禀2人人视频看不了(天赋异禀hd)

    天赋异禀2人人视频看不了(天赋异禀hd)

  • 苹果卡通头像怎么拍的(苹果卡通头像怎么设置不了)

    苹果卡通头像怎么拍的(苹果卡通头像怎么设置不了)

  • Linux或者Mac下adb连接失败如何解决(adb命令linux命令的区别)

    Linux或者Mac下adb连接失败如何解决(adb命令linux命令的区别)

  • ChatGPT 中文调教指南。各种场景使用指南。学习怎么让它听你的话

    ChatGPT 中文调教指南。各种场景使用指南。学习怎么让它听你的话

  • 外部奖励与内部奖励
  • 每月进项税额怎么算
  • 税率变化递延所得税资产如何调整
  • 计提工资是包含社保吗
  • 年初建账考虑要点有哪些
  • 个体工商户旅馆怎么交税
  • 代发工资记什么科目
  • 五险一金计提缴纳分录
  • 网上申报增值税怎么操作
  • 库存材料盘亏会计分录
  • 高新技术企业技术转让所得
  • 房产税每次申报都要维护吗
  • 公司发生的业务可以转让给子公司嘛?
  • 广告公司需要交消费税吗
  • 工程结算审计费用谁承担
  • 资产评估溢价部分如何处理?
  • 不得免征和抵扣的税额
  • 资产处置收益属于利润表项目吗
  • 上市公司发行债券股价会涨吗
  • 不动产租赁如何缴纳增值税
  • linux系统的
  • 购货方销售退回怎么做账
  • 预收预付不一致什么意思
  • 时序模型算法
  • php采集系统
  • 补充养老保险和养老保险的区别
  • 顺流交易逆流交易区别
  • 怎么配置tomcat服务器
  • php点击复制代码
  • css经典面试题
  • react框架和vue哪个用的人多
  • 融资租赁的残值归出租人所有,为啥要减去租金限值
  • 企业多久报一次工伤保险
  • 印花税和工会经费用不用计提
  • 利息支出会计科目
  • 进项大于销项附加税怎么处理
  • 公司租用员工的车辆交什么税
  • access使用查询向导固定常数
  • 公司有收入可以做零申报吗
  • 计提坏账准备方法变更属于会计估计变更吗
  • 承兑汇票大回头是啥意思
  • 税控盘上月未清卡去税务带什么
  • 公司裁员怎么补偿
  • 不符合资本化的长期借款利息计入什么科目
  • 少数股东权益如何保障
  • 固定资产清理不及时
  • 库存商品坏账准备怎么算
  • 所有者权益包括少数股东权益吗
  • 公司出资给另一个公司
  • 企业支付宝要手续费吗
  • 金税盘离线是什么意思
  • 发票的抵扣期限是多少天
  • 购买税控系统分录
  • 五证合一的办理流程是什么
  • mysql怎么修改my.ini
  • linux处理文件命令
  • 重装windows764 位后后如何将apache mysql加入系统服务
  • freebsd安装pkg
  • windows不认u盘
  • linux nmap扫描端口
  • 介绍两个很常用的成语
  • win10升级20h
  • macos 网速慢
  • window10耳机有电流
  • 隐藏控制台窗口
  • 如何让win8系统变快
  • 解决VMware下64位linux系统不支持全虚拟化的办法
  • window10如何校色
  • jquery选择指定标签
  • linux脚本自启
  • android studio乱码怎么解决
  • python urllib urlopen
  • Unity3d IOS 64 IL2CPP迁移之 AStarPath JosnFX 错误
  • bootstrap要学到什么程度
  • 宁波镇海哪里可以赶海
  • 国家税务总局石棉县税务局
  • 换电员工作时间自由吗
  • 为什么我电脑登微信显示二维码失效
  • 十大经济
  • 常态化与长效化的区别
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设