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

  • 电脑没声音一键恢复(电脑没声音)(电脑没声音一键恢复)

    电脑没声音一键恢复(电脑没声音)(电脑没声音一键恢复)

  • 快手怎么弄情侣空间(快手怎么弄情侣头像)

    快手怎么弄情侣空间(快手怎么弄情侣头像)

  • 微信群发红包怎么发给指定人(微信群发红包怎么设置别人看不到金额)

    微信群发红包怎么发给指定人(微信群发红包怎么设置别人看不到金额)

  • airpods是什么耳机(耳机airpods是什么)

    airpods是什么耳机(耳机airpods是什么)

  • 电话卡可以换身份证吗(电话卡可以换身份证实名吗)

    电话卡可以换身份证吗(电话卡可以换身份证实名吗)

  • 微信怎么往群里发个人名片(微信怎么往群里转账)

    微信怎么往群里发个人名片(微信怎么往群里转账)

  • 腾讯会议被移出还能进吗(腾讯会议被移出会议如何恢复)

    腾讯会议被移出还能进吗(腾讯会议被移出会议如何恢复)

  • 局域网的软件部分主要包括(局域网的软件部分主要包括哪些)

    局域网的软件部分主要包括(局域网的软件部分主要包括哪些)

  • 华为荣耀9x红包提醒怎么设置(honor 9x红包来了)

    华为荣耀9x红包提醒怎么设置(honor 9x红包来了)

  • 抖音如何增加粉丝到1000(抖音如何增加粉丝)

    抖音如何增加粉丝到1000(抖音如何增加粉丝)

  • 抖音没人点赞怎么回事(抖音没人点赞怎么办和编辑资料有关系吗)

    抖音没人点赞怎么回事(抖音没人点赞怎么办和编辑资料有关系吗)

  • ps怎么做水(ps怎么做水面倒影效果)

    ps怎么做水(ps怎么做水面倒影效果)

  • 手机能连上网电视连不上怎么回事(手机能连上网电脑连不上怎么回事)

    手机能连上网电视连不上怎么回事(手机能连上网电脑连不上怎么回事)

  • word怎么让页码连续(word怎么让页码从指定页开始)

    word怎么让页码连续(word怎么让页码从指定页开始)

  • 手机相机卸载了怎么办(手机相机卸载了相片不见了怎么找回)

    手机相机卸载了怎么办(手机相机卸载了相片不见了怎么找回)

  • 手机支付宝怎么查询银行卡余额(手机支付宝怎么注销账号)

    手机支付宝怎么查询银行卡余额(手机支付宝怎么注销账号)

  • 华为nova5怎么用耳机(华为nova5怎么用耳机听歌)

    华为nova5怎么用耳机(华为nova5怎么用耳机听歌)

  • iphonexr几核(xr是几核的)

    iphonexr几核(xr是几核的)

  • 华为荣耀9x人脸识别怎么设置(华为荣耀9x人脸识别在哪里设置)

    华为荣耀9x人脸识别怎么设置(华为荣耀9x人脸识别在哪里设置)

  • billitunescom扣费手机怎么关闭(bill莫名扣钱)

    billitunescom扣费手机怎么关闭(bill莫名扣钱)

  • 订阅号助手安全吗(订阅号助手会导致微信封号吗)

    订阅号助手安全吗(订阅号助手会导致微信封号吗)

  • ipad下载东西一直转圈(ipad下载软件为什么一直转圈)

    ipad下载东西一直转圈(ipad下载软件为什么一直转圈)

  • bfc是什么(bfc是什么窗)

    bfc是什么(bfc是什么窗)

  • bcb.exe是什么进程 bcb进程是安全的吗(bc2.exe)

    bcb.exe是什么进程 bcb进程是安全的吗(bc2.exe)

  • 【vue】vue 在线编辑、实时预览的代码交互组件 vue-code-view(vue+)

    【vue】vue 在线编辑、实时预览的代码交互组件 vue-code-view(vue+)

  • php curl返回错误码60的解决办法(php curl_setopt)

    php curl返回错误码60的解决办法(php curl_setopt)

  • 企业建厂房购进材料可以抵扣吗
  • 差旅费津贴怎么报税
  • 成品油发票怎么查询
  • 分红款怎么记账
  • 资产负债表的期初余额是年初余额吗
  • 文化事业费是什么意思
  • 查账征收企业所得税年报怎么填
  • 财务人员培训费怎么入账
  • 固定资产清理费用为什么有进项税额
  • 冲红重开发票增值税怎么处理
  • 发票开工程服务和工程款的区别
  • 承兑汇票给别人时对方需要出具什么
  • 外资企业研发中心
  • 跨境电商有进口吗
  • 出售投资性房地产的会计处理
  • 企业收到赞助费
  • 汇算清缴亏损在后期弥补时怎么做会计处理?
  • 税收用在哪些方面
  • 非营利性代收代付费用会计处理怎么做?
  • 销售利润率如何提高
  • 购进固定资产汽车该如何进行会计处理?
  • 汇算清缴时费用占收入多少
  • 物流辅助服务需要办许可证吗
  • 直接成本和间接成本差异
  • 小规模纳税人定额发票怎么报税
  • 产值和营业收入哪个数值大
  • 增值税逾期申报流程
  • 电子承兑如何转出换成现金
  • 电脑黑屏怎么办主机还是亮的
  • 电脑进入bios关机
  • 电脑无损音乐播放软件哪个最好
  • 结转进项税销项税额的分录怎么写
  • win11如何退回win10超过10天
  • mac上读取ntfs
  • 外汇返佣金
  • el-table懒加载合并行
  • 工资零申报3个月后不能申报了吗
  • php yii
  • 注册资本增加了怎么做账
  • 购买垃圾桶计入什么科目
  • 连通函数
  • python生成器的应用场景
  • mysql中的外键的定义
  • 以前年度的企业所得税怎么入账
  • 增值税加计扣除计入什么科目
  • 跨年租金收入如何入账
  • 财务报表里的现金流量表括号是什么意思
  • 公积金由个人全部交,单位违法吗法吗
  • 建筑业周转材料
  • 开票方未缴税,为何要追回付款方的退税款
  • 公司代缴的社保能不能取出来
  • 营改增后增值税税率的调整
  • 代扣个税返还需要交增值税吗
  • 固定资产在以后会计期间可以转回吗
  • 会计中的材料采购是什么意思
  • 租房公司报销发票怎么开
  • 银行存款日记账与银行对账单之间的核对属于
  • 财务人员的职工福利费应计入?
  • 计提折旧对公司有什么好处
  • mysql 性能调优参数
  • mysql column is ambiguous
  • 被遗忘的战役
  • 如何用win7
  • 如何解决windows10数据放到国外进行处理
  • ctfmon.exe成功怎么解决
  • Win7自带的扫雷怎么都打不开
  • linux限速
  • linux源码包
  • 景深图片的3d显示器
  • glsl编译
  • js创建元素
  • 了不起的狐狸爸爸
  • jquery动效
  • js设计模式有哪些
  • jquery实现倒计时效果
  • 怎样查询灵活就业养老保险缴费记录
  • 手机陌陌卸载还有记录吗
  • 福建地方税务局历任 李
  • 淄博市地方税务局
  • 关于啤酒包装物押金,下列正确的是( )
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设