uptime和vmstat在显示系统负载的区别

uptime可以用来检查Linux系统的负载状况:

$ uptime
 22:53:34 up 169 days,  6:47, 19 users,  load average: 1.99, 2.00, 2.03

load average后面的3个值分别是系统在过去1515分钟负载的平均值(这里的负载包含3种进程:当前正在被CPU执行的,一切条件就绪等待CPU调度的,和等待I/O操作结果的)。

vmstat也可以用来检查Linux系统的负载状况:

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 32312576 1716732 74998032    0    0     0     8    0    0  2  0 98  0  0
 2  0      0 32312264 1716732 74998032    0    0     0     0 3059  139  5  0 95  0  0
 ......

其中r这一栏表示当前正在被CPU执行的,和一切条件就绪等待CPU调度的进程。由于其不包含等待I/O操作结果的进程,所以vmstatuptime更准确地表示系统是否“饱和”:如果r的值大于CPU数量(这里的CPU指一个“逻辑CPU”,即需要考虑物理CPU有多个core,每个core支持hyper-thread的情况),那么系统就处于饱和状态。

对于其它的Unix系统,需要查阅文档确认是否同Linux一致。

使用uptime命令检查Unix系统的负载状况

Unix系统的uptime命令可以用来检查系统的负载状况。以Linux为例:

$ uptime
 01:32:50 up 40 days,  3:09, 56 users,  load average: 11.72, 11.67, 11.51

load average后面的3个值分别是系统在过去1515分钟负载的平均值(这里的负载包含3种进程:当前正在被CPU执行的,一切条件就绪等待CPU调度的,和等待磁盘读取结果的)。衡量当前系统是否“过载”,需要把load averageCPU的数量结合起来考虑。如果load average的值是1,并且当前系统上只有一个CPU(需要注意,这里的CPU指一个“逻辑CPU”,即需要考虑物理CPU有多个core,每个core支持hyper-thread的情况),那么系统在过去的时间就是“满负荷”运转的。但是如果系统上有4CPU,那么系统就只有1 / 4 = 25%的时间是忙碌的,其余75%是空闲的。

Linux系统的uptime读取/proc/loadavg文件:

$ cat /proc/loadavg
12.97 11.53 11.33 12/3958 7094

前三项对应uptimeload average的输出。第四项中斜线前面的是活跃的kernel进程(线程)数,后面则是系统所有的kernel进程(线程)数。最后一项是系统最新产生的进程ID

对于OpenBSD来说,由于其没有/proc文件系统。它的uptime实现则是通过sysctl系统调用读取vm.loadavg的值。

uptime命令简介

uptime命令用来显示系统已经运行的时间:

# uptime
 19:05:33 up  3:16,  2 users,  load average: 0.00, 0.01, 0.05

19:05:33是当前系统时间,up 3:16是系统已经运行了3小时16分。后面还有用户和系统load信息。如果只关心系统运行了多次时间,可以使用下列命令:

# uptime -p
up 3 hours, 16 minutes

uptime命令得到系统运行时间是通过读取/proc/uptime文件:

# cat /proc/uptime
11984.78 95454.77

第一个字段是系统启动的秒数,第二个字段是系统每个CPU core处在idle状态的时间总和。