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

  • 三星s20 ultra背面材质是什么(三星s20+背面)

    三星s20 ultra背面材质是什么(三星s20+背面)

  • met30华为发布时间

    met30华为发布时间

  • 迅雷磁盘过于繁忙怎么解决(用迅雷下载磁盘过于繁忙)

    迅雷磁盘过于繁忙怎么解决(用迅雷下载磁盘过于繁忙)

  • 苹果电脑mac突然巨卡(苹果电脑mac突然没有声音)

    苹果电脑mac突然巨卡(苹果电脑mac突然没有声音)

  • 网易云音乐自动停止播放是怎么回事(网易云音乐自动扣费怎么关闭啊)

    网易云音乐自动停止播放是怎么回事(网易云音乐自动扣费怎么关闭啊)

  • 转发别人的抖音视频别人能看到吗(转发别人的抖音视频怎么变小了)

    转发别人的抖音视频别人能看到吗(转发别人的抖音视频怎么变小了)

  • 抖音明明有赞却不显示怎么设置(抖音明明有赞却不显示别人也看不到)

    抖音明明有赞却不显示怎么设置(抖音明明有赞却不显示别人也看不到)

  • 可以用手机号码查身份证号码吗(可以用手机号码查到机主信息吗)

    可以用手机号码查身份证号码吗(可以用手机号码查到机主信息吗)

  • 腾讯下面有几个直播平台(腾讯下面有几个公司)

    腾讯下面有几个直播平台(腾讯下面有几个公司)

  • 账号申诉是什么意思(账号申诉怎么容易成功)

    账号申诉是什么意思(账号申诉怎么容易成功)

  • 200m宽带下载速度多少mbps(200m宽带下载速度应该是多少)

    200m宽带下载速度多少mbps(200m宽带下载速度应该是多少)

  • 华为m6支持内存扩展吗(华为m6支持多大内存卡)

    华为m6支持内存扩展吗(华为m6支持多大内存卡)

  • 文字间隔怎么设置(怎样设置文字间隔)

    文字间隔怎么设置(怎样设置文字间隔)

  • PS怎么画阴影(ps怎么画阴影区域)

    PS怎么画阴影(ps怎么画阴影区域)

  • 陌陌头像右下角绿点(陌陌头像右下角绿圆圈是什么意思)

    陌陌头像右下角绿点(陌陌头像右下角绿圆圈是什么意思)

  • 拼多多换货有运费补吗(拼多多换货有运费险还要钱吗)

    拼多多换货有运费补吗(拼多多换货有运费险还要钱吗)

  • 抖音上发的视频咋删(抖音上发的视频删除了怎么找回)

    抖音上发的视频咋删(抖音上发的视频删除了怎么找回)

  • 数据与数据元素的关系和区别(数据与数据元素的关系与区别)

    数据与数据元素的关系和区别(数据与数据元素的关系与区别)

  • 抖音如何卖自己商品(抖音如何卖自己的货和挂车)

    抖音如何卖自己商品(抖音如何卖自己的货和挂车)

  • 盒马鲜生如何付款(盒马鲜生鲜超市怎么付款)

    盒马鲜生如何付款(盒马鲜生鲜超市怎么付款)

  • 电脑源坏了有什么症状(电脑电源坏的几种现象)

    电脑源坏了有什么症状(电脑电源坏的几种现象)

  • C盘中的文件编辑后无法保存(c盘文件详解)

    C盘中的文件编辑后无法保存(c盘文件详解)

  • 使用Three.js实现web端显示点云(three.js入门指南)

    使用Three.js实现web端显示点云(three.js入门指南)

  • 旅客运输服务解释
  • 固定资产的进项税额可以抵扣吗
  • 防伪税控技术维护费怎么申报
  • 两个公司发工资怎么交个税
  • 营业执照办理税务登记需要什么资料
  • 企业所得税完税凭证在哪里打印
  • 企业应交所得税怎么算
  • 免抵退附加
  • 收到外商投入资金
  • 补偿金申报个所税如何录入?
  • 流动比率与速动比率之差等于现金比率
  • 存货暂估入账会引起存货账面价值发生增减变动吗
  • 去年12月份到现在有多少天了
  • etc发票一直不出来
  • 小规模纳税人金额
  • 高新技术企业认定条件
  • 合营安排与共同安排区别
  • 跨地区经营建筑企业预缴企业所得税
  • 应付质保金到期怎么办
  • 打车进项可以抵扣吗
  • 购进虚假发票进项税转出的会计处理?
  • ps不支持win7吗
  • win10闹钟设置方法
  • 贸易公司销售
  • 重置ie浏览器会有什么影响
  • win11 zen2
  • 微软推出windows11系
  • 公司股票 收税
  • 微信php开发教程
  • php的图片
  • 工商年报的社保缴费基数怎么算
  • 子公司注销母子关系流程
  • sap abap入门
  • PyTorch深度学习实战 | 基于ResNet的人脸关键点检测
  • phpstudy命令行
  • 单文件php文件列表
  • 购买固定资产的运费计入什么科目
  • 结转结余的概念
  • 利润表中所得税费用为负数是什么意思
  • 超过认证期限的发票未抵扣能红冲吗
  • dedecms使用教程
  • mysql查询表里数据
  • 免征增值税的货物
  • 销售费用福利费和管理费用福利费
  • sql怎么用sql语句创建表
  • 原材料专票入库怎么入账
  • 印花税的征收方式有哪些
  • 企业所得税的步骤
  • 高新技术企业补助需要交所得税吗
  • 零余额账户用款额度年末转入哪个科目
  • 土地承包经营权上的房屋
  • 会计分录结转进项怎么算
  • 委托加工以受托方核定的数量为计税依据
  • 出口视同内销账务处理?
  • 什么时候用以前年度损益调整科目什么时候用所得税科目
  • 预付账款暂估是什么意思
  • 园林土方施工有哪些分项工程
  • 苹果手机价格
  • 苹果mac电脑打不开
  • centos下载与安装
  • fedora s9
  • 电脑怎样进入安全模式
  • debian openssh
  • win8系统怎么重新安装系统
  • dell笔记本系统安装步骤
  • win7系统打开文件会闪退
  • 笔记本w8系统怎么取消开机密码
  • centos7安全
  • win81with update
  • win8应用商店无法使用
  • node.js可以跨平台吗
  • node js打包exe
  • android 左右滑动 库
  • android内存优化三 简书
  • python写一个复制文件的程序
  • jquery设置隐藏属性
  • 砂石需要缴纳资源税吗
  • 广东地税电话客服电话
  • acfunp
  • 广州市电子税务局怎样跨区申报税务
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设