1、如何了解系统的负载情况?
uptime
回车之后,会在命令窗口输出以下信息:
接下里解读上面的信息的含义:
15:54:23 //系统当前时间
up 3 days //系统已运行时间
3 users //登录用户数
load average: 0.00, 0.01, 0.05 //表示过去1分钟,5分钟,15分钟的平均负载数。这三个参数构成了系统负载趋势图。
2、什么是平均负载?
它是最常见也是最重要的系统指标。简单来说,平均负载时是单位时间内,系统处于可运行及不可中断状态的平均进程数,也就是平均活跃进程数。所以,它不仅包括了正在使用CPU的进程,还包括了等待CPU和等待I/O的进程。和CPU使用率没有直接关系。
什么是可运行状态的进程?
是指正在使用CPU或者正在等待CPU的进程。也就是我们用ps命令看到处于R状态的进程。
什么是不可中断状态的进程?
是指哪些处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的I/O响应,也就说我们用ps看到处于D状态的进程。这其实是系统对进程和硬件设备的一种保护机制。
3、平均负载为多少时合理?
平均负载最理想的情况是等于CPU个数。
查看cpu数
grep 'model name' /proc/cpuinfo
wc命令用法
Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。
-c 统计字节数。
-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息
wc用法实例: 统计cpu个数
grep 'model name' /proc/cpuinfo | wc -l
当平均负载高于CPU数量70%的时候,就要排查负载高的原因了。
4、平均负载与CPU使用率区分
CPU密集型进程,使用大量CPU会导致平均负载升高,此时这两者是一致的。
I/O密集型进程,等待I/O也会导致平均负载升高,但CPU使用率不一定很高
大量等待CPU的进程调度也会导致平均负载升高,此时的CPU使用率也不会较高。
5、平均负载案例分析
工具介绍
stress 是一个 Linux系统压力测试工具,用作异常进程模拟平均负载升高的场景。
stress参数说明:
-? 显示帮助信息
-v 显示版本号
-q 不显示运行信息
-n,--dry-run 显示已经完成的指令执行情况
-t --timeout N 指定运行N秒后停止
--backoff N 等待N微妙后开始运行
-c --cpu 产生n个进程 每个进程都反复不停的计算随机数的平方根
-i --io 产生n个进程 每个进程反复调用sync(),sync()用于将内存上的内容写到硬盘上
-m --vm n 产生n个进程,每个进程不断调用内存分配malloc和内存释放free函数
--vm-bytes B 指定malloc时内存的字节数 (默认256MB)
--vm-hang N 指示每个消耗内存的进程在分配到内存后转入休眠状态,与正常的无限分配和释放内存的处理相反,这有利于模拟只有少量内存的机器
-d --hadd n 产生n个执行write和unlink函数的进程
--hadd-bytes B 指定写的字节数,默认是1GB
--hadd-noclean 不要将写入随机ASCII数据的文件Unlink
时间单位可以为秒s,分m,小时h,天d,年y,文件大小单位可以为K,M,G
sysstat 包含了常用的Linux性能工具,用来监控和分析系统的性能。
mpstat 是一个常用的多核 CPU性能分析工具,用来实时查看每个CPU 的性能指标,以及所有 CPU 的平均指标。
pidstat 是一个常用的进程性能分析工具,用来实时查看进程的CPU、内存、I/O 以及上下文切换等性能指标。
常用的参数:
-u:默认的参数,显示各个进程的cpu使用统计
-r:显示各个进程的内存使用统计
-d:显示各个进程的IO使用情况
-p:指定进程号
-w:显示每个进程的上下文切换情况
-t:显示选择任务的线程的统计信息外的额外信息
-T { TASK | CHILD | ALL }
这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-V:版本号
-h:在一行上显示了所有活动,这样其他程序可以容易解析。
-I:在SMP环境,表示任务的CPU使用率/内核数量
-l:显示命令名和所有参数
centos环境安装这两个工具
yum install stress
方式1:(不推荐,因为不能安装最新的版本,会导致没有%wait指标项)
yum install sysstat
方式2:使用rpm
wget -c http://pagesperso-orange.fr/sebastien.godard/sysstat-11.7.3-1.x86_64.rpm
rpm -Uvh sysstat-11.7.3-1.x86_64.rpm
方式1安装后显示的sysstat版本:
方式2安装后显示的sysstat版本:
场景1:CPU密集型进程
1.首先,模拟一个CPU使用率100%的场景。在第一个终端输入以下命令
stress --cpu 1 --timeout 600
2.接着在第二个终端输入uptime命令查看平均负载的变化情况。
watch -d uptime
image
wacht可以帮你检测一个命令的运行结果,省得你一遍遍手动运行。
命令参数:
-n或--interval watch缺省每2秒运行一下程序,可以用-n或-interval来指定间隔的时间。
-d或--differences 用-d或--differences 选项watch 会高亮显示变化的区域。 而-d=cumulative选项会把变动过的地方(不管最近的那次有没有变动)都高亮显示出来。
-t 或-no-title 会关闭watch命令在顶部的时间间隔,命令,当前时间的输出。
3.最后,在第三个终端运行mpstat查看CPU使用率的变化情况。
-P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据
mpstat -P ALL 5 1
4.查看哪个进程导致CPU使用率为100%
间隔5s输出一组数据
pidstat -u 5 1
终端2的平均负载慢慢超过1,从终端3可以看到CPU使用率接近100%,而它的iowait为0。这说明,平均负载的升高正是由于CPU的使用率为100%
场景2:I/O密集型进程
1.首先,模拟I/O压力,及不停地执行sync:
-i = --io
stress -i 1 --timout 600
2.在第二个终端执行uptime查看平均负载的变化情况:
wathc -d uptime
3.在第三个终端执行mpstat查看CPU使用率情况:
mpstat [选项] [<时间间隔>] [<次数>]可对比下mpstat -P ALL 5 1
mpstat -P ALL 5
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 27.72 0.00 18.66 6.99 0.00 0.20 0.00 0.00 0.00 46.43
Average: 0 3.05 0.00 50.10 18.33 0.00 0.20 0.00 0.00 0.00 28.31
Average: 1 3.66 0.00 19.72 9.76 0.00 0.20 0.00 0.00 0.00 66.67
Average: 2 44.05 0.00 3.17 0.00 0.00 0.20 0.00 0.00 0.00 52.58
Average: 3 59.08 0.00 2.40 0.20 0.00 0.20 0.00 0.00 0.00 38.12
我们不难发现,平均负载会慢慢加到2.17,其中一个CPU的使用率达到
50.10,而iowait达到18.33。这说明平均负载的升高是由于大量I/O进程导致的。
4.查看是哪个进程导致iowait如何之高?
pidstat -u 5 1
Average: UID PID %usr %system %guest %wait %CPU CPU Command
Average: 0 9 0.00 0.20 0.00 0.80 0.20 - rcu_sched
Average: 0 23721 0.00 62.75 0.00 1.20 62.75 - stress
场景3:大量进程
当系统运行的进程超过CPU运行能力时,就会出现等待CPU的进程
1.在4个CPU机器,模拟8个进程
stress -c 8 --timout 600
2.因为只有4个CPU,少于8个进程,系统会处于过载状态。如下图,已经达到了12.24
watch -d uptime
3、接着用pidstat来看一下进程情况:
间隔5s输出一组数据,之后不再输出,如果想持续输出,则把1去掉
pidstat -u 5 1
09:54:54 AM UID PID %usr %system %guest %wait %CPU CPU Command
09:54:59 AM 0 15046 32.80 0.00 0.00 67.20 32.80 2 stress
09:54:59 AM 0 15047 38.80 0.00 0.00 61.20 38.80 1 stress
09:54:59 AM 0 15048 32.00 0.00 0.00 68.00 32.00 0 stress
09:54:59 AM 0 15049 51.40 0.00 0.00 48.80 51.40 2 stress
09:54:59 AM 0 15050 39.40 0.20 0.00 60.40 39.60 3 stress
09:54:59 AM 0 15051 27.00 0.00 0.00 72.40 27.00 1 stress
09:54:59 AM 0 15052 31.40 0.00 0.00 69.00 31.40 2 stress
09:54:59 AM 0 15053 31.80 0.00 0.00 67.80 31.80 3 stress
可以看出,8个进程在抢占4个CPU,每个进程等待CPU时间高达72.4%(看wait指标)。这些超出CPU计算能力的进程,最终导致CPU过载。
6、实验总结
导致CPU平均负载过高的原因有以下几点:
平均负载高有可能是CPU密集型进程导致;
平均负载高不一定是CPU使用率高了,还有可能是I/O更繁忙了;
当发现平均负载高了,可通过mpstat实时监控CPU,通过pidstat实时监控当前运行的进程。