为什么服务器的CPU就百分之百了呢?CPU的负载为什么如此的高?
如何获取CPU的信息
/proc/cpuinfo是可以获取系统CPU信息比如物理CPU的个数 每个CPU的物理核心数量 CPU的型号和主频等信息。
简要介绍一下proc文件系统,因为所有的性能监控工具获取的性能指标都是从proc文件系统获取并计算得出的.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接口.用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数.由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的. proc文件系统包含很多文件,其中/proc/cpuinfo和/proc/stat是CPU信息文件。
谁在消耗CPU
系统调度器会调度两件事情:线程和中断这两者消耗CPU,消耗CPU是有优先级区别的:[1] 中断 设备通知内核处理完成,[2] 内核态进程,[3] 用户态进程。
CPU相关的概念读懂CPU监控数据,需要了解三个概念:
Interrupt
硬中断性能测试中关注的中断,主要由IO设备所产生,如键盘的一次按键,网卡接收报文等等IO设备所发出的IRQ(Interrupt ReQuest)请求叫做中断请求(可屏蔽中断)每个能够发出中断的IO设备都有一个IRQ输出线(部分高级千兆网卡,和大部分万兆网卡都多条IRQ输出线)。每条IRQ输出线和可编程中断控制器(Programmable Interrupt Controller)引脚相关联。每个IRQ输出线的中断信号,只能被一个CPU core处理,IRQ线从0开始编号。
软中断例如:NET_TX_SOFTIRQ 把数据包传送到网卡NET_RX_SOFTIRQ 从网卡接收数据包每个CPU都有自己的ksoftirqd/n(n为CPU的逻辑号码)每个ksoftirqd/n内核线程都运行ksoftirqd()函数来处理自己的终端队列上的软中断。
Context Switches
Linux Kernel会把每个核当做一个独立的处理器,双核=两个处理器一个独立的Linux Kernel一次可以运行50~50000进程;如果只有一个CPU,内核就要调度平衡这些进程;每个进程都会分配到一定的CPU时间一旦超时就会被高优先级的抢占掉(比如硬件中断)被扔回队列,这就是所谓的上下文切换每次上下文切换,线程所需要的资源就从CPU寄存器移除转移到队列里面
系统除了第一个进程是“手工”建立以外, 其余的都是进程使用系统调用 fork 创建的新进程。内核程序使用进程标识号(process ID, pid)来标识每个进程。进程由可执行的指令代码、数据和堆栈区组成。进程中的代码和数据部分分别对应一个执行文件中的代码段、数据段。每个进程只能执行自己的代码和访问自己的数据及堆栈区。进程之间相互之间的通信需要通过系统调用了进行。对于只有一个 CPU 的系统,在某一时刻只能有一个进程正在运行。内核通过调度程序分时调度各个进程运行。
Run Queue
每个CPU都会维护自己的运行队列Run Queue.理想状态下调度器应该不断的运行执行进程.进程要么是处于sleep态(阻塞等待IO),要么是运行态.如果CPU高负荷,调度器可能无法及时响应系统请求.结果就是可执行的进程就会填满运行队列.队列越长,需要等待的时间越长。
CPU Utilization
对Linux系统,CPU的系统指标主要有八个:用户态(user)、低优先态(nice)、系统态(sys) 、空闲态(idle)、磁盘I/O等待态(iowait)、硬中断态(irq)、软中断态( softirq )、丢失态(steal)。
CPU利用率= (user+ nice+ sys + iowait+ irq+ softirq+ steal )/ 单位时间×100%
CPU利用率= (1 - idle)/ 单位时间×100%
vmstat指令:是一个运行起来成本比较小的工具(low-overhead),即使在服务器压力非常大的情况下也可以使用;这个工具有两种模式:average模式和sample模式 前者是平均情况,后者可以定时采样。
top指令:运行中可以通过 top 的内部命令对进程的显示方式进行控制
mpstat指令:是实时系统监控工具,其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。
你是否遇到过系统CPU整体利用率不高,而应用缓慢的现象?