博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unix/Linux 的 Load 初级解释
阅读量:2340 次
发布时间:2019-05-10

本文共 3184 字,大约阅读时间需要 10 分钟。

网址:

几乎每个接触类 Unix 操作系统的工程师都知道如何查看系统负载。但这东西的工作机理到底是怎样的,可能没有多少能说清楚。对比了一些相关信息,加上自己的理解,做一下笔记。

什么是 Load ? 什么是 Load Average ?

Load 就是对计算机干活多少的度量(: the system load is a measure of the amount of work that a computer system is doing)。也有简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟、5分钟、15分钟) 内平均 Load 。【最好的参考文章:】

下面是一个 uptime 命令输出:

$ uptime 18:57:48 up 423 days,  3:55,  2 users,  load average: 1.16, 1.12, 1.20

尽管各种信息来源的定义都不太确定。能确定的一件事情是,你不能精确获取当前时间的 Load .  最小的计算粒度是 5 秒钟(, 5HZ  为 5秒钟,这里的 HZ 是系统定义的变量). 参见 Linux Kernel:

869        count -= ticks; 870        if (unlikely(count < 0)) { 871                active_tasks = count_active_tasks(); 872                do { 873                        CALC_LOAD(avenrun[0], EXP_1, active_tasks);  874                        CALC_LOAD(avenrun[1], EXP_5, active_tasks); 875                        CALC_LOAD(avenrun[2], EXP_15, active_tasks); 876                        count += LOAD_FREQ; 877                } while (count < 0); 878        } 879}

如何判断系统是否已经 Over Load ?

对一般的系统来说,根据 CPU 数量去判断,如上面的例子, 如果平均负载始终在 1.2  以下,而你是 2 颗CPU 的机器。那么基本不会出现 CPU 不够用的情况。也就是 Load 平均要小于 CPU 的数量。

这是  Solaris 性能与工具(Solaris Performance Tools ) 一书推荐的评估方法。【在这里要推荐一下这本书,尽管在 Load 这个地方没有达到我期望的那么细致。但全书揭示了非常多的性能信息。每个 DBA、架构师 的必须书。】

这么说实际上带来另外两个疑问:

1 如果是多核 CPU / 超线程的机器怎么判断? 对这样的机器,我的建议是看操作系统怎么识别的 CPU,根据系统识别出来的逻辑CPU 数量来判断。如果要考虑性能系数,建议参考一下 Oracle 针对不同架构下多核CPU 的收费标准。 据说从单核CPU升级到双核CPU所带来的性能提升是50%,而将双核升级到四核所带来的性能提升只有25%。

2 如果应用是面向线程的怎么判断? 这实际上和 模型有关。你的系统是怎样的? 把这个问题考虑进去即可了。

多数情况下,Load 过高都未必和 CPU 有关。或许倒是有一个例外的,就是应用场景的问题。比如用单CPU 的机器去做高并发 Web 服务器,麻烦就来了

Load 与容量规划(Capacity Planning)

任何一个相对成熟的站点都会利用 Cacti(基于RRDTool) 等工具进行容量规划工作。抓取的 Load 会传 1、5、15  分钟列值过去,这三个度量采用哪个呢? 15 分钟为首选【参见】。

Load 与系统预警

很多对可用性要求比较高的环境都建立了 邮件或SMS 报警机制。关于 Load 报警阈值的制定也有看到不太合理的时候。这里建议 Critical 值(如果用 Nagios 之类的工具你明白这是什么)上限为 物理CPU 的个数(当然你可以设置比这个低)。但比这个值高的话,意义就不大了。比如,数据库服务器有 4 颗 CPU,那么 Load 高于 4 就应该报警出来,设置比 4 高可能意义不大,因为接到报警还有个人为响应时间...

误解 一:系统 Load 高一定是性能有问题。

真相:系统 Load 高也或许是因为在进行
CPU 密集型的计算(比如编译)

误解 二:系统 Load 高一定是 CPU 能力问题或数量不够。

真相:Load 高只是代表需要运行的队列累积过多了。但队列中的任务实际可能是耗 CPU的,也可能是耗 I/O 乃至其它因素的。

误解 三:系统长期 Load 高,首选增加 CPU。

真相:Load 只是表象,不是实质。增加 CPU 个别时候会临时看到系统 Load 下降,但治标不治本。

小小一个 Load 讲究其实不少。英文信息其实比较全的,尽量保证加入一点新信息到这篇文章里。入看到有写的不合理的地方或者有异议,请指正或告知。

--EOF--

FAQ 1:数据库服务器突然 CPU 100% 繁忙,咋办?

A :一般情况下,这是由糟糕的 SQL 引起。建议抓取 ,针对 I/O 开销比较大(重点看全表扫描)的SQL 进行优化。根据经验值,每个 CPU Core 一秒钟能处理 100-400MB 数据量。如果是大量的并发 I/O 操作,尽管存储的吞吐可能还没那么大,也可能会把 CPU "塞满"。

 

uptime 11:12:26 up 3:44, 4 users, load average: 0.38, 0.31, 0.19

上面的输出,load average后面分别是1分钟、5分钟、15分钟的负载情况。

数据是每隔5秒钟检查一次活跃的进程数,然后根据这个数值算出来的。如果这个数除以CPU的数目,结果高于5的时候就表明系统在超负荷运转了

系统的负载存放在文件/proc/loadavg中,该文件记录了系统在前一分钟、前五分钟和前

十五分钟的平均负载以及当前运行的进程、系统的进程数和上一次调度运行的进程。
Linux的系统负载指运行队列的平均长度,也就是等待CPU的平均进程数。

既然load是cpu计算的队列,那就应该和cpu个处理方式和cpu的个数/Core数量有关系。所以我个人认为应该按系统识别的cpu个数来确定load的临界值,系统识别为8个cpu,那么load为8就是临界点,高于8就属于over load了。一般的双CPU多核机器,Load 高于 4 问题不大.

之前team内部也有讨论,结论是以CPU的数量做为load的标准判断可能是线程使用之前的事情了。现在的load小于CPU数量的4倍都还是可以使用的,4-6之间会感到卡,6之上就几乎不可用了。

CPU高不等同于load高

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

 

 

转载地址:http://lrzvb.baihongyu.com/

你可能感兴趣的文章
Java PAT (Basic Level) Practice 写出这个数
查看>>
Python PAT (Basic Level) Practice 1016 部分A+B
查看>>
Python PAT (Basic Level) Practice 1006 换个格式输出整数
查看>>
Python PAT (Basic Level) Practice 1009 说反话
查看>>
Python PAT (Basic Level) Practice 1011 A+B 和 C
查看>>
Python PAT (Basic Level) Practice 1017 A除以B
查看>>
Python PAT (Basic Level) Practice 1042 字符统计
查看>>
spring dubbo 2.7.3 zookeeper 项目构建
查看>>
spring dubbo 报错
查看>>
如何在非 bean 对象中注入 dubbo service
查看>>
前后端分离 ajax java跨域配置 spring boot 、 spring security
查看>>
java spring boot 拦截所有请求 显示请求路径 方法 ip 等
查看>>
java spring boot jackson 配置 null字符串为"" null数组为[]
查看>>
java redistemplate 配置序列化
查看>>
ArcEngine中加载和读取Style文件或.serverstyle文件
查看>>
递归算法及经典递归例子代码实现
查看>>
Surrounded Regions
查看>>
Palindrome Partitioning
查看>>
Palindrome Partitioning II
查看>>
Clone Graph
查看>>