首页 > 技术文章 > Linux学习(二十六)日常管理(一)w、vmstat、top、sar、nload、iostat、iotop

doubilaile 2017-11-28 09:09 原文

从这一节我们开始学习Linux得日常运维命令。

一、W

w命令常用来查看系统负载,查看当前有哪些用户登录到系统中,以及他们在系统中的一些行为。

[root@ruanwenwu02 ~]# w
 20:56:32 up 2 days, 13:12,  2 users,  load average: 0.01, 0.02, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      3110月17 12days  0.24s  0.24s -bash
root     pts/0    192.168.38.1     1811月17  0.00s  0.65s  0.00s w

第一行的20:56:32 up 2 days, 13:12,"表示当前时间20:56:32,系统开机到目前为止经过了2天,13小时,12分钟。“load average: 0.01, 0.02, 0.05”表示最近1分钟,5分钟,15分钟的负载。一般来说,这个数字越低,则说明系统的压力越小。下一小节我会单独来记录一下loadaverage这个东西。

 备注:

1) 区别于who命令,w命令不仅可以看到登录服务器的用户信息,而且可以看到这些用户做了什么

2) who am i命令,显示出自己在系统中的用户名,登录终端,登录时间

3) whoami命令,显示自己在系统中的用户名

4) logname命令,可以显示自己初次登录到系统中的用户名,主要识别sudo前后情形

5) last命令,查看最近1个月用户登录服务器的情况 
6) tty命令,来查看所连接的设备或终端

二、loadaverage

2.1. 什么是load average?

linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount of work that a computer system is doing)。也有简单的说是进程队列的长度。

Load Average 就是一段时间 (1 分钟、5分钟、15分钟) 内平均 Load 。

我们可以通过系统命令"w"查看当前load average情况

[root@CNC-BJ-5-3N1 ~]# w
20:01:55 up 76 days, 8:20, 6 users, load average: 1.30, 1.48, 1.69

上面内容显示系统负载为“1.30, 1.48, 1.69”,这3个值是什么意思呢?

  • 第一位1.30:表示最近1分钟平均负载
  • 第二位1.48:表示最近5分钟平均负载
  • 第三位1.69:表示最近15分钟平均负载 

PS. linux系统是5秒钟进行一次Load采样

2.2. load average值的含义

2.2.1 单核处理器

假设我们的系统是单CPU单内核的,把它比喻成是一条单向马路,把CPU任务比作汽车。当车不多的时候,load <1;当车占满整个马路的时候 load=1;当马路都站满了,而且马路外还堆满了汽车的时候,load>1

 Load < 1

 Load = 1
 Load >1

2.2.2 多核处理器

我们经常会发现服务器Load > 1但是运行仍然不错,那是因为服务器是多核处理器(Multi-core)。

假设我们服务器CPU是2核,那么将意味我们拥有2条马路,我们的Load = 2时,所有马路都跑满车辆。 

Load = 2时马路都跑满了

#查看CPU core 
grep 'model name' /proc/cpuinfo | wc -l

2.3. 什么样的Load average值要提高警惕

  • 0.7 < load < 1: 此时是不错的状态,如果进来更多的汽车,你的马路仍然可以应付。
  • load = 1: 你的马路即将拥堵,而且没有更多的资源额外的任务,赶紧看看发生了什么吧。
  • load > 5: 非常严重拥堵,我们的马路非常繁忙,每辆车都无法很快的运行

2.4. 三种Load值,应该看哪个?

通常我们先看15分钟load,如果load很高,再看1分钟和5分钟负载,查看是否有下降趋势。

1分钟负载值 > 1,那么我们不用担心,但是如果15分钟负载都超过1,我们要赶紧看看发生了什么事情。所以我们要根据实际情况查看这三个值。 

2.5. 通过Nagios配置Load监控告警

见文:http://heipark.iteye.com/blog/1340190

三、vmstat

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。

一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

root@ubuntu:~# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3498472 315836 3819540 0 0 0 1 2 0 0 0 100 0

2表示每个两秒采集一次服务器状态,1表示只采集一次。

实际上,在应用过程中,我们会在一段时间内一直监控,不想监控直接结束vmstat就行了,例如:

复制代码
root@ubuntu:~# vmstat 2  
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0
0 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0
1 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0
复制代码

这表示vmstat每2秒采集数据,一直采集,直到我结束程序,这里采集了5次数据我就结束了程序。

好了,命令介绍完毕,现在开始实战讲解每个参数的意思。

r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。

swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

free   空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

buff   Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M

cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

so  每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

bi  块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

in 每秒CPU的中断次数,包括时间中断

cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。

sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

id  空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

wt 等待IO CPU时间。

四、top命令

man的解释是:The top program provides a dynamic real-time view of a running system. It can display system summary infor-

mation as well as a list of tasks currently being managed by the Linux kernel.

翻译成中文是:top程序提供系统的实时状态视图。他除了能提供系统的大概信息,还能当前运行的程序所占用的cpu和内存的情况。

我们先看top执行的情况:

top - 18:19:46 up 16 days,  9:04, 23 users,  load average: 1.27, 1.21, 1.19
Tasks: 568 total,   2 running, 563 sleeping,   1 stopped,   2 zombie
Cpu(s): 16.7%us,  1.3%sy,  0.0%ni, 81.7%id,  0.2%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8060540k total,  7641428k used,   419112k free,    61780k buffers
Swap: 16777196k total,  2025104k used, 14752092k free,   281040k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                           
22620 root      20   0  437m  53m 2712 R 99.6  0.7  16511:03 php                                                                
21762 ding.lin  20   0  562m 171m  10m S 10.3  2.2   1:56.81 php                                                                
21760 ding.lin  20   0  549m 159m  10m S  8.9  2.0   1:45.97 php                                                                
20944 ma.dong   20   0 99.8m 2656 1544 S  5.6  0.0  11:42.95 sshd                                                               
 3521 yang.lei  20   0 7862m 5.3g 1272 S  4.6 69.1  24:47.76 python                                                             
20942 root      20   0 97.7m 3916 2960 S  1.7  0.0   3:24.42 sshd                                                               
 2236 root      20   0  411m  25m 3436 S  1.0  0.3   8:10.85 php                                                                
21766 ding.lin  20   0  402m  24m 9320 S  1.0  0.3   0:10.26 php         

这个信息会每3秒自动更新一次。如果不想要它更新,可以使用top -bn1命令:

[ruan.wenwu@kddi-zol-fss-web1 conf]$ top -bn1|head -n 20
top - 18:21:22 up 16 days,  9:05, 23 users,  load average: 1.24, 1.22, 1.19
Tasks: 569 total,   3 running, 563 sleeping,   1 stopped,   2 zombie
Cpu(s): 13.6%us,  0.8%sy,  0.0%ni, 85.5%id,  0.1%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8060540k total,  7678448k used,   382092k free,    67088k buffers
Swap: 16777196k total,  2025032k used, 14752164k free,   284908k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                            
22620 root      20   0  437m  53m 2712 R 98.0  0.7  16512:22 php                                                                
21760 ding.lin  20   0  560m 169m  10m S  9.6  2.2   1:54.30 php                                                                
21762 ding.lin  20   0  574m 184m  10m S  9.6  2.3   2:06.40 php                                                                
20944 ma.dong   20   0 99.8m 2656 1544 S  5.8  0.0  11:48.62 sshd                                                               
 1818 postfix   20   0 83764 2992  540 S  1.9  0.0   7:58.57 qmgr                                                               
 2236 root      20   0  411m  25m 3436 S  1.9  0.3   8:11.95 php                                                                
20942 root      20   0 97.7m 3916 2960 S  1.9  0.0   3:26.06 sshd                                                               
21719 ding.lin  20   0  427m  39m  10m S  1.9  0.5   0:21.16 php                                                                
21729 ding.lin  20   0  398m  22m  10m S  1.9  0.3   0:11.33 php                                                                
31512 postfix   20   0 81124 3576 2652 S  1.9  0.0   0:00.04 cleanup                                                            
31530 ruan.wen  20   0 15292 1480  824 R  1.9  0.0   0:00.02 top                                                                
    1 root      20   0 19352  540  312 S  0.0  0.0   0:59.90 init                                                               
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd    

这个命令适合在写脚本的时候使用。

最后一个%st可能是系统被偷走的资源,比如你的系统安装了虚拟机,可能出现这样的情况。

top默认按cpu百分比排序。按M按内存排序。按P按cpu排序。
按1显示所有cpu的情况:
[ruan.wenwu@kddi-zol-fss-web1 conf]$ top
top - 18:23:46 up 16 days,  9:08, 23 users,  load average: 1.15, 1.17, 1.17
Tasks: 582 total,   2 running, 577 sleeping,   1 stopped,   2 zombie
Cpu0  : 11.9%us,  1.7%sy,  0.0%ni, 85.8%id,  0.3%wa,  0.0%hi,  0.3%si,  0.0%st
Cpu1  :  7.0%us,  2.3%sy,  0.0%ni, 90.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  4.3%us,  1.0%sy,  0.0%ni, 94.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  3.3%us,  0.7%sy,  0.0%ni, 96.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  4.7%us,  1.0%sy,  0.0%ni, 94.4%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu6  : 10.6%us,  0.7%sy,  0.0%ni, 88.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  : 88.1%us,  0.7%sy,  0.0%ni, 10.9%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   8060540k total,  7743128k used,   317412k free,    81616k buffers
Swap: 16777196k total,  2025028k used, 14752168k free,   299068k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                           
22620 root      20   0  437m  53m 2712 S 89.0  0.7  16514:20 php                                                                
21762 ding.lin  20   0  592m 202m  10m S 12.2  2.6   2:20.42 php                                                                
21760 ding.lin  20   0  577m 186m  10m S 10.3  2.4   2:07.51 php                                                                
21766 ding.lin  20   0  410m  32m 9320 S  7.9  0.4   0:12.77 php                                                                
20944 ma.dong   20   0 99.8m 2656 1544 S  6.3  0.0  11:57.39 sshd                                                               
 3521 yang.lei  20   0 7862m 5.3g 1272 R  3.3 69.1  24:58.46 python                                                             
20942 root      20   0 97.7m 3916 2960 S  1.7  0.0   3:28.58 sshd       

 五、sar

sar命令被称为linux中的瑞士军刀,意思是它可以干很多事情,但是通常我们用它来查看系统的网卡流量:

sar -n DEV 1 10

这条命令的意思就是每秒显示一次,显示10次:

[ruan.wenwu@kddi-zol-fss-web1 conf]$ sar -n DEV 1 3
Linux 2.6.32-642.11.1.el6.x86_64 (kddi-zol-fss-web1.zoldc.com.cn)     12/20/2017     _x86_64_    (8 CPU)

06:27:16 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
06:27:17 PM        lo     88.00     88.00     36.67     36.67      0.00      0.00      0.00
06:27:17 PM      eth0    157.00    161.00    117.72     40.31      0.00      0.00      1.00

06:27:17 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
06:27:18 PM        lo    300.00    300.00     69.97     69.97      0.00      0.00      0.00
06:27:18 PM      eth0   1206.12   1130.61   1011.27    183.38      0.00      0.00      1.02

06:27:18 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
06:27:19 PM        lo    121.21    121.21     32.16     32.16      0.00      0.00      0.00
06:27:19 PM      eth0    304.04    316.16    143.03     68.02      0.00      0.00      1.01

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
Average:           lo    169.02    169.02     46.16     46.16      0.00      0.00      0.00
Average:         eth0    552.19    532.66    421.00     96.75      0.00      0.00      1.01

说明:

IFACE:有lo和eth0两张网卡

rxpck/s:每秒收到的包

txpck/s:每秒发出去的包

rxkb/s:每秒收到的数据量

txkb/s:每秒发出去的数据量。比如你买的带宽是1M,那么就是看这个数据有没有跑满。

其他的几行不用看。

sar命令需要安装后才能使用:

yum -y install sysstat

sar会记录每天的信息放在/var/log/sa目录下:

[root@iZ25lzba47vZ ~]# cd /var/log/sa/
[root@iZ25lzba47vZ sa]# ls
sa01  sa05  sa09  sa13  sa17  sa21  sa25  sa29   sar03  sar07  sar11  sar15  sar19  sar23  sar27
sa02  sa06  sa10  sa14  sa18  sa22  sa26  sa30   sar04  sar08  sar12  sar16  sar20  sar24  sar28
sa03  sa07  sa11  sa15  sa19  sa23  sa27  sar01  sar05  sar09  sar13  sar17  sar21  sar25  sar29
sa04  sa08  sa12  sa16  sa20  sa24  sa28  sar02  sar06  sar10  sar14  sar18  sar22  sar26  sar30
[root@iZ25lzba47vZ sa]# 

如果想要查看某一天的流量:

[root@iZ25lzba47vZ sa]# sar -n DEV -f /var/log/sa/sa17
Linux 3.10.0-123.9.3.el7.x86_64 (iZ25lzba47vZ)  12/17/2017      _x86_64_        (1 CPU)

12:00:01 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
12:10:01 AM      eth0      0.03      0.04      0.00      0.00      0.00      0.00      0.00
12:10:01 AM      eth1      2.66      3.11      0.25      4.97      0.00      0.00      0.00
12:10:01 AM        lo      3.02      3.02      0.55      0.55      0.00      0.00      0.00
12:20:01 AM      eth0      0.03      0.05      0.00      0.00      0.00      0.00      0.00
12:20:01 AM      eth1      0.22      0.20      0.01      0.04      0.00      0.00      0.00

查看磁盘读写:

[root@iZ25lzba47vZ sa]# sar -b
Linux 3.10.0-123.9.3.el7.x86_64 (iZ25lzba47vZ)  12/20/2017      _x86_64_        (1 CPU)

12:00:01 AM       tps      rtps      wtps   bread/s   bwrtn/s
12:10:01 AM      0.69      0.04      0.65      0.56     28.49
12:20:01 AM      0.02      0.00      0.02      0.00      0.25
12:30:01 AM      1.53      1.08      0.45     24.52     13.40

sa17是二进制文件不能直接cat,需要用sar命令查看;sar17是文本,可以直接查看。

六、nload

nload也是用来查看网卡流量的方法。比起sar -n DEV获取网卡流量的方式,nload看起来更加直观。我们先看一下nload的效果:

直接nload就行了,不用加任何参数。方向键可以在多张网卡之间切换。

noload的安装需要先安装:

yum -y install epel-release

然后才是安装nload:

yum -y install nload

七、iostat

[root@iZ25lzba47vZ sa]# iostat -x
Linux 3.10.0-123.9.3.el7.x86_64 (iZ25lzba47vZ)  12/20/2017      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.21    0.00    0.18    0.10    0.10   99.41

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvda              0.00     0.45    0.09    0.49     1.37     5.25    22.64     0.00    8.52   12.13    7.82   2.16   0.13
xvdb              0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00    0.75    0.75    0.00   0.75   0.00

最常用的是-x参数,如果%util接近100%,说明产生的I/O请求太多,I/O系统已经满负载,该磁盘可能存在瓶颈。

在安装sar命令的sysstat时,iostat也默认安装上了。

此外我们还可以使用iotop来查看是那些进程占用了多少io:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.21    0.00    0.18    0.10    0.10   99.41

Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                         
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
    2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
    3 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
    5 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/0:0H]

iotop命令的安装:

yum -y install iotop

 

 

 

推荐阅读