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

  • 三星s21无线投屏功能在哪(三星s21 无线投屏)

    三星s21无线投屏功能在哪(三星s21 无线投屏)

  • 网易云音乐歌曲速度怎么调(网易云音乐歌曲怎么下载到u盘)

    网易云音乐歌曲速度怎么调(网易云音乐歌曲怎么下载到u盘)

  • 华为手机如何语音唤醒语音助手(华为手机如何语音转文字)

    华为手机如何语音唤醒语音助手(华为手机如何语音转文字)

  • 小米9pro有没有耳机孔(小米9pro有没有高刷新率)

    小米9pro有没有耳机孔(小米9pro有没有高刷新率)

  • WORD怎么设置每页多少行(word怎么设置每行40个字符)

    WORD怎么设置每页多少行(word怎么设置每行40个字符)

  • 淘宝双十一退货红包会退吗(淘宝双十一退货规则)

    淘宝双十一退货红包会退吗(淘宝双十一退货规则)

  • 腾讯会议可以截屏吗(腾讯会议可以截屏另一方的手机信息吗)

    腾讯会议可以截屏吗(腾讯会议可以截屏另一方的手机信息吗)

  • 钉钉最多设几个管理员(钉钉最多设几个群管理员)

    钉钉最多设几个管理员(钉钉最多设几个群管理员)

  • 视频怎么分享到朋友圈里面(视频怎么分享到QQ)

    视频怎么分享到朋友圈里面(视频怎么分享到QQ)

  • wps的行高列宽在哪里(wps office的行高和列宽的单位是什么)

    wps的行高列宽在哪里(wps office的行高和列宽的单位是什么)

  • 笔记本jkl按出来是123怎么回事(笔记本按j出1)

    笔记本jkl按出来是123怎么回事(笔记本按j出1)

  • 微信上的共享位置可以自己设置吗(微信上的共享位置如何修改公司地址)

    微信上的共享位置可以自己设置吗(微信上的共享位置如何修改公司地址)

  • 华为手机怎么调亮度(华为手机怎么调时间和日期)

    华为手机怎么调亮度(华为手机怎么调时间和日期)

  • ipad连热点网速慢怎么解决(ipadpro连热点好慢)

    ipad连热点网速慢怎么解决(ipadpro连热点好慢)

  • airpods pro如何调节音量(airpods pro如何调节降噪)

    airpods pro如何调节音量(airpods pro如何调节降噪)

  • 手机屏幕发白是什么原因(手机屏幕发白是什么问题)

    手机屏幕发白是什么原因(手机屏幕发白是什么问题)

  • 手机键盘声音怎么打开(手机键盘声音怎么设置)

    手机键盘声音怎么打开(手机键盘声音怎么设置)

  • 魅族m882q是什么型号(魅族m882是什么型号)

    魅族m882q是什么型号(魅族m882是什么型号)

  • word怎么上标数字(word怎么用上标)

    word怎么上标数字(word怎么用上标)

  • vivo nex3怎么显示实时网速(vivo nex3如何)

    vivo nex3怎么显示实时网速(vivo nex3如何)

  • 视频通话中断是什么意思

    视频通话中断是什么意思

  • mtk6797和骁龙660谁好(mt6771v和骁龙660哪个好)

    mtk6797和骁龙660谁好(mt6771v和骁龙660哪个好)

  • 小米锁屏显示时间(小米锁屏显示时间怎么关闭)

    小米锁屏显示时间(小米锁屏显示时间怎么关闭)

  • polycom怎么用(polycom使用教程)

    polycom怎么用(polycom使用教程)

  • 26gw和35gw区别(格力26gw和35gw区别)

    26gw和35gw区别(格力26gw和35gw区别)

  • mediaman.exe是什么进程 有什么用 mediaman进程查询(media是什么文件)

    mediaman.exe是什么进程 有什么用 mediaman进程查询(media是什么文件)

  • 【微信小程序】条件渲染和列表渲染(微信小程序开发)

    【微信小程序】条件渲染和列表渲染(微信小程序开发)

  • 预收货款开票怎么做账
  • 预付卡发票可以报销吗?
  • 会计为什么要计折旧费
  • 库存商品发出汇总表
  • 长期待摊费用摊销会计分录
  • 税控服务费减免政策
  • 购进餐饮服务的会计分录
  • 销售原材料需要交消费税吗
  • 开票金额比实际金额多
  • 组织投标工作
  • 没交社保能扣工伤保险吗
  • 计提工资需要工资表吗
  • 小汽车残值率多少合适
  • 普通发票开票步骤
  • 饭店试菜费用如何计算
  • 全年一次性奖金税收优惠政策2024
  • 招商费用计入哪个明细科目
  • 常见的审计调整事项
  • 发放活动奖金支出怎么入账
  • 外省工程需要什么手续
  • 购买银行承兑汇票的会计分录
  • 餐饮研发费用确认条件
  • 研发费用资本化可以加计扣除吗
  • 软件远程调用失败是什么意思
  • 刚毕业的学生可以买学生票吗
  • 进项发票失控怎么办
  • 后端接口返回数据类型规范
  • 补缴税款计入什么科目
  • 海外供应商贸易平台
  • php mysql_list_dbs()函数用法示例
  • 论文如何学
  • javascript js
  • 红字发票信息表填好后再怎么操作
  • 工资外一次性收入88000交多少税
  • 财务没有及时缴费怎么办
  • 借预收账款贷其他应付款什么意思
  • python怎么创建
  • 0税率可以抵扣进项税吗
  • 房租能不能一次性付清
  • 企业应付账款的借方余额反映的是
  • 其他权益工具账面价值和公允价值
  • 外出经营必须办理外管证吗
  • 买车险怎么打折
  • 应收贷方余额表示什么意思
  • 普通发票可以开多少税率
  • 减免的应付账款如果入账
  • 车辆买的商业险全险,车辆出了事故,保险公司怎么赔
  • 长期股权投资稀释股权
  • 公司清算后能不能转让
  • 企业流动资金的筹措应以财政拨款为主
  • 银行付款退回重付怎么办
  • 4s店收到红字发票怎么开
  • 飞机票退票费如何开票
  • 融资租赁和经营租赁的会计处理
  • 固定资产处置办法
  • 长期待摊费用如何做分录
  • 白条入账会受到监管吗
  • sql server数据库查询语句
  • linux中vi编辑器怎么使用
  • linux 显示
  • windows蓝屏代码大全及解决方案
  • win7桌面怎么设置到d盘
  • windows10日历没有显示农历
  • macbookpro查看硬盘
  • quickdcf.exe - quickdcf是什么进程 作用是什么
  • Win10 Mobile RedStone 14283已修复与已知问题汇总
  • linux中的vi编辑器一般有哪三个模式
  • jquery.ui
  • django forloop
  • 批处理怎么学
  • python sha256加密解密
  • Android spinner 的使用
  • canvas+javascript
  • javascript要打开吗
  • 用jquerymobile案例
  • Python的for和in
  • 专项附加扣除修改后,多扣的税
  • 投资性房地产如何进行后续计量
  • 境外付款需要什么手续
  • 杭州市各区面积人口排名
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设