linux 系统load 扫盲

本文解析了Linux系统中的负载概念,通过内核源代码解释了负载值的计算原理,并探讨了负载与CPU使用率之间的区别。

接触过和使用过unix或linux的朋友,都知道如何查看Unix/Linux load的值,这边我也重复一下查看load的方法:

[root@aaronw ~]# uptime
13:33:37 up 7 days, 1:52, 1 user, load average: 4.15, 2.00, 3.14
[root@aaronw ~]# w
13:35:35 up 1 days, 1:54, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/1 192.168.2.2 13:33 0.00s 0.02s 0.00s w
load average 后面三个值代表系统在1分钟、5分钟和15分钟的负载情况,都知道数字越高表示系统负载越大,第一直觉就是这个系统不行了。load average 是0的时候都认为他很低,10的时候就觉得高,20就不用讲了!但是除了这两种极端的情况之外,那什么时候是这两个值的临界点?当别人问起我这个问题的时候,我也不知道如何回答,在我大脑里就根本就没有考虑过。困扰了我很久,我觉得要搞明白他!

先从linux的kernel的源码开始吧!在linux 2.6.36版本中有这样一段代码:

/**
* spu_calc_load – update the avenrun load estimates.
*
* No locking against reading these values from userspace, as for
* the CPU loadavg code.
*/
static void spu_calc_load(void)
{
unsigned long active_tasks; /* fixed-point */

active_tasks = count_active_contexts() * FIXED_1;
CALC_LOAD(spu_avenrun[0], EXP_1, active_tasks);
CALC_LOAD(spu_avenrun[1], EXP_5, active_tasks);
CALC_LOAD(spu_avenrun[2], EXP_15, active_tasks);
}


CALC_LOAD是这样定义:

#define LOAD_FREQ (5*HZ+1) /* 5 sec intervals */
#define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */
#define EXP_5 2014 /* 1/exp(5sec/5min) */
#define EXP_15 2037 /* 1/exp(5sec/15min) */#define CALC_LOAD(load,exp,n) /
load *= exp; /
load += n*(FIXED_1-exp); /
load >>= FSHIFT;



从这里我们能看到取负载值的最小周期5秒,根据代码中定义我们知道

什么是load?

load的就是一定时间内计算机有多少个active_tasks,也就是说是计算机的任务执行队列的长度,cpu计算的队列。

load多少是正常?

既然load是cpu计算的队列,那就应该和cpu个处理方式和cpu的个数有关系。所以我个人认为应该按系统识别的cpu个数来确定load的临界值,系统识别为8个cpu,那么load为8就是临界点,高与8就属于over load了。

什么叫系统识别cpu个数?

我是这样认为的,这里涉及到cpu物理个数和超线程技术的问题。个人认为4个物理cpu和2个双核是不能够等同的,当然这是物理层面的事了!在系统里识别的都是4个CPU.所以应该要以系统识别的为准。毕竟是系统去支配他的使用。

CPU高不等同于load高

在Unix/Linux可能经常会遇到cpu的使用率为100%,但是load却不高!这是为什么呢?因为几乎所有的任务和会和CPU进行交互,但是由于各个设备的使用频率不同,造成了不能同步进行的问题。比如说,当对硬盘进行读写的时候,出现IO的等待时候,事实上cpu已经被切换到别的进程上了。该任务就处于等待状态,当这样的任务过多,导致队列长度过大,这样就体现到负载过大了,但实际是此时cpu被分配去干执行别的任务或空闲,因此CPU高不等同于load高,load高也不能于cpu高。

<!-- Added by RelatedTopic, plugin for Bo-Blog 2.0.0 -->
### Linux top 命令 load 参数详解 在 Linux 系统中,`top` 命令的 `load average` 参数是用于衡量系统负载的重要指标。它表示系统在过去一段时间内的平均负载情况,通常以三个数值的形式显示,分别对应过去 1 分钟、5 分钟和 15 分钟的平均负载值[^3]。 #### 负载平均值(Load Average)的含义 负载平均值反映了系统的繁忙程度。具体来说,它表示的是单位时间内等待 CPU 处理的任务数。如果这个值小于 CPU 核心数,则说明系统资源充足;如果等于核心数,则表示系统处于满负荷运行状态;若超过核心数,则意味着系统超负荷运行,可能会导致性能下降[^1]。 #### 如何判断系统负载是否过高 - 对于单核 CPU,当 `load average` 接近或等于 1 时,系统已经接近满负荷运转。 - 对于多核 CPU,需要将 `load average` 的值与 CPU 核心数进行比较。例如,四核 CPU 的系统,`load average` 小于 4 时,系统负载较低;等于 4 时表示满负荷;大于 4 则表示超负荷运行[^1]。 #### 查看负载平均值 通过 `top` 命令输出的首行信息即可查看当前系统的负载平均值。例如: ``` top - 16:24:25 up 284 days, 4:59, 1 user, load average: 0.75, 0.50, 0.25 ``` 上述输出中,`load average: 0.75, 0.50, 0.25` 分别表示过去 1 分钟、5 分钟和 15 分钟的平均负载值[^2]。 #### 影响负载的因素 负载不仅与 CPU 核心数相关,还受到并发线程数的影响。理论上,负载的最大值与系统中可以并发执行的线程数一致。因此,高负载可能由以下原因引起: - CPU 密集型任务过多。 - I/O 操作阻塞。 - 内存不足导致频繁的交换操作(swap)[^1]。 #### 优化建议 如果发现 `load average` 值持续高于 CPU 核心数,可以采取以下措施: - 检查是否有不必要的进程占用资源,并终止这些进程。 - 优化程序代码以减少资源消耗。 - 增加硬件资源,如升级 CPU 或增加内存。 ```bash # 示例:通过 top 命令查看并杀死高资源消耗的进程 top -b -n 1 | grep "PID" # 查看进程 ID 和资源占用情况 kill -9 <PID> # 终止指定 PID 的进程 ``` ### 注意事项 在分析 `load average` 时,需要注意其仅反映系统的整体负载情况,无法单独指出具体的瓶颈所在。结合其他工具(如 `iostat`、`vmstat`)可以更全面地评估系统性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值