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

  • 蓝牙耳机被别人连了如何断开(蓝牙耳机被别人连了怎么断开)

    蓝牙耳机被别人连了如何断开(蓝牙耳机被别人连了怎么断开)

  • 微信登录失败4-34是什么意思(微信登录失败4-34要怎么解决)

    微信登录失败4-34是什么意思(微信登录失败4-34要怎么解决)

  • 抖音刷点赞会被限流吗

    抖音刷点赞会被限流吗

  • word选择多个对象(word选择多个对象怎么使用)

    word选择多个对象(word选择多个对象怎么使用)

  • 华为p40第一次充电充多久(华为p40第一次充电需要多长时间最好)

    华为p40第一次充电充多久(华为p40第一次充电需要多长时间最好)

  • 华为能下载两个微信吗(华为能下载两个支付宝吗)

    华为能下载两个微信吗(华为能下载两个支付宝吗)

  • 12123为什么登不上(12123为什么登不上去了,老是显示指纹验证)

    12123为什么登不上(12123为什么登不上去了,老是显示指纹验证)

  • 小米手机动不动就间断性黑屏(小米手机动不动就重启是怎么回事)

    小米手机动不动就间断性黑屏(小米手机动不动就重启是怎么回事)

  • 荣耀v10怎么清除后台运行(荣耀v10怎么清除缓存)

    荣耀v10怎么清除后台运行(荣耀v10怎么清除缓存)

  • 华为品牌日是哪一天(华为产品品牌)

    华为品牌日是哪一天(华为产品品牌)

  • 固态硬盘插上电脑不显示不出来怎么办(固态硬盘插上电脑开不了机)

    固态硬盘插上电脑不显示不出来怎么办(固态硬盘插上电脑开不了机)

  • 苹果8可以双卡双待吗(苹果8可以双卡不)

    苹果8可以双卡双待吗(苹果8可以双卡不)

  • 数据库管理系统可以创建维护数据库吗(数据库管理系统属于什么软件)

    数据库管理系统可以创建维护数据库吗(数据库管理系统属于什么软件)

  • c语言中array是什么意思(c语言中的array是什么意思)

    c语言中array是什么意思(c语言中的array是什么意思)

  • 淘宝积分在哪里兑换(淘宝积分在哪里领取)

    淘宝积分在哪里兑换(淘宝积分在哪里领取)

  • 腾讯视频怎么下载(腾讯视频怎么下载不了)

    腾讯视频怎么下载(腾讯视频怎么下载不了)

  • 手机照片怎么备份(手机照片怎么备份到u盘)

    手机照片怎么备份(手机照片怎么备份到u盘)

  • 怎么关掉windows安全中心(怎么关掉windows许可证即将过期的提示)

    怎么关掉windows安全中心(怎么关掉windows许可证即将过期的提示)

  • 微信后台自启怎么设置(微信自启动关闭)

    微信后台自启怎么设置(微信自启动关闭)

  • 美团商家取消到店自取(美团上订餐后商家取消)

    美团商家取消到店自取(美团上订餐后商家取消)

  • 货拉拉司机要交押金吗(货拉拉司机要交保证金吗)

    货拉拉司机要交押金吗(货拉拉司机要交保证金吗)

  • 犀牛工具栏怎么恢复(犀牛工具栏怎么调大)

    犀牛工具栏怎么恢复(犀牛工具栏怎么调大)

  • vivox27语音唤醒在哪里(vivox27语音唤醒功能怎么打开)

    vivox27语音唤醒在哪里(vivox27语音唤醒功能怎么打开)

  • 华为p20如何分屏(华为p20如何分屏一半一半)

    华为p20如何分屏(华为p20如何分屏一半一半)

  • 怎么获得Win1021h1激活码 最新21h1系统密钥推荐(怎么获得win10纯净版)

    怎么获得Win1021h1激活码 最新21h1系统密钥推荐(怎么获得win10纯净版)

  • Ghyakar村,尼泊尔上木斯塘 (© Frank Bienewald/Alamy)(尼泊尔乡村)

    Ghyakar村,尼泊尔上木斯塘 (© Frank Bienewald/Alamy)(尼泊尔乡村)

  • 进项税额转出要补所得税吗
  • 车船税是否每年都交
  • 企业纳税申报表包括哪些表
  • 个体户怎么开增值税普通发票过程
  • 以前年度损益调整结转到哪里
  • 预收账款有余额是啥原因
  • 土地补偿款收入要交什么税
  • 工程施工购买的标示牌怎么开票给甲方
  • 工程预付款未按时支付
  • 普通发票电子发票没有章
  • 如何向税务局申请开发票
  • 住宿费增值税怎么算
  • 坏账损失如何连续计提
  • 支付外汇代扣代缴增值税
  • 其他有形动产租赁服务
  • linux 将一个文件的内容给另一个文件
  • Mac系统中使用QuickTime Player实现屏幕录像图文教程
  • w7防火怎么开
  • 中秋购物
  • linux怎样安装
  • 可供出售金融资产现在叫什么
  • PHP:pcntl_wifexited()的用法_PCNTL函数
  • 下列可以作为企业使命
  • 已入账的普通发票红冲后怎么做账
  • 应交税金 应交税费
  • 不动产抵债的销售额
  • mac快捷切换
  • vue router-view路由详解
  • vue.js过滤器
  • 税控开票清单
  • 主营业务收入需要结转吗
  • 应付账款的平行登记
  • java sc
  • 进项税计税依据
  • 股东每年怎么分红
  • 医疗服务增值税税率
  • 销售自己使用过的物品免税吗
  • 固定资产清理是什么账户
  • 应税销售额什么意思
  • 计提折旧会计分录怎么做
  • 用现金支付的款项
  • 应付账款会计分录怎么写
  • 空调购买攻略
  • 自建不动产领用原材料增值税进项
  • 成品油生产库存
  • 企业票据贴现属于什么业务
  • 收到货物抵账的会计分录
  • 运输服务和运输费有什么区别
  • 公司注销项目怎么办
  • 结转资金和结余资金的含义
  • 应收账款转回坏账怎么办
  • 公司不报税会怎样法人有责任么
  • 小企业应该如何发展
  • 苹果手机价格
  • 运行linux
  • dmidecode命令
  • 一岁的宝宝可以喝枸杞水吗
  • linux 操作系统
  • 怎么清空windows8电脑里全部东西
  • Win10 64位系统下QQ语音和QQ视频音量很小的两种解决方法
  • win8.1删除所有内容并重新安装
  • [置顶]电影名字《收件人不详》
  • android launchers
  • 【ExpandableListView】ExpandableListView互斥展开效果
  • 安卓下的分件分享怎么弄
  • 发现可疑文件autorun.inf
  • js if语句怎么写
  • 在javascript中如何定义并调用函数
  • angularjs2
  • jquery渐变效果
  • jquery的优点和缺点
  • js创建一个对象,里面有属性和方法
  • 江苏省生育登记服务网
  • 发票查验结果怎么保存
  • 财务报表盖章位置
  • 2023居民医保怎么交
  • 海南国税局待遇
  • 临沭公交车多久一班
  • 朝阳银行作息时间
  • 房没交契税和物业维修金房屋预告登记证明可以打印吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设