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

  • 一加9rt是什么指纹解锁

    一加9rt是什么指纹解锁

  • 希沃导出ppt只能是图片形式吗(希沃课件无法导出)

    希沃导出ppt只能是图片形式吗(希沃课件无法导出)

  • 微信声音锁在哪(微信声音锁在哪里关闭)

    微信声音锁在哪(微信声音锁在哪里关闭)

  • 淘宝怎么进入第三方操作(淘宝怎么进入自己的首页)

    淘宝怎么进入第三方操作(淘宝怎么进入自己的首页)

  • mate30手电筒快捷键是什么(mate30手电筒快捷关闭)

    mate30手电筒快捷键是什么(mate30手电筒快捷关闭)

  • 如何知道朋友圈是不是仅对自己可见(如何知道朋友圈好友将自己删除了)

    如何知道朋友圈是不是仅对自己可见(如何知道朋友圈好友将自己删除了)

  • 机顶盒无信号怎么办(机顶盒无信号怎么解决)

    机顶盒无信号怎么办(机顶盒无信号怎么解决)

  • iphone基带是什么(iphone的基带)

    iphone基带是什么(iphone的基带)

  • nova7pro有红外线吗(nova7带红外线)

    nova7pro有红外线吗(nova7带红外线)

  • 海信电视怎么下载钉钉(海信电视怎么下载百度网盘)

    海信电视怎么下载钉钉(海信电视怎么下载百度网盘)

  • 微信运动一般延迟多久(微信运动延迟多久更新)

    微信运动一般延迟多久(微信运动延迟多久更新)

  • 在计算机中汉字采用什么存放(在计算机中汉字国所占的字节数是)

    在计算机中汉字采用什么存放(在计算机中汉字国所占的字节数是)

  • 照片icloud同步中什么意思(图片icloud同步中)

    照片icloud同步中什么意思(图片icloud同步中)

  • 蜂鸟众包收入第二天几点到账(蜂鸟众包2021单价)

    蜂鸟众包收入第二天几点到账(蜂鸟众包2021单价)

  • vivo软件更新在哪设置(vivo手机软件更新)

    vivo软件更新在哪设置(vivo手机软件更新)

  • 手机卡对卡怎么转账(手机卡卡怎么激活)

    手机卡对卡怎么转账(手机卡卡怎么激活)

  • 抖音里面的音浪怎么算(抖音里面的音浪是什么意思)

    抖音里面的音浪怎么算(抖音里面的音浪是什么意思)

  • 华为mate30带膜吗(华为mate30带贴膜吗)

    华为mate30带膜吗(华为mate30带贴膜吗)

  • iphonex如何拍摄夜景(苹果x怎么拍)

    iphonex如何拍摄夜景(苹果x怎么拍)

  • 电脑pin怎么设置(电脑PIN怎么设置?)

    电脑pin怎么设置(电脑PIN怎么设置?)

  • 12306显示操作失败503是什么意思(12306显示操作失败)

    12306显示操作失败503是什么意思(12306显示操作失败)

  • excel显示#####怎么弄(Excel显示怎么变小)

    excel显示#####怎么弄(Excel显示怎么变小)

  • 快手怎么申请加入团队(快手怎么申请加入公会)

    快手怎么申请加入团队(快手怎么申请加入公会)

  • 抖音评论别人怎么看不见(抖音评论别人怎么删除掉)

    抖音评论别人怎么看不见(抖音评论别人怎么删除掉)

  • 怎样下载新闻里的视频(首页新闻怎么下载)

    怎样下载新闻里的视频(首页新闻怎么下载)

  • 苹果手机短信加密怎么弄(苹果手机短信加密在哪里设置方法)

    苹果手机短信加密怎么弄(苹果手机短信加密在哪里设置方法)

  • 企业发生的职工培训费应计入产品的制造成本
  • 代开运输发票是否预征企业所得税?
  • 不按出资比例取得分红怎么纳税?
  • 职工福利费计提比例一般是多少
  • 企业安全生产费用提取标准 最新
  • 收到增值税专用发票怎么处理
  • 基建账的年终结转
  • 转销无形资产的处置流程
  • 物业管理提供的服务变化
  • 耕地占用税和契税什么时候交
  • 关于建筑工程发包与承包下列说法正确的是
  • 劳务派遣企业如何认定
  • 当期损益包括哪些费用
  • 出纳可以做记账表格吗
  • 计提法定盈余公积转入利润分配
  • 投资性房地产属于流动资产吗
  • 银行存款日记账和现金日记账的区别
  • 公司向个人转账分录
  • 合营企业之间为什么不构成关联方
  • 纳税人可以是自然人吗
  • 在win7中,当前窗口的数量是多少个
  • 购入电脑一次性扣除
  • linux 部署
  • linux root没有权限
  • linux从入门到什么搞笑
  • 收到退回多付款现金流量支付购买商品支付
  • 招待费如何列支
  • win7怎么看服务
  • 气泡星云图片
  • php swoole websocket
  • windows安装配置
  • 工程项目合同签订
  • phpinfophp漏洞利用
  • Treetop walkway in Hainich National Park, Thuringia, Germany (© mauritius images GmbH/Alamy)
  • 购买货物收到发票财务报表怎么提现
  • 可用保证金余额为负
  • php array合并
  • 新企业所得税季初资产总额怎么填
  • ps怎么把皮肤变红润
  • 开了红字发票申请还要做进项税转出吗
  • 停车场广告收入需要每年缴纳增值税吗?
  • 速动资产扣除应纳税所得
  • 帝国cms功能
  • centos 安装dpkg
  • 费用发票可以抵税吗
  • 个人包含什么
  • 装修工程是可以做什么的
  • sql 附加数据库
  • 税法的个人所得税
  • 非正常损失的货物
  • 营改增后计算土地增值税收入公式
  • 有限合伙企业协议
  • 关联方往来款如何处理
  • 借调人员费用列支
  • 进项税加计扣除10%怎么算
  • 工会筹备金记什么科目
  • 固定资产报废属于非流动资产处置损失吗
  • 企业组织结构的本质是
  • 支票为什么不能取钱
  • mysql5.5解压版安装教程
  • win10 64位开机卡在登录界面的解决办法
  • centos7配置vncserver
  • Win8.164位/32位KB3096053补丁下载 主要修复KB3069114安装问题
  • 如何在win7系统中查看电脑基本信息
  • web ui控件
  • js判断元素是否显示
  • Node.js中的事件循环是什么样的
  • 物理引擎演示
  • js判断上传图片宽高大小
  • python函数入门
  • 微博html代码
  • web前端入门教程
  • 云南省税务申报流程
  • 东营为什么没有疫情
  • 司法拍卖车免除扣分吗
  • 应交增值税减免税款借贷方向
  • 什么叫税务协查
  • 自然人电子税务局web端怎么进入
  • 交警认可的客货两用车型
  • 小规模纳纳税人
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设