关注点
首先,我们来看监控CPU运行状况时需要关注的几个:
-
CPU使用率:
CPU使用率分为用户态CPU使用率和系统态CPU使用率。用户态CPU使用率是指执行应用程序代码的时间占总CPU时间的百分比;系统态CPU使用率是指应用执行操作系统调用的时间占总CPU时间的百分比。系统态CPU使用率高意味着共享资源有竞争或者I/O设备之间有大量的交互。提高应用性能和扩展性的一个目标是尽可能降低系统态CPU使用率。
-
上下文切换:
如果可运行的线程数大于CPU的数量,那么OS最终会强行换出正在执行的线程,从而使其他线程能够使用CPU。这会引起上下文切换,它会保存当前运行线程的执行上下文,并重建新调入线程的执行上下文。
上下文切换又分为2种:让步式上下文切换和抢占式上下文切换。前者是指执行线程主动释放CPU,与锁竞争严重程度成正比,可通过减少锁竞争来避免;后者是指线程因分配的时间片用尽而被迫放弃CPU或者被其他优先级更高的线程所抢占,一般由于线程数大于CPU可用核心数引起,可通过调整线程数,适当减少线程数来避免。
-
运行队列
每个CPU都会维持一个运行队列,理想情况下,调度器会不断让队列中的进程运行。进程不是处在sleep状态就是run able状态。如果CPU过载,就会出现调度器跟不上系统的要求,导致可运行的进程会填满队列。队列愈大,程序执行时间就愈长。
-
Load Average
Load Average是 CPU的 Load,它所包含的信息不是 CPU的使用率状况,而是在一段时间内 CPU正在处理以及等待 CPU处理的进程数之和的统计信息,也就是 CPU使用队列的长度的统计信息。
经验值: 安全的load一般是cpu的个数
-
CPU的利用率
User Time, System Time, WaitIO, Idle
-
中断
Devices tell the kernel that they are done processing.
建议
- 运行队列:每个处理器应该运行的队列不超过1-3个线程。例子,一个双核处理器应该运行队列不要超过6个线程。经验值: 安全的load一般是cpu的个数
-
CPU利用率:如果一个CPU被充分使用,利用率分类之间均衡的比例应该是:
65%~70% User Time
30%~35% System Time
0%~5% Idle Time
操作命令
- 查看CPU信息
cat /proc/cpuinfo grep 'processor' /proc/cpuinfo | wc -l 查看CPU个数
-
uptime命令
以下显示输入uptime的信息:
04:03:58 up 10 days, 13:19, 1 user, load average: 0.54, 0.40, 0.20
- 当前时间 04:03:58
- 系统已运行的时间 10 days, 13:19
- 当前在线用户 1 user
-
平均负载:0.54, 0.40, 0.20 (最近1分钟、5分钟、15分钟系统的负载)
系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中: 它没有在等待I/O操作的结果,它没有主动进入等待状态(也就是没有调用’wait’) ,没有被停止(例如:等待终止)。一般来说,每个CPU内核当前活动进程数不大于3,则系统运行表现良好!当然这里说的是每个cpu内核,也就是如果你的主机是四核cpu的话,那么只要uptime最后输出的一串字符数值小于12即表示系统负载不是很严重。当然如果达到20,那就表示当前系统负载非常严重,估计打开执行web脚本非常缓慢。
-
vmstat命令
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况, IO读写情况。
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 5000628 0 122932 0 0 8543 31070 4 9 1 0 93 0 7
r 表示运行队列。当这个值超过了CPU数目,就会出现CPU瓶颈了。
b 表示阻塞的进程。
swpd 虚拟内存已使用的大小,切换到内存交换区的内存数量(k表示)。如果大于0,表示你的机器物理内存不足了。
free 当前的空闲页面列表中内存数量(k表示)。
buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
cache: 作为page cache的内存数量,一般作为文件系统的cache
si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte。
bo 块设备每秒发送的块数量。
in 每秒CPU的中断次数,包括时间中断
cs 每秒上下文切换次数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
us 用户CPU时间。
sy 系统CPU时间。
id 空闲 CPU时间。
wa 等待IO CPU时间。
st Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.
-
Top命令
TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表。
top - 12:38:33 up 50 days, 23:15, 2 users, load average: 60.58, 61.14, 61.22 Tasks: 203 total, 60 running, 139 sleeping, 4 stopped, 0 zombie Cpu(s) : 27.0%us, 73.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1939780k total, 1375280k used, 564500k free, 109680k buffers Swap: 4401800k total, 497456k used, 3904344k free, 848712k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4338 oracle 25 0 627m 209m 207m R 0 11.0 297:14.76 oracle
多U多核CPU监控
在top基本视图中,按键盘数字1,可监控每个逻辑CPU的状况
在top基本视图中,按键盘输入H后,top将以上一次系统记得的“H”状态的相反的状态运行。如上次top的H状态是off,则这次运行时H状态就变成on了,H状态是on时,所有的单独的线程都会被显示出来。
TOP视图解析:
第一行:
12:38:33 当前系统时间
50days, 23:15 系统已经运行了50天23小时15分钟(在这期间没有重启过)
2 users 当前有2个用户登录系统
load average: 60.58, 61.14, 61.22 load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第二行:
Tasks 任务(进程),系统现在共有203个进程,其中处于运行中的有60个,139个在休眠(sleep),stoped状态的有4个,zombie状态(僵尸)的有0个。
第三行:cpu状态
27.0% us 用户空间占用CPU的百分比。
73.0%sy 内核空间占用CPU的百分比。
0.0% ni 改变过优先级的进程占用CPU的百分比
0.0%id 空闲CPU百分比
0.0% wa IO等待占用CPU的百分比
0.0% hi 硬中断(Hardware IRQ)占用CPU的百分比
0.0% si 软中断(Software Interrupts)占用CPU的百分比
第四行:内存状态
total 物理内存总量
used 使用中的内存总量
free 空闲内存总量
buffers 缓存的内存量
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
第五行:swap交换分区
total 交换区总量
used 使用的交换区总量
free 空闲交换区总量
cached 缓冲的交换区总量
如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:530668+79236+4231276 = 4.7GB。
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
第六行是空行
第七行以下:各进程(任务)的状态监控
PID 进程id
USER 进程所有者
PR 进程优先级
NI nice值。负值表示高优先级,正值表示低优先级
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR 共享内存大小,单位kb
S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU 上次更新到现在的CPU时间占用百分比
%MEM 进程使用的物理内存百分比
TIME+ 进程使用的CPU时间总计,单位1/100秒
COMMAND 进程名称(命令名/命令行)
-
mpstat命令
mpstat是MultiProcessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。
这里请大家注意区分物理cpu和逻辑cpu的区别,不要混淆了mpstat -P ALL
- sar命令
sar -q 查看load状况 sar -u 查看cpu使用率 sar -u -f /var/log/sa/sa12 查看历史情况