CPU 负载¶

Linux通过``/proc/stat``和``/proc/uptime``导出各种信息,用户空间工具

如top(1)使用这些信息计算系统花费在某个特定状态的平均时间。

例如:

$ iostat

Linux 2.6.18.3-exp (linmac) 02/20/2007

avg-cpu: %user %nice %system %iowait %steal %idle10.01 0.00 2.92 5.44 0.00 81.63

这里系统认为在默认采样周期內有10.01%的时间工作在用户空间,2.92%的时

间用在系统空间,总体上有81.63%的时间是空闲的。

大多数情况下``/proc/stat``的信息几乎真实反映了系统信息,然而,由于内

核采集这些数据的方式/时间的特点,有时这些信息根本不可靠。

那么这些信息是如何被搜集的呢?每当时间中断触发时,内核查看此刻运行的

进程类型,并增加与此类型/状态进程对应的计数器的值。这种方法的问题是

在两次时间中断之间系统(进程)能够在多种状态之间切换多次,而计数器只

增加最后一种状态下的计数。

举例

假设系统有一个进程以如下方式周期性地占用cpu:

两个时钟中断之间的时间线

|-----------------------|

^ ^

|_ 开始运行 |

|_ 开始睡眠

(很快会被唤醒)

在上面的情况下,根据``/proc/stat``的信息(由于当系统处于空闲状态时,

时间中断经常会发生)系统的负载将会是0

大家能够想象内核的这种行为会发生在许多情况下,这将导致``/proc/stat``

中存在相当古怪的信息:

/* gcc -o hog smallhog.c */

#include

#include

#include

#include

#define HIST 10

static volatile sig_atomic_t stop;

static void sighandler (int signr)

{

(void) signr;

stop = 1;

}

static unsigned long hog (unsigned long niters)

{

stop = 0;

while (!stop && --niters);

return niters;

}

int main (void)

{

int i;

struct itimerval it = { .it_interval = { .tv_sec = 0, .tv_usec = 1 },

.it_value = { .tv_sec = 0, .tv_usec = 1 } };

sigset_t set;

unsigned long v[HIST];

double tmp = 0.0;

unsigned long n;

signal (SIGALRM, &sighandler);

setitimer (ITIMER_REAL, &it, NULL);

hog (ULONG_MAX);

for (i = 0; i < HIST; ++i) v[i] = ULONG_MAX - hog (ULONG_MAX);

for (i = 0; i < HIST; ++i) tmp += v[i];

tmp /= HIST;

n = tmp - (tmp / 3.0);

sigemptyset (&set);

sigaddset (&set, SIGALRM);

for (;;) {

hog (n);

sigwait (&set, &i);

}

return 0;

}

参考

谢谢

Con Kolivas, Pavel Machek

linux内核cpu负载计算,CPU 负载 — The Linux Kernel documentation相关推荐

  1. linux内核编译如何选择cpu类型,Ubuntu内核编译和CPU Hot-Plug特性配置全过程及遇到问题记录...

    最近编译Palacios需要linux的内核支持cpu Hot-Plug(内存热插拔)特性,无奈我机器上安装的Ubuntu10.04系统默认不支持内存热插拔特性,所以需要修改配置文件并重新编译linu ...

  2. linux内核_Linux驱动编程的本质就是Linux内核编程

    由于Linux驱动编程的本质属于Linux内核编程,因此我们非常有必要熟悉Linux内核以及Linux内核的特点. 这篇文章将会帮助读者打下Linux驱动编程的基础知识. 本篇文章分为如下三个小节进行 ...

  3. Linux源代码逐条解释,Linux内核源代码解释让你真正了解linux.ppt

    Linux内核源代码解释让你真正了解linux.ppt 解读Linux内核源代码让您真正明白Linux操作系统 序 一些基本概念 操作系统的基本概念 I386系统的基本概念 Linux简介 源码阅读和 ...

  4. linux内核c语言笔试,C语言之linux内核--BCD码转二进制与二进制转BCD码(笔试经典)...

    在分析代码之前,我们先来了解一下,BCD码和二进制到底区别在哪? 学习过计算机原理的和数字电子技术这两门课的都会知道这两个到底是什么含义,也有的同学学过了,考过了,过了一段时间又忘记了,今天,我们通过 ...

  5. Linux内核精选文章向读者汇报 | 相遇Linux

    本微信公众号精选人气文章向各位读者汇报: 人气最火: Linux实时补丁即将合并进Linux 5.3 投资自己: OS部门Linux死锁/hungtask/soft_hard/lockup分享视频报名 ...

  6. Linux内核配置(二) :CPU类型配置

    5. Processor type and features 处理器类型及特性 5.1. Symmetric multi-processing support (SMP) 对称多处理器支持. 这将支持 ...

  7. linux内核中的每cpu变量

    一.linux中的每cpu变量 看linux内核代码的时候,会发现大量的per_cpu(name, cpu),get_cpu_var(name)等出现cpu字眼的语句.从语句的意思可以看出是要使用与当 ...

  8. linux内核如何支持多核cpu,现在的多核CPU,Linux操作系统是否能够实现单个进程(多线程)的多核调度(跨CPU核心调度)?...

    现在的多核CPU,Linux操作系统是否能够实现单个进程(多线程)的多核调度(跨CPU核心调度)? 关注:106  答案:2  mip版 解决时间 2021-02-02 01:11 提问者你說.你愛我 ...

  9. intel+漏洞+linux内核,彻彻底底的垃圾!Linux之父评Intel的CPU漏洞修复方法

    1月23日消息 此前有报道称,似乎是由于Intel方面未能及时修复此前曝光的CPU安全漏洞,Linux Kernel 4.15版本不得不选择跳票,并发布了RC9候选(上一次发布还是2011年的3.1内 ...

  10. Linux内核省电社区,【整理】Linux禁用CPU省电状态/Linux系统性能调优 | 勤奋的小青蛙...

    为了提升CPU性能,我们要禁用CPU省电状态. 我们强烈推荐禁用CPU的省电模式, 进行此更改可能会导致功耗增加,但会提高稳定性和性能. 那么:如何在Redhat或Suse Linux系统上禁用CPU ...

最新文章

  1. 日期NSDate的使用
  2. quot;streambufquot; ambiguous symbol的问题如何解决
  3. 如何备份被独占文件?
  4. Windows保护模式学习笔记(四)—— 中断门陷阱门
  5. 机器学习与数据挖掘——第二章 数据与数据预处理
  6. Ext.Net全部Icon图标名称展示
  7. 让VS2013支持 C# 6.0 语法
  8. powerquery加载pdf_PowerQuery技巧之自学教程
  9. SCOM监控APC-UPS不间断电源设备
  10. linux之ClamAV杀毒软件安装配置
  11. JavaScript权威指南--chapter 8函数
  12. 揭秘720°三维全景3D实景地图制作技术
  13. 计算机编程是什么_什么是计算机编程?
  14. sql server 2000 sp3 补丁
  15. 【linux】什么是栈回溯
  16. 星空之夜_hash+dfs
  17. 打印程序在计算机上的应用程序,无法打印显示打印机程序服务没有运行解决办法...
  18. 过采样与欠采样图像重采样(上采样下采样)
  19. Chrome安装VUE插件
  20. 阿里设计师带你探讨UxD设计是什么?

热门文章

  1. rxjava 背压_背压加载文件– RxJava常见问题解答
  2. java args_Java命令行界面(第2部分):args4j
  3. java ee的小程序_Java EE调度程序
  4. java 自定义运算符_Java中集合的自定义运算符
  5. hibernate连接泄露_泄漏抽象,或如何正确地与Hibernate绑定Oracle DATE
  6. jms mdb_MDB!= JMS,反之亦然
  7. 用Java将文件读入字节数组的7个示例
  8. 如何在Flutter(REST API)中进行API调用
  9. apache camel_探索Apache Camel Core –文件组件
  10. javafx中的tree_JavaFX中的塔防