uptime

我们先来看一下命令执行结果

  1. 11:10:42 up 4 days, 19:23, 2 users, load average: 3.17, 3.45, 3.65

我们来分组解释一下,大概分成一下几个部分

  • 系统当前时间 11:10:42
  • up 4 days, 19:23 从上次启动开始系统运行的时间
  • 2 users 注意这里实际是连接数量,可以自己测试出来,同一用户多个连接的时候算多个
  • load average: 3.17, 3.45, 3.65 这是重头戏,分别描述了1分钟5分钟15分钟内系统平均负载

我们使用man uptime命令进行查询uptime的说明如下(man命令不了解的稍微百度一下就明白,这是一个类似手册的功能)

注:一般我们使用 uptime -h 即命令加-h或—help的形式得到的是比较简单的帮助文档,而man命令一般会给出更详细的解释,不过一般都是英文的,其实也没有太难的词语希望大家坚持英文阅读。提高技术水平的同时也潜移默化的提高了英语水平

  1. uptime gives a one line display of the following information.
  2. The current time, how long the system has been running, how many
  3. users are currently logged on, and the system load averages for
  4. the past 1, 5, and 15 minutes.
  5. This is the same information contained in the header line dis
  6. played by w(1).
  7. System load averages is the average number of processes that are
  8. either in a runnable or uninterruptable state. A process in a
  9. runnable state is either using the CPU or waiting to use the CPU.
  10. A process in uninterruptable state is waiting for some I/O
  11. access, eg waiting for disk. The averages are taken over the
  12. three time intervals. Load averages are not normalized for the
  13. number of CPUs in a system, so a load average of 1 means a single
  14. CPU system is loaded all the time while on a 4 CPU system it
  15. means it was idle 75% of the time.

当然我知道大部分童鞋是不想看那么长串的英文的,我翻译了一下如下:

uptime 在一行中给了如下信息:当前时间,系统已经运行了多久,多少用户连接目前正在使用系统,系统在过去1,5,15分钟内的平均负载。
这与w(1)显示的标题行中包含相同的信息。


系统负载平均值是处于可运行或不可中断状态的平均进程数。 进程在可运行状态是指进程正在使用CPU或等待使用CPU。 处于不可中断状态的进程是指的进程正在等待某些I/O访问,例如等待磁盘。 平均值是在三个时间间隔内取得的。 对于系统中的CPU数量,负载平均值没有标准化,因此负载平均值为1意味着单个CPU系统一直在加载,而在4 CPU系统上,这意味着它在75%的时间内处于空闲状态。
_
什么是System load average(系统平均负载)?

  • 系统平均负载是处于runnable或uninterruptable状态的进程数。R+D状态的进程数。
  • 处于runnable状态的进程,正在使用CPU或正在等待使用CPU。
  • 处于uninterruptable状态的进程,正在等待某些I/O访问,比如等待磁盘。
  • 平均负载没有针对系统中CPU的数量进行归一化,因此平均负载为1表示单个CPU系统始终处于满载状态,而在4 CPU系统上则意味着75%的时间处于空闲状态。

这里我们做一个比喻便于理解,我们把处于可运行或不可中断状态的的平均进程数量比喻成货物数量,而cpu可以理解为传送带。货物数量是1个的话,如果只有一条传送带,那么传送带就是满负荷运行,如果有4个传送带,那么就有三条空闲(即上文说的75%空闲)。平均负载就可以理解为一段时间内的平均货物数量。

接下来我们学习一下uptime可携带的参数

  1. OPTIONS
  2. -p, --pretty
  3. show uptime in pretty format//以比较友好的格式输出
  4. -h, --help
  5. display this help text//显示帮助选项
  6. -s, --since
  7. system up since, in yyyy-mm-dd HH:MM:SS format//系统启动时间
  8. -V, --version
  9. display version information and exit//版本信息

运行结果如下

  1. @dev1:~$ uptime -p
  2. up 4 days, 22 hours, 38 minutes
  3. @dev1:~$ uptime -s
  4. 2018-09-13 15:47:04
  5. @dev1:~$ uptime -V
  6. uptime from procps-ng 3.3.10
  7. @dev1:~$ uptime -h
  8. Usage:
  9. uptime [options]
  10. Options:
  11. -p, --pretty show uptime in pretty format
  12. -h, --help display this help and exit
  13. -s, --since system up since
  14. -V, --version output version information and exit
  15. For more details see uptime(1).

下面顺便提一下怎么查系统的cpu核心数量。(方法有很多种,我觉得这种最好记忆)

lscpu - 查看CPU个数

这个命令应该是比较好记的,毕竟ls,cpu这两个我们都记得了。

这里面显示了很多选项。其中cpu(s):数量表明了cpu的个数。如下图

  1. Architecture: x86_64 //cpu架构
  2. CPU op-mode(s): 32-bit, 64-bit
  3. Byte Order: Little Endian//小端(低位字节存储在内存的低地址端 intel的cpu一般是小端,amd的一般是大端 Big Endian)
  4. CPU(s): 4//cpu数量

uptime 为什么要统计不可中断进程数

这些数字是没有做归一化处理的,即在单核cpu上,负载值为1的时候就表示系统满负荷工作。但是在双核cpu上,同样的值只表示系统的负载为50%。

好的,基本盘介绍完,大部分时候我们只要知道这些知识也就够用了,but,你有想过linux系统是怎样计算出这个值的么?
直观的说,linux系统当前正在运行和等待运行的进程的数目,似乎可以等同于负载。
如果熟悉linux系统的话,linux中的进程可以处于多种状态,其中RUNNABLE状态的进程就完全符合这种定义。
蓝鹅,uptime实际计算的是处于 RUNNABLE(正在运行) 和 UNINTERRUPTIBLE(不可中断)状态的进程数目的总合。

简单介绍一下UNINTERRUPTIBLE进程,处于这种状态的进程一般是在处理I/O相关的任务。比如mkdir命令,为了保证内核数据和外部存储介质数据之间的一致性,这个命令的某个阶段是处于UNINTERRUPTIBLE状态的,即屏蔽掉所有的系统中断信号。
总之,你可以简单理解成不可中断的进程就是在等待磁盘而暂时挂起的进程。(随着linux系统的发展,这种说法对今天的linux系统已经不准确了,比如进程获取mutex互斥锁的时候也可以处于不可中断的状态了)

OK,重点是,uptime输出的系统平均负载,为什么要引入对不可中断进程的统计呢?
本文开头引用的那篇文章的作者,经过不懈的努力(这段是这篇文章的搞笑担当),终于在1993年的一封电子邮件上找到了原因。

电子邮件原文如下 From: Matthias Urlichs urlichs@smurf.sub.org Subject: Load average broken ? Date: Fri, 29 Oct 1993 11:37:23 +0200> The kernel only counts “runnable” processes when computing the load average. I don’t like that; the problem is that processes which are swapping or waiting on “fast”, i.e. noninterruptible, I/O, also consume resources.It seems somewhat nonintuitive that the load average goes down when you replace your fast swap disk with a slow swap disk…Anyway, the following patch seems to make the load average much more consistent WRT the subjective speed of the system. And, most important, the load is still zero when nobody is doing anything. ;-) 翻译过来,原因是这样的,想象如下场景:
一个处理外部请求的linux系统,当外部请求不变时,硬盘的读写性能变慢,linux系统的平均负载应该变高还是变低?

先说硬盘读写性能为啥会变慢?原因太多了,比如ssd的话,随着存储的数据慢慢接近容量上限,读写性能就会越来越慢。再比如linux系统挂载了3块硬盘,然后其中两块坏了只剩一块。
再来说前面的那个问题,答案应该是系统负载变高。因为硬盘变慢,系统处理请求的能力就下降了,堆积的请求就会变多(等待磁盘的进程变多)。

负载 = 正在运行进程 + 堆积的等待运行的进程
理解这一点,那从设计上,
如果负载只统计RUNNABLE的进程,在磁盘变慢的情况下,负载是降低的!**这球不合理啊。(注:因为等待磁盘,即处于UNINTERRUPTIBLE的进程没被统计)。

所以
负载 = RUNNABLE + UNINTERRUPTIBLE
是合理的打法。