当前位置: 首页 > news >正文

监控CPU(一)

做系统运维,监控CPU是经常的事情,那么需要关注哪些指标呢?????

Run Queue Statistics

   如果想查看cpu的相关繁忙程度,我们可以通过查看系统中进程的状态来做个简单的判断,比方说我们可以通过查看一下runnable进程的数目和blocked进程的数目来cpu的利用率等。

1)runnable

   如果一个process在runnable状态,这就意味着它和其他同样处在runnable状态的process在等待CPU时间,而不是立即获得CPU时间,即我们平时所说的“就绪”状态,表示随时可以执行但是没有在执行。

   当process在runnable状态时,表示其在等待CPU时间执行,这种状态是不消耗CPU时间的,他们形成的等待队列称作Run Queue,Run Queue越大,表示等待的队列越长。Linux调度进程,从runnable队列中(Run Queue),选择一个process下次执行,那么这个process就会获得CPU时间,其就变成running状态。

   process的runnable和running状态,在linux系统中用TASK_RUNNING这个全局变量来表示。TASK_RUNNING表 示process正在被CPU执行,或者已经准备就绪随时可由调度程序调度执行;若此时进程没有被CPU执行,则称其处于就绪状态(runnable), 若此时进程正在被CPU执行,则称其处于执行状态(running)。当一个进程在内核代码中运行时,我们称其处于内核态;当一个进程正在执行用户自己的 代码时,我们称其处于用户态。当系统资源已经可用时,进程就被唤醒而进入准备运行状态,也就是就绪状态。这些状态在内核中表示方法相同,都被称为 TASK_RUNNING状态。当一个进程刚被创建后就处于TASK_RUNNING状态。

   我们平时经常说到的监控系统状态的load(中文翻译为负载),就是这个TASK_RUNNING值,它就是指处在running和runnable的 process的总和。例如:如果有两个processes在running和有三个在等待运行(runnable),那么系统的load为五。load average是指在指定时间内load的平均值,一般load average显示的三个数字的时间分别为1分钟,五分钟和十五分钟。

2)blocked waiting for an event to complete

   一个blocked状态的process可能在等待一个I/O操作获取的数据,或者是一个系统调用的结果。

Context Switches

   大部分现在的CPU在同一时间只能运行一个process,虽然也有一些CPU,例如超线程技术的CPU,能实现同时运行超过一个process,linux把这种CPU看作多个单线程CPU。

    linux内核不断的在不同process间切换,造成一个错觉,让人感觉一个单CPU同时处理多个任务,不同process之间的切换称作 Context Switch。当系统做Context Switch时,CPU保存所有old process的context信息并获得new process的所有context信息。Context信息包括大量的linux追踪每个process信息,尤其是一些资源:哪些process正在 执行,被分配了哪些内存,它打开了那些文件等等。切换Context会触发大量的信息移动,这是比较高的开销,如果可能的话尽量保持很小的 context switches。

   为了尽可能的减小context switches,得需要知道它们是怎么产生的?首先kernel调度触发context switches。为了保证每个process平等的共享CPU时间kernel周期性中断running的process,如果合适,kernel调度 器会开始一个其他的process而不是让当前的process继续执行,每次的周期性中断或者定时中断都可能触发context switch,每秒定时中断的次数因不同架构和不同的kernel版本而不同。获取每秒中断次数的一个简单办法是通过监控 /proc/interrupts文件,看下面的例子:

[root@localhost asm-i386]# cat /proc/interrupts | grep timer; sleep 10 ; cat /proc/interrupts | grep timer

0: 24060043 XT-PIC timer

0: 24070093 XT-PIC timer

上面可以看到在指定的时间内timer次数的变化,每秒产生的中断次数为1000次。

   另外如果你的context switch比timer中断大很多,那么context switch更多的可能是I/O请求或者其他长时间的系统调用(比如sleep)产生。当一个应用请求一个操作不能立即实现时,kernel开始 context switch操作:存入请求的process并且试着切换到其他runnable process,这将使得CPU保持工作状态。

Interrupts

   其他方面,CPU接收硬件驱动发出的中断请求,这种中断通常被触发当一个驱动器有一个时间需要被kernel操作时。例如:如果一个磁盘控制器从磁盘上取 得了一个数据块和kernel需要读取使用这个块,那么磁盘控制器会触发一个中断。kernel接收每个中断,如果这个中断被注册,那么就会有一个中断处 理器来运行处理这个中断,否则这个中断将会被忽略。在系统中,中断处理器的优先级非常高,而且执行速度非常快。很多时候,有些中断处理并不需要很高的处理 优先级,所以也有soft- interrupt handler。如果有很多的中断,kernel需要花费大量的时间去处理中断。可以检查/proc/interrupts能够知道中断发生在哪个CPU 上。

CPU Utilization

   CPU Utilization,一个很直观的概念,在任意时间内,CPU有7个状态:

1)idle,表示CPU闲置并等待工作分配

2)user,表示CPU在运行用户的进程

3)system,表示CPU在执行kernel工作

4)nice,表示CPU花费在被nice改变过优先级的process上的时间(注意:被nice命令改变优先级的process仅指那些nice值为 负的process。花费在被nice命令改变优先级的任务上的时间也将被计算在系统和用户时间内,因此整个时间加起来可能会超过百分之百)

5)iowait,表示CPU等待IO操作完成的时间

6)irq,表示CPU开销在响应硬中断上的时间

7)softirq,表示CPU开销在响应软中断上的时间



本文转自 aklaus 51CTO博客,原文链接:http://blog.51cto.com/aklaus/1837463

相关文章:

  • RIP
  • Lintcode104 Merge k Sorted Lists solution 题解
  • jQuery基础一
  • heartbeat主配置文件
  • Mysql5.6到5.7升级需要以下操作
  • GDI+绘制极坐标图(Polar Diagram)
  • RHEL7/CentOS7 PXE+Kickstart自动化系统安装
  • Netty环境搭建(源码死磕2)
  • [20171113]修改表结构删除列相关问题4.txt
  • 2018.10.24-dtoj-3984 玩具(toy)
  • lvs健康检查
  • 使用vue-cli创建一个vue项目
  • 替换vShield Manager 5.0证书
  • Good Inflation SPOJ - GOODG 李超树
  • 【Shell 编程基础第二部分】Shell里的流程控制\函数及\脚本调试
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Apache的基本使用
  • axios 和 cookie 的那些事
  • java取消线程实例
  • jQuery(一)
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Spring Boot快速入门(一):Hello Spring Boot
  • SpriteKit 技巧之添加背景图片
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 基于web的全景—— Pannellum小试
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 前端自动化解决方案
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 使用Swoole加速Laravel(正式环境中)
  • 手机端车牌号码键盘的vue组件
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​linux启动进程的方式
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • (12)Linux 常见的三种进程状态
  • (7)STL算法之交换赋值
  • (JS基础)String 类型
  • (编译到47%失败)to be deleted
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (学习日记)2024.01.09
  • (转)fock函数详解
  • (转)jQuery 基础
  • (转)shell调试方法
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET框架
  • @Conditional注解详解
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [android] 天气app布局练习
  • [Android]使用Git将项目提交到GitHub
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [BZOJ1008][HNOI2008]越狱