从平均负载角度谈Linux性能优化

1. 平均负载

这里的平均负载,讲的是Linux的系统负载,可以通过命令 top 或者 uptime查看到。

                                      

                                   

Load average: 指的是过去的1分钟、5分钟、20分钟系统中,单位时间内,处于可运行状态或者不可中断状态的平均活跃进程数。并不是人们常常理解的,单位时间内的CPU使用率。

然后,top命令的其他内容先不说,上面第二个图中,uptime命令执行结果中,前面一些代表什么意思?

18:14:31    //当前时间
up 41 days, 8:24  //系统运行时间
2 users     //正在登陆的用户数

再看看man手册中uptime命令的详细说明:

DESCRIPTION
       uptime  gives  a  one line display of the following information.  The current time, how long
       the system has been running, how many users are currently logged on,  and  the  system  load
       averages for the past 1, 5, and 15 minutes.

       This is the same information contained in the header line displayed by w(1).

       System  load  averages  is  the average number of processes that are either in a runnable or
       uninterruptable state.  A process in a runnable state is either using the CPU or waiting  to
       use  the CPU.  A process in uninterruptable state is waiting for some I/O access, eg waiting
       for disk.  The averages are taken over the three time intervals.  Load averages are not nor‐
       malized for the number of CPUs in a system, so a load average of 1 means a single CPU system
       is loaded all the time while on a 4 CPU system it means it was idle 75% of the time.

从文档中可以看到,可运行状态的进程,指的是正在使用或者等待CPU的进程,也就是我们使用ps命令看到的处于 R 状态(Running 或 Runnable)的进程。

不可中断状态的进程,是正处于内核态关键流程中的进程,这些个关键流程是不可被打断的,比如最常见的是等待硬件设备的IO响应,即ps命令看到的处于 D(Uninterruptable  Sleep 或 Disk Sleep)状态的进程。不可中断状态是对进程和硬件设备的一种保护机制。

既然是平均的活跃进程数,那么最理想的状态每个CPU都刚好运行一个进程,这样每个CPU到得到充分利用。比如当平均负载为2时,意味着什么呢?

  • 在只有两个CPU的系统上,意味着CPU都刚好被完全占用。
  • 在4个CPU的系统上,意味着CPU有50%是空闲的。
  • 在1个CPU的系统上,意味着一半的进程竞争不到CPU。

在判断平均负载合理不合理的时候,当然首先要知道系统CPU个数,可以用命令 grep 'model name'  /proc/cpuinfo  |  wc -l。当平均负载大于系统CPU个数时,表明系统已经过载。这里说的平均负载有三个值,应该去看那个值?这三个值表示的三个时间段的平均值,是用来分析系统负载趋势的数据来源。在实际生产环境中,平均负载多高时需要我们重点关注呢?在我看来,当平均负载高于系统CPU数量的70%是,就需要排查负载高的问题的了。但这也不是绝对的,更可靠的是,我们应该把负载监控起来,根据历史数据,发现负载明显升高,比如翻倍,那么就要去分析问题了。

2. 平均负载 != CPU使用率

上面说过,平均负载,表示的是单位时间内,处于可运行状态或者不可中断状态的平均活跃进程数,包括正在使用CPU的进程,等待CPU或者等待I/O 的进程。而CPU使用率,表示的是单位时间内,CPU的繁忙情况的统计,跟平均负载不能完全画等号。因为有以下三种可能:

场景一,CPU密集型进程,大量使用CPU就会导致平均负载升高,这个时候两者一致;

场景二,I/O密集型进程,等待I/O,也会导致平均负载升高,但CPU使用率不一定高;

场景三,大量等待CPU的进程调度,也会导致平均负载很高,此时的CPU使用率也会很高。

3. 模拟案例

先来介绍两个工具:stress 和 sysstat.

stress: Linux系统的压力测试工具,用作异常进程模拟平均负载升高的场景。

sysstat: 包含常用的Linux性能工具,用来监控和分析linux系统性能。这里先介绍两个:mpstat 和 pidstat。

  • mpstat是常用的多核CPU性能分析工具,实时查看每个CPU的性能指标, 以及所有CPU的平均指标。 
  • pidstat是常用的进程性能分析工具, 实时查看每个进程的CPU、内存、I/O、及上下文切换等性能指标。         

下面来模拟一下上面的三种场景:假设系统是2个CPU  8GB内存

场景一,CPU密集型:执行命令 stress --cpu 1 --timeout 600

              在第二个终端执行命令  watch -d uptime,实时查看平均负载的变化情况

              在第三个终端实行命令  mpstat -P ALL 5,查看CPU使用率额变化情况

              你会发现平均负载升高,而且是由于某个CPU使用达到100%,最后可以使用命令 pidstat -u 5 1,很明显就能发现stress进程的CPU使用率达到100%。

场景二,IO密集型:执行命令 stress -i  1  --timeout  600  或者 stress-ng -i 1 --hdd 1 --timeout 600

              紧接着执行好看watch -d uptime 、mpstat -P ALL 5 

              你会发现平均负载升高,是由于某个CPU 的iowait 的升高。最后可以使用命令 pidstat -d  5 1,很明显就能发现stress进程导致的。

场景三,进程切换:stress -c 8 --timeout 600

                               watch  -d uptime、 pidstat -u 5 1

               可以看到8个进程在争抢2个CPU,每个进程在等待CPU时间很高。

综合上述三个场景,平均负载升高有可能是CPU密集型,还有可能是IO更繁忙。

以上是学习极客时间专栏(倪朋飞:Linux性能优化实战)的个人总结

https://time.geekbang.org/column/intro/140

发布了37 篇原创文章 · 获赞 20 · 访问量 4946

猜你喜欢

转载自blog.csdn.net/qq_24436765/article/details/103497306