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

  • qq上网环境存在异常怎么解除(qq上网环境存在异常怎么解除手机)

    qq上网环境存在异常怎么解除(qq上网环境存在异常怎么解除手机)

  • 小米手环6怎么开启音乐权限(小米手环6怎么恢复出厂设置)

    小米手环6怎么开启音乐权限(小米手环6怎么恢复出厂设置)

  • opporeno4pro有无线充电吗(reno4pro支持无线)

    opporeno4pro有无线充电吗(reno4pro支持无线)

  • 华为 nova 7 pro 5g有nfc功能吗(华为nova7pro5g上市价格)

    华为 nova 7 pro 5g有nfc功能吗(华为nova7pro5g上市价格)

  • iphone xs max屏幕发黄怎么办(iphonexsmax屏幕死机)

    iphone xs max屏幕发黄怎么办(iphonexsmax屏幕死机)

  • 白色硅胶手机壳脏了怎么清洗(白色硅胶手机壳发黄怎么清洗变白)

    白色硅胶手机壳脏了怎么清洗(白色硅胶手机壳发黄怎么清洗变白)

  • 快手流量券是什么意思(快手流量券是啥)

    快手流量券是什么意思(快手流量券是啥)

  • 如何解决蓝牙影响网速(如何解决蓝牙影响wifi)

    如何解决蓝牙影响网速(如何解决蓝牙影响wifi)

  • 没绑卡的微信能收钱吗(没绑卡的微信能收多少)

    没绑卡的微信能收钱吗(没绑卡的微信能收多少)

  • 为什么充电线用着用着松了(为什么充电线用着用着就不能用了)

    为什么充电线用着用着松了(为什么充电线用着用着就不能用了)

  • 显示温度的保温杯如何换电池

    显示温度的保温杯如何换电池

  • 一部手机能两个人实名认证吗(一部手机能两个人玩的生存游戏)

    一部手机能两个人实名认证吗(一部手机能两个人玩的生存游戏)

  • 200mm长焦能拍月亮吗(200mm长焦拍月亮参数)

    200mm长焦能拍月亮吗(200mm长焦拍月亮参数)

  • 台式电脑通过路由器无法上网 (台式电脑网络怎么连接线路)

    台式电脑通过路由器无法上网 (台式电脑网络怎么连接线路)

  • applepencil充电多久(applepencil充多久能充满)

    applepencil充电多久(applepencil充多久能充满)

  • 华为来电视频怎么弄的(华为来电视频怎么不显示)

    华为来电视频怎么弄的(华为来电视频怎么不显示)

  • ios怎么把两张照片合成一张(ios怎么把两张照片p成一张)

    ios怎么把两张照片合成一张(ios怎么把两张照片p成一张)

  • x27怎么设置自定义铃声(vivo x27怎么自定义锁屏)

    x27怎么设置自定义铃声(vivo x27怎么自定义锁屏)

  • iphone丢失模式有什么用(iphone丢失模式有用吗)

    iphone丢失模式有什么用(iphone丢失模式有用吗)

  • 微博移出好友圈对方知道吗(微博移出好友圈还是互相关注吗)

    微博移出好友圈对方知道吗(微博移出好友圈还是互相关注吗)

  • 手机关机怎么定位找人(手机关机怎么定时开机)

    手机关机怎么定位找人(手机关机怎么定时开机)

  • 怎样删除qq自动回复的内容(怎样删除qq自动登录的账号密码)

    怎样删除qq自动回复的内容(怎样删除qq自动登录的账号密码)

  • youkudisk是什么文件夹(com.youku.phone是什么文件夹)

    youkudisk是什么文件夹(com.youku.phone是什么文件夹)

  • 荣耀20解锁方式有几种(华为荣耀20屏幕锁怎么解)

    荣耀20解锁方式有几种(华为荣耀20屏幕锁怎么解)

  • 数学建模-回归分析(Stata)(数学建模回归模型例题)

    数学建模-回归分析(Stata)(数学建模回归模型例题)

  • python变量类型的使用(python中变量类型有几种)

    python变量类型的使用(python中变量类型有几种)

  • 汽车租赁企业
  • 纳税申报表保留几年
  • 税务不受地方管吗
  • 全年没有超过起征点需要汇算吗
  • 工程产值是怎么计算的
  • 房地产开发商需要缴纳什么税
  • 购进库存商品到销售全部分录
  • 月报和季度报的区别
  • 广告公司会议记录内容
  • 新企业所得税法规定的企业所得税基本税率
  • 应收票据的会计分录例题
  • 机器设备如何计提折旧
  • 股权投资和债权投资的风险
  • 生产企业的安全员好干吗
  • 什么费用计入什么科目
  • 临时存款账户包括保证金账户
  • 企业认购普通股100万股作为交易性金融资产管理
  • 地税退税政策
  • 补发工资是否需要交税
  • 劳务费个税申报税率
  • 跨地区经营建筑企业预缴增值税可以先开票后预缴吗
  • 7月3日事业单位
  • 建筑业预缴个人所得税税率
  • 营业外收入可以在借方吗
  • 家电折旧费法律依据
  • 企业支付宝税务局能查吗怎么查
  • 多交增值税如何做账
  • 给别人的返利是属于什么费用
  • 鸿蒙系统怎么设置导航键
  • 在建工程人工费计入什么科目
  • php 抓取别的网站的内容
  • 财务会计制度
  • 支付代账公司费用 怎么写凭证
  • php 什么是类
  • 新公司成立前期费用
  • iframe更改自身src
  • php session_start
  • 税务稽查补税
  • yolov5使用
  • chs命令
  • 城建税减半吗
  • 坏账损失的核算属于会计估计
  • 以前年度损益调整结转到本年利润吗
  • 季度是指
  • 代理返点怎么算
  • 母公司破产子公司债权人申报
  • pythongui库
  • 变更股东投资比例
  • ibm.data.db2
  • 什么叫生活补助
  • 所得税税率变化对已确认递延所得税资产的影响
  • 库存现金余额过大的风险
  • 小商户怎么打发票
  • 应交税费月底账务处理
  • abc类企业的划分
  • 会计分录什么时候用负数表示
  • 会计记账借贷记什么账户
  • mssql 优化
  • mysql null+1
  • windowssever 2003
  • win10右键菜单自定义
  • win2000系统禁止ping
  • ubuntu顶部菜单栏
  • linux如何学
  • Windows命令行复制粘贴命令
  • win7打开
  • linux 去除换行
  • 在Linux下HTTPie工具的使用教程
  • linux的命令行界面
  • messenger api
  • 在线linux模拟环境
  • unity3d apk
  • jquery图片效果
  • javascript用处
  • android Intent Flags详解
  • Javascript this 关键字 详解
  • 怎样学好js中的逻辑
  • jsp中img标签
  • 司法拍卖车免除扣分吗
  • 招投标文件未规定怎么办
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设