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

  • wps编辑数据链接不可用(wps编辑数据链接怎么用)

    wps编辑数据链接不可用(wps编辑数据链接怎么用)

  • 苹果下载不了app一直要密码(苹果下载不了app显示支付宝付款无效)

    苹果下载不了app一直要密码(苹果下载不了app显示支付宝付款无效)

  • 百度输入法打字键盘怎么设置(百度输入法打字自动生成表情包)

    百度输入法打字键盘怎么设置(百度输入法打字自动生成表情包)

  • 快手注销账号什么意思(快手注销账号什么状态)

    快手注销账号什么意思(快手注销账号什么状态)

  • 显示器开机后亮几秒灭(显示器开机后亮一会就灭了橙色的灯)

    显示器开机后亮几秒灭(显示器开机后亮一会就灭了橙色的灯)

  • qq账号申诉是什么意思(qq账号申诉是什么)

    qq账号申诉是什么意思(qq账号申诉是什么)

  • 华为笔记本fn键是什么意思(华为笔记本fn键开启和关闭)

    华为笔记本fn键是什么意思(华为笔记本fn键开启和关闭)

  • itunes是什么意思在手机里(iTunes是什么意思?)

    itunes是什么意思在手机里(iTunes是什么意思?)

  • 探探免费能玩吗(探探不免费)

    探探免费能玩吗(探探不免费)

  • 华为mate30如何返回(华为mate30如何返回上一步)

    华为mate30如何返回(华为mate30如何返回上一步)

  • 掌上电力是什么意思

    掌上电力是什么意思

  • 怎么恢复被删掉的抖音(怎么恢复被删掉的录音)

    怎么恢复被删掉的抖音(怎么恢复被删掉的录音)

  • bn47是小米什么型号(bn47是小米什么型号电池)

    bn47是小米什么型号(bn47是小米什么型号电池)

  • 探探真实头像认证会显示出来吗(探探真实头像认证是人工审核吗)

    探探真实头像认证会显示出来吗(探探真实头像认证是人工审核吗)

  • 小米手环3怎么绑定手机(小米手环3怎么使用教程)

    小米手环3怎么绑定手机(小米手环3怎么使用教程)

  • max电池容量(14pro和14promax电池容量)

    max电池容量(14pro和14promax电池容量)

  • 私密空间文件夹在哪(私密空间文件夹怎么打开)

    私密空间文件夹在哪(私密空间文件夹怎么打开)

  • 电脑上怎么压缩图片小于200k(电脑上怎么压缩照片的大小)

    电脑上怎么压缩图片小于200k(电脑上怎么压缩照片的大小)

  • 红米note上面出现耳机模式如何取消(红米手机上方有红点怎么回事)

    红米note上面出现耳机模式如何取消(红米手机上方有红点怎么回事)

  • 优酷怎么取消预约视频(优酷怎么取消订阅自动续费)

    优酷怎么取消预约视频(优酷怎么取消订阅自动续费)

  • 三星s8防水可靠么(三星s8防水测试数值)

    三星s8防水可靠么(三星s8防水测试数值)

  • 请问在王者荣耀中铠怎么出装?(请问王者荣耀是谁发明的)

    请问在王者荣耀中铠怎么出装?(请问王者荣耀是谁发明的)

  • 织梦DedeCMS转换WordPress方法(dede织梦怎么转成zblog)

    织梦DedeCMS转换WordPress方法(dede织梦怎么转成zblog)

  • 增值税的专用发票有几联
  • 小微企业月开票超15万季度未超45万
  • 未分配利润与净利润不相等
  • 加班餐费有发票怎么入账
  • 小企业会计准则没有以前年度损益调整科目
  • 净现值为零时的收益率
  • 无形资产摊销和累计摊销一样吗
  • 施工企业的成本会计对象
  • 应交增值税为什么是销项减进项
  • 公司收到现金货款需要存入银行吗
  • 接受投资者的无形资产
  • 结余资金财政收回如何做账
  • 预付设备款如何缴纳印花税
  • 金蝶软件怎么设置会计科目
  • 个人所得税可以抵扣哪些费用
  • 30万的装修工程利润一般是多少
  • 旅游业相关行业
  • 公对公转账备注信息填错了怎么办
  • 收到投资款不做资本可以做什么?
  • 出售长期股权投资的相关税费
  • 银行手续费和汇率的关系
  • 小规模企业记账软件哪个好
  • 出口发票上的汇率按哪个开?
  • 小额纳税人增值税专用发票税率1%
  • scanserver.exe - scanserver是什么进程 有什么用
  • 营改增后增值税税率
  • 公司向个人借款利息如何处理
  • cuda completed with errors
  • phpstudy安装配置
  • web渗透实战
  • 企业预缴增值税附加税率
  • thinkphp6调用模型的方法
  • php实现的浏览器有哪些
  • org.springframework.web.server
  • java多线程线程数控制在多少
  • php怎么设置图片的大小
  • 建筑业如何开票
  • 固定资产清理借方增加还是减少
  • 财政拨付资金什么意思
  • windows安装mq
  • 电费已付,没有收到发票
  • 销售货物未收到货款的会计分录怎么写
  • 微信支付算库存商品吗
  • mysql数据库环境
  • 财政收回用款额度
  • 收了对方预付款怎么打条
  • 进销存怎么看
  • 制造费用最终去哪里了啊
  • 增值税税款多缴纳还能退回吗
  • 固定资产竣工前予以资本化吗
  • 事业单位用电收费标准
  • 预包装食品加工及销售营业执照图片
  • 开业前的装修费怎么做账
  • 代扣代缴的增值税为什么可以抵扣
  • mysql5.6解压版安装教程
  • win8系统怎么关闭自动更新系统
  • 禁止Windows 打游戏怎么办
  • win8电脑触摸屏没反应怎么办
  • windowxp怎么设置密码
  • 一个mac多重
  • win7开机黑屏只有一个鼠标箭头
  • win7怎么使用打印机打印
  • 获取本机ip地址命令
  • js的正则表达式
  • Android开发中遇到的问题及解决方案
  • node 创建文件夹
  • unity怎么弄游戏小地图
  • 仿淘宝源码
  • js正则 \w
  • python的cumprod
  • Android本地文件怎么显示歌词
  • python二分查找非递归
  • HttpClient通过Post上传文件
  • 深入理解innodb
  • 如何办理股权转让信息登记表
  • 下岗的党员需要交党费吗
  • 建筑劳务分包业务范围
  • 东莞办理房产证在哪里预约
  • 中国税务网发票怎么开
  • 出口货物开票税率是多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设