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

  • 淘菜菜怎么申请自提点(淘菜菜怎么申请价格保护)

    淘菜菜怎么申请自提点(淘菜菜怎么申请价格保护)

  • edge如何删除hao123强制首页(edge如何删除hao360强制首页)

    edge如何删除hao123强制首页(edge如何删除hao360强制首页)

  • switch无法连接服务器(switch无法连接至服务器)

    switch无法连接服务器(switch无法连接至服务器)

  • 微信通话可以恢复吗(微信通话可以恢复吗几天可以恢复)

    微信通话可以恢复吗(微信通话可以恢复吗几天可以恢复)

  • ppt可以插入视频吗

    ppt可以插入视频吗

  • 手机面容什么意思(手机面容功能有什么用)

    手机面容什么意思(手机面容功能有什么用)

  • 手机调成飞行模式别人打电话会有提示吗(手机调成飞行模式打电话会怎么提示)

    手机调成飞行模式别人打电话会有提示吗(手机调成飞行模式打电话会怎么提示)

  • 钉钉电脑的摄像头为什么不显示画面(钉钉电脑的摄像头怎么关)

    钉钉电脑的摄像头为什么不显示画面(钉钉电脑的摄像头怎么关)

  • magicwatch2和gt2区别(magicwatch2和gt2pro)

    magicwatch2和gt2区别(magicwatch2和gt2pro)

  • 微信未授权抖音怎么办(微信未授权抖音登录失败)

    微信未授权抖音怎么办(微信未授权抖音登录失败)

  • 苹果手机没电了还可以查位置吗(苹果手机没电了怎样快速恢复电量)

    苹果手机没电了还可以查位置吗(苹果手机没电了怎样快速恢复电量)

  • 抖音小红心怎么换钱(抖音小红心怎么批量删除)

    抖音小红心怎么换钱(抖音小红心怎么批量删除)

  • 小米CC9最大充电功率(小米cc9最大充电功率多少)

    小米CC9最大充电功率(小米cc9最大充电功率多少)

  • 计算机领域中数据是指(计算机领域中数据是各种图片)

    计算机领域中数据是指(计算机领域中数据是各种图片)

  • 关闭volte是什么意思(关闭volte功能有什么影响)

    关闭volte是什么意思(关闭volte功能有什么影响)

  • ps怎么打竖字(ps里怎样竖着打字)

    ps怎么打竖字(ps里怎样竖着打字)

  • 港版苹果怎么使用电信卡(港版iphone怎么用)

    港版苹果怎么使用电信卡(港版iphone怎么用)

  • 华为手机电子保修卡在哪里(华为手机电子保修卡在哪里查询)

    华为手机电子保修卡在哪里(华为手机电子保修卡在哪里查询)

  • 一加7p有耳机孔吗(一加7pro手机耳机插孔在哪里)

    一加7p有耳机孔吗(一加7pro手机耳机插孔在哪里)

  • 网络机顶盒可以连接电脑吗(网络机顶盒可以直接看电视吗)

    网络机顶盒可以连接电脑吗(网络机顶盒可以直接看电视吗)

  • 华为手表gt上市时间(华为gt手表发布)

    华为手表gt上市时间(华为gt手表发布)

  • 控制ppt的笔叫什么(ppt控制的那个笔叫什么)

    控制ppt的笔叫什么(ppt控制的那个笔叫什么)

  • oppo手机无障碍在哪关闭(oppo手机无障碍功能怎么取消)

    oppo手机无障碍在哪关闭(oppo手机无障碍功能怎么取消)

  • 华为插件在哪里设置(华为插件app)

    华为插件在哪里设置(华为插件app)

  • 显卡生产日期(微星显卡生产日期)

    显卡生产日期(微星显卡生产日期)

  • 使用增值税发票的条件
  • 出口货物退税是指
  • 对账结算流程
  • 商品进销差价在贷方代表什么
  • 报销销售部门差旅费
  • 人力资源公司可以接保安业务吗
  • 高新技术企业认证都有哪些条件
  • 退休工资要缴纳税吗
  • 企业递延所得税费用的计算公式
  • 外经证预缴附加税
  • 员工借款会计科目
  • 自建房屋房产税纳税义务发生时间
  • 转账支票遗失能挂失吗
  • 应收而未收的装修款如何做账务处理?
  • 印花税已经缴纳了但是还未申报
  • 固定资产清理收入增值税税率
  • 汇算清缴截止
  • 普通合伙企业分配利润
  • 股东增资印花税税目
  • 增值税专用发票怎么开
  • 购买库存商品收到发票怎样做分录
  • 服务费发票可以部分红冲吗
  • 技术服务收入和产品服务收入举个例子
  • 小规模纳税人核定征收标准
  • 取得其他权益工具投资发生的交易费用
  • 长期股权投资特征
  • 如何快速修复
  • 再次研究下cache_lite
  • win没有投影到此电脑怎么办
  • 年末一般纳税人税率表
  • win10组策略编辑器打不开怎么办
  • PHP:pg_field_name()的用法_PostgreSQL函数
  • 定额征收怎么交税
  • windows7如何制表
  • Sandilands省级森林中被白霜覆盖的番红花,加拿大曼尼托巴 (© Jaynes Gallery/Danita Delimont)
  • 金税三期个税扣缴客户端
  • 个人所得税通过扣缴义务人申报
  • vue获取设备id
  • react生命周期分为两类
  • win11安卓子系统教程
  • 缴纳残保金会计分录最新
  • 没有综合所得的经营所得如何预扣预缴个税
  • 已提减值准备的固定资产报废,确认的所得税资产
  • 生产企业出口转内销增值税申报表怎么填
  • sqlserver连接数据库的方法
  • 安装和使用蓄能器应注意哪些问题
  • 附加税费用
  • 商场收取租金如何入账
  • 应付账款尾差如何处理
  • 预付款项为什么这么多
  • 材料成本差异的会计分录
  • 差旅费报销原因
  • 存货跌价准备的账务处理
  • 不征税收入怎么申报增值税
  • 营改增试点行业顺序
  • 停产期间机器设备没提折旧,如何补提折旧
  • mysql5.7.24安装配置教程
  • mysql8 jdbc连接
  • sql中的存储过程
  • windows mysql1045
  • win7快速切换到桌面
  • xp系统打开软件慢怎么解决
  • linux 中的MYSQL命令汇总 适合学习linux下配置mysql的朋友
  • win7系统玩英雄联盟
  • win7打不开任务栏
  • win8系统咋样
  • linux ssh key登录
  • Android 执行油猴脚本
  • easyui搜索框
  • Android studio配置环境
  • win10复制c盘到新硬盘
  • zigzag源码
  • unity3d quaternion
  • js如何封装
  • 税务局追缴社保流程及办理期限
  • 广东每年交多少税给国家
  • 福州市税务局领导班子成员名单
  • 银行缴纳印花税存在问题和建议
  • 上海市税务局发票怎么开
  • 新型墙体材料税率是多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设