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

  • 怎样删除微信小程序里的应用(怎样删除微信小号)

    怎样删除微信小程序里的应用(怎样删除微信小号)

  • 苹果13有充电口吗(苹果13有充电口没)

    苹果13有充电口吗(苹果13有充电口没)

  • 小艺怎么才能连接wifi(如何给小艺连网)

    小艺怎么才能连接wifi(如何给小艺连网)

  • 动画启动方式有几种(动画启动方式怎么设置)

    动画启动方式有几种(动画启动方式怎么设置)

  • missing operating system怎么解决(missing operating system怎么办)

    missing operating system怎么解决(missing operating system怎么办)

  • 华为什么型号有红外线功能吗(华为什么型号有5g)

    华为什么型号有红外线功能吗(华为什么型号有5g)

  • 手机内存小加内存卡可以吗(手机内存太少怎么办?能加内存吗)

    手机内存小加内存卡可以吗(手机内存太少怎么办?能加内存吗)

  • 抖音点完赞马上取消对方会被提醒吗(抖音点完赞马上取消会有记录吗)

    抖音点完赞马上取消对方会被提醒吗(抖音点完赞马上取消会有记录吗)

  • 切换下一行的快捷键(快速切换到下一行的第一个单元格)

    切换下一行的快捷键(快速切换到下一行的第一个单元格)

  • 苹果手机有无线投屏吗(苹果手机有无线遥控功能吗)

    苹果手机有无线投屏吗(苹果手机有无线遥控功能吗)

  • 微信上办理的etc激活不了怎么办(微信办理的etc为什么没反应)

    微信上办理的etc激活不了怎么办(微信办理的etc为什么没反应)

  • 快手属于腾讯大王卡免流吗(快手属于腾讯大王卡40g用的范围)

    快手属于腾讯大王卡免流吗(快手属于腾讯大王卡40g用的范围)

  • 酷狗音乐下载的歌曲在哪个文件夹(酷狗音乐下载的歌曲怎么转换成mp3格式)

    酷狗音乐下载的歌曲在哪个文件夹(酷狗音乐下载的歌曲怎么转换成mp3格式)

  • 手机屏tp是啥意思

    手机屏tp是啥意思

  • opporeno3什么时候出的(opporeno3什么时候更新13)

    opporeno3什么时候出的(opporeno3什么时候更新13)

  • 怎样标记诈骗电话(如何标记为诈骗电话)

    怎样标记诈骗电话(如何标记为诈骗电话)

  • 文档怎么用文件方式发送(文档怎么文件的形式发给别人)

    文档怎么用文件方式发送(文档怎么文件的形式发给别人)

  • qq影音如何压缩视频(手机视频压缩软件哪个最好)

    qq影音如何压缩视频(手机视频压缩软件哪个最好)

  • 360小水滴怎么恢复出厂设置(360小水滴怎么恢复出厂设置视频)

    360小水滴怎么恢复出厂设置(360小水滴怎么恢复出厂设置视频)

  • 会计专业难学吗?(会计事务专业学什么)

    会计专业难学吗?(会计事务专业学什么)

  • qq自动回复能不能续火花(qq自动回复能不能只针对一个好友)

    qq自动回复能不能续火花(qq自动回复能不能只针对一个好友)

  • 天猫如何退货(淘宝购物后如何退货)

    天猫如何退货(淘宝购物后如何退货)

  • win10电源高性能怎么设置(win10电源高性能被删了)

    win10电源高性能怎么设置(win10电源高性能被删了)

  • 记录CentOS7自定义修改SSH端口 不用默认22端口(centos7配置自动获取ip)

    记录CentOS7自定义修改SSH端口 不用默认22端口(centos7配置自动获取ip)

  • php高级面试题的要点(php面试题目100及最佳答案)

    php高级面试题的要点(php面试题目100及最佳答案)

  • 包装物租金要交消费税吗为什么
  • 财务软件开票税率
  • 注册会计师税法真题
  • 预算收入包括增值税吗
  • 企业投资收益要交哪些税
  • 差旅费住宿专票能否抵扣
  • 什么时候用以前年度损益调整什么时候用年初未分配利润
  • 印花税的纳税人为书立合同双方
  • 上市公司存货跌价准备怎么看
  • 环保罚款计入什么会计科目
  • 三方协议怎么入账
  • 企业微信收款如何同步给别人
  • 个人负担社保
  • 外贸企业购买生产车辆
  • 未成立工会的企业、事业单位
  • 银行基本户年费
  • 计提的工资大于实际发放的
  • 单位价值5000元二手设备怎么算
  • php自动跳转页面
  • vue slot标签
  • 高薪技术企业研发费用标准
  • 没有产权的房屋离婚怎么分配
  • 公允价值变动损益会计处理
  • php的缓存文件是什么格式
  • 发票已开不符合收入确认条件账务处理怎么做?
  • 过桥资金账务处理
  • 委托境外研发费
  • 君子兰的养殖方法
  • 最小的外置dvd刻机多少寸
  • 损益类科目包括利润分配吗
  • 取得土地使用权的方式
  • php+mysql+jquery实现简易的检索自动补全提示功能
  • php 输出
  • 结转,结余
  • 发票开错需要让客户寄回来吗
  • php websocket教程
  • 小微企业认定标准 税务
  • 红字信息表必须要原件吗
  • 销售房产收取预算费用
  • 自由会计师
  • mysql触发器在哪
  • 认缴制和实缴制的区别公司破产
  • 公司自有房产出租给员工如何处理
  • 消防工程公司的成本包括哪些
  • 1元换购的商品是正品吗
  • 接待客人后的感受和过程
  • 当月暂估入账跨月怎么算
  • 筹建期发生的费用怎么申报
  • 房地产企业按简易计税
  • 购买劳务费会计分录
  • 收到一笔财政局的付款
  • 发票开错了只能冲红票吗?
  • 企业对私账户合法吗
  • 什么企业属于小型微利企业
  • 安装mysql失败原因
  • securedownload是什么意思
  • windows如何设置pin码
  • windows vista升级
  • win10系统预览版
  • ubuntu做lvm
  • kdeskcore.exe是什么
  • win7共享文件设置
  • webpack 构建流程
  • JavaScript cookie 跨域访问之广告推广
  • 深入理解中国式现代化
  • unity读取文本文件
  • 百度坐标转换成WGS84坐标
  • jquery插件开发方法
  • 用js设置颜色
  • javascript例题
  • unity星球模型
  • jquery日期选择器
  • webview设置ua
  • android图片裁剪
  • 江西国税发票查询官网
  • 辽宁省社保系统操作
  • 洛阳契税首套房认定标准
  • 如何强化理论武装
  • 契税计税依据含装修费吗
  • 税务筹划和纳税申报哪个更容易学
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设