Featured image of post 限制了CPU Usage但是Load Average很高导致容器进程运行很慢

限制了CPU Usage但是Load Average很高导致容器进程运行很慢

什么是Load Average

Load Average:平均负载,是一种对 CPU 资源需求的度量。使用 top 命令后可以看到如:load average: 2.01 1.83 1.30。这三个数字代表着过去1分钟 5分钟 15分钟机器上的Load Average。

  1. 不论CPU是空闲还是满载,Load Average 都表示 Linux 进程调度器中可运行队列里的一段时间的平均进程数目。

  2. 当 CPU 空闲的时候,CPU Usage 可以直接表示 Load Average。即可运行队列中的进程数小于 CPU 个数。这时候单位时间内进程的 CPU Usage 相加的平均值相当于 Load Average 的值。

  3. 如果 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 的数值有以下三部分组成:

  1. Running(运行态):正在CPU上运行的进程数。

  2. Runnable(可运行态):等待CPU时间片可运行的进程数。

  3. 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升高,应用的性能会下降

  1. CPU饱和:当Load Average升高,尤其是超过CPU核心数时,CPU的每个核心都在尽可能快地处理任务。如果任务数量持续超过CPU核心数,CPU将无法及时处理所有任务,导致任务等待时间增加,从而降低了应用的响应速度和吞吐量。

  2. I/O等待:高Load Average可能意味着有更多的进程在等待I/O操作完成。I/O操作通常比CPU计算慢得多,因此,如果大量进程都在等待I/O,系统的整体性能会受到影响。

  3. 内存压力:处理大量任务时,系统可能需要更多的内存来存储临时数据。如果内存不足,系统可能会频繁地进行页面交换(swap),这会显著降低性能,因为磁盘I/O速度远低于内存速度。

  4. 上下文切换:当系统尝试在多个任务之间进行切换以保持公平性时,会进行上下文切换。高Load Average意味着更多的上下文切换,这会消耗额外的CPU周期,从而降低了每个任务的实际执行时间。

  5. 系统资源竞争:在高负载下,不同的进程和线程可能会竞争CPU时间、内存、文件描述符等系统资源。这种竞争可能导致资源分配不均,影响应用性能。

  6. 延迟增加:由于任务等待执行的时间增加,应用的延迟也会随之增加。对于需要快速响应的应用,如Web服务器或数据库,这可能导致用户体验下降。

  7. 服务降级:在某些情况下,为了维持系统的稳定性,系统管理员可能会采取服务降级措施,如限制新的连接请求,这也会降低应用的性能。

预防措施

做好容器内的进程和线程状态的监控。避免创建大量的线程/进程,监控TASK_UNINTERRUPTIBLE状态的线程/进程。

Licensed under CC BY-NC-SA 4.0