什么是Load Average
Load Average:平均负载,是一种对 CPU 资源需求的度量。使用 top 命令后可以看到如:load average: 2.01 1.83 1.30。这三个数字代表着过去1分钟 5分钟 15分钟机器上的Load Average。
-
不论CPU是空闲还是满载,Load Average 都表示 Linux 进程调度器中可运行队列里的一段时间的平均进程数目。
-
当 CPU 空闲的时候,CPU Usage 可以直接表示 Load Average。即可运行队列中的进程数小于 CPU 个数。这时候单位时间内进程的 CPU Usage 相加的平均值相当于 Load Average 的值。
-
如果 CPU 是满载,同事还有很多的进程在排队等待 CPU 。这时候 Load Average 就不等于 CPU Usage,并且是会大于 CPU Usage。
示例
1、在有2个CPU的情况下,并且启动了两个进程并且这两个进程并且尽量吃满了CPU,这时候 CPU 是满载。这时候通过top
命令,会看到 CPU Usage 相加接近 200%,而 Load Average 里1分钟的值 也是接近2。
2、在有4个CPU的情况下,开6个进程并且尽量吃满CPU,这时候 CPU Usage 相加只会接近 400%,但是 Load Average 里1分钟的之是接近6。
由此可见,CPU Usage 并不能直接等于 Load Average。
Load Average的组成
Load Average 的数值有以下三部分组成:
-
Running(运行态):正在CPU上运行的进程数。
-
Runnable(可运行态):等待CPU时间片可运行的进程数。
-
Uninterruptible Sleep(不可中断睡眠态):也叫D状态的进程,在等待某些I/O操作完成而无法被调度的进程数。
限制了容器的CPU Usage但是Load Average很高
如上所述,在CPU满载后,并且还有更多的进程需要资源的时候,这时候CPU Usage不等于Load Average。所以限制了容器的CPU Usage并不能解决 Load Average 升高的问题
Load Average 升高的原因
1、在不断创建出新的进程,导致大量的进程处于Runnable状态
2、大量的进程处于D状态(TASK_UNINTERRUPTIBLE)
为什么Load Average升高,应用的性能会下降
-
CPU饱和:当Load Average升高,尤其是超过CPU核心数时,CPU的每个核心都在尽可能快地处理任务。如果任务数量持续超过CPU核心数,CPU将无法及时处理所有任务,导致任务等待时间增加,从而降低了应用的响应速度和吞吐量。
-
I/O等待:高Load Average可能意味着有更多的进程在等待I/O操作完成。I/O操作通常比CPU计算慢得多,因此,如果大量进程都在等待I/O,系统的整体性能会受到影响。
-
内存压力:处理大量任务时,系统可能需要更多的内存来存储临时数据。如果内存不足,系统可能会频繁地进行页面交换(swap),这会显著降低性能,因为磁盘I/O速度远低于内存速度。
-
上下文切换:当系统尝试在多个任务之间进行切换以保持公平性时,会进行上下文切换。高Load Average意味着更多的上下文切换,这会消耗额外的CPU周期,从而降低了每个任务的实际执行时间。
-
系统资源竞争:在高负载下,不同的进程和线程可能会竞争CPU时间、内存、文件描述符等系统资源。这种竞争可能导致资源分配不均,影响应用性能。
-
延迟增加:由于任务等待执行的时间增加,应用的延迟也会随之增加。对于需要快速响应的应用,如Web服务器或数据库,这可能导致用户体验下降。
-
服务降级:在某些情况下,为了维持系统的稳定性,系统管理员可能会采取服务降级措施,如限制新的连接请求,这也会降低应用的性能。
预防措施
做好容器内的进程和线程状态的监控。避免创建大量的线程/进程,监控TASK_UNINTERRUPTIBLE状态的线程/进程。