Unix/Linux 的 Load 初级解释

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

什么是 Load ? 什么是 Load Average ?

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

下面是一个 uptime 命令输出:

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

尽管各种信息来源的定义都不太确定。能确定的一件事情是,你不能精确获取当前时间的 Load . 最小的计算粒度是 5 秒钟(CALC_LOAD 每 5HZ 计算一次, 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 的收费标准。

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

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

Load 与容量规划(Capacity Planning)

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

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 引起。建议抓取 Slow Query Log ,针对 I/O 开销比较大(重点看全表扫描)的 SQL 进行优化。根据经验值,每个 CPU Core 一秒钟能处理 100-400MB 数据量。如果是大量的并发 I/O 操作,尽管存储的吞吐可能还没那么大,也可能会把 CPU "塞满"。


9 thoughts on “Unix/Linux 的 Load 初级解释

  1. xyb

    “CALC_LOAD 每 5HZ 计算一次, 5HZ 为 5秒钟”这句话完全没看懂。HZ是衡量频率的,不是时间,5HZ一次是什么意思?5HZ代表的是一秒钟5次,如果要想表示5秒钟一次,那么频率应该是0.2HZ才对呀?

    Reply
  2. virushuo

    按照cpu数量报警有点保守了。一般大部分机器长期高于4都不会有太大问题。长期高于8会感觉到响应变缓慢了。
    另外,建议讲一下cpu 占用100%,这个在unix通常不是衡量的重要指标,很多刚入门的,尤其是win转过来的,一看到这个就吓的要命。

    Reply
  3. xyb

    看了看linux的内核,原来这里说的是有个变量叫HZ,Orz:
    http://lxr.linux.no/linux/include/asm-i386/param.h#L5
    不同硬件架构的HZ定义不同,这跟硬件时钟应该有关系了。看起来i386的HZ = 100 ticks。同样的,文件中又定义了:
    # define USER_HZ 100
    # define CLOCKS_PER_SEC (USER_HZ)
    所以实际上1x HZ就是一秒,5x HZ就是五秒了。
    可是……简写成5HZ实在太迷惑人了。

    Reply
  4. Fenng

    @virushuo
    一般的双CPU多核机器,Load 高于 4 问题不大
    单CPU 就问题很大了
    如果CPU 比较多,再高一些的确不是问题

    Reply
  5. jcool

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

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *