linux
系统工具
介绍四个工具,
uptime
用于查看系统负载,vmstat
用于查看虚拟内存状态,iostat
用于统计CPU和设备IO信息,top工具
动态显示进程状态,还包括系统负载,虚拟内存状态,cpu和内存使用率。我们将对几个工具逐一进行说明。
uptime
显示内容:
- 当前时间
- 系统已启动的时间
- 当前上线人数
- 系统平均负载(1、5、10分钟的平均负载,一般不会超过1)
系统平均负载:
指在特定时间间隔内运行队列中的平均进程数,通常每个CPU内核
的当前活动进程数不大于3, 那么系统的性能良好。如果每个CPU内核
的任务数大于5,那么此主机的性能有严重问题。如果linux主机是1个双核CPU,当LoadAverage为6的时候说明机器已经被充分使用。
我们可以使用命令uptime
查看系统负载情况。
[root@CT731 ~]#uptime
20:37:03 up 2 days, 2:54, 5 users, load average: 0.00, 0.01, 0.05
uptime还有一些小的选项,比如uptime -p
显示开机了多久,精确到分钟。还有uptime -s
显示系统开机时间。
[root@CT731 hexo]#uptime -p
up 2 days, 3 hours, 9 minutes
[root@CT731 hexo]#uptime -s
2017-09-07 17:42:47
vmstat
vmstat
命令的含义为显示虚拟内存状态Viryual Memorn Statics,同时,它可以报告关于进程、内存、I/O等系统整体运行状态,如下:
[root@CT731 ~]#vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 2456 550500 984 679940 0 0 2 6 34 37 0 0 99 0 0
在上面的代码中,我们看到了很多的项:
1.procs
是表示进程状态,r
代表可运行(正在运行或等待运行)进程的个数,和核心数有关。b
代表处于不可中断睡眠态的进程个数(被阻塞的队列的长度)。
2.memory
表示内存状态,其中swpd
是指交换内存的使用总量,free
是空闲物理内存总量,buff
指用户buffer的内存总量,cache
是用于cache的内存总量。
3.swap
是指交换分区的状态,si
代表从磁盘交换进内存的数据速率(kb/s)[从交换分区到内存],so
代表从内存交换至磁盘的数据速率(kb/s)[从内存到交换分区]
4.io
项中,bi
代表从块设备读入数据到系统的速率(kb/s)[从块设备读数据到内存],bo
代表保存数据至块设备的速率(kb/s)[从内存度数据到块设备]
5.system
项中,in
代表interrupts 中断速率,包括时钟,cs
代表context switch 进程切换速率。
6.cpu
项中,us
代表Time spent running non-kernel code,sy
代表Time spent running kernel code,id
代表Time spent idle. Linux 2.5.41前,包括IO-wait time,wa
代表Time spent waiting for IO. 2.5.41前,包括in idle,st
代表Time stolen from a virtual machine. 2.6.11前, unknown。
此外,vmstat
还有一些选项,vmstat 2
表示每2秒刷新一次,vmstat 2 5
表示每2秒刷新一次,共刷新5次。
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 2456 552148 984 682056 0 0 1 6 34 37 0 0 99 0 0
0 0 2456 552024 984 682056 0 0 0 0 50 70 0 0 100 0 0
0 0 2456 552024 984 682056 0 0 0 0 55 81 0 0 100 0 0
0 0 2456 552024 984 682056 0 0 0 0 50 72 0 0 100 0 0
0 0 2456 552024 984 682056 0 0 0 0 47 67 0 0 100 0 0
vmstat -s
则会以表的形式显示上面的信息。
[root@CT731 ~]#vmstat -s
1867292 K total memory
632352 K used memory
195712 K active memory
792804 K inactive memory
551900 K free memory
... ...
iostat
iostat命令
被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。
选项:
-c
:仅显示CPU使用情况
-d
:仅显示设备利用率
-k
:显示状态以千字节每秒为单位,而不使用块每秒
-m
:显示状态以兆字节每秒为单位
-p
:仅显示块设备和所有被使用的其他分区的状态
-t
:显示每个报告产生时的时间
-x
:显示扩展状态
我使用iostat
命令,显示以下信息:
[root@CT731 ~]#iostat
Linux 3.10.0-514.el7.x86_64 (CT731) 09/10/2017 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.34 0.00 0.17 0.03 0.00 99.46
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.47 4.95 21.76 1027014 4514774
scd0 0.01 0.50 0.00 103986 0
我们可以从中看到cpu的部分信息,和磁盘的信息。在磁盘信息中:
tps
:该设备每秒的传输次数
kB_read/s
:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s
:每秒向设备(drive expressed)写入的数据量;
kB_read
:读取的总数据量;
kB_wrtn
:写入的总数量数据量;这些单位都为Kilobytes。
同样的,我们可以使用iostat 2
和iostat 2 5
动态刷新信息。
[root@CT731 ~]#iostat 2 5
Linux 3.10.0-514.el7.x86_64 (CT731) 09/10/2017 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.33 0.00 0.17 0.03 0.00 99.46
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.47 4.93 21.67 1027014 4515997
scd0 0.01 0.50 0.00 103986 0
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 0.00 0.00 100.00
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
scd0 0.00 0.00 0.00 0 0
接下来,我们看看选项中的示例:
iostat -c
仅显示CPU的信息
[root@CT731 ~]#iostat -c
Linux 3.10.0-514.el7.x86_64 (CT731) 09/10/2017 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.33 0.00 0.17 0.03 0.00 99.46
iostat -d
仅显示设备利用率
[root@CT731 ~]#iostat -d
Linux 3.10.0-514.el7.x86_64 (CT731) 09/10/2017 _x86_64_ (4 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.47 4.91 21.60 1027014 4516738
scd0 0.01 0.50 0.00 103986 0
iostat -p
仅显示块设备和所有被使用的其他分区的状态
[root@CT731 ~]#iostat -p
Linux 3.10.0-514.el7.x86_64 (CT731) 09/10/2017 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.33 0.00 0.17 0.03 0.00 99.46
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.47 4.90 21.55 1027014 4517404
sda1 0.01 0.12 0.01 26036 2124
sda2 0.34 4.28 18.83 897486 3946502
sda3 0.11 0.48 2.69 99685 564769
sda4 0.00 0.00 0.00 18 0
sda5 0.00 0.01 0.02 2628 4008
scd0 0.01 0.50 0.00 103986 0
iostat -x
:显示扩展状态
[root@CT731 ~]#iostat -x
Linux 3.10.0-514.el7.x86_64 (CT731) 09/10/2017 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.33 0.00 0.17 0.03 0.00 99.46
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.20 0.17 0.30 4.90 21.54 112.94 0.03 57.20 16.40 80.30 4.04 0.19
scd0 0.00 0.00 0.01 0.00 0.50 0.00 129.42 0.00 3.22 3.22 0.00 2.70 0.00
rrqm/s
:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);
wrqm/s
:每秒这个设备相关的写入请求有多少被Merge了。
rKB/s
:每秒向设备发出的读取请求数
wKB/s
:每秒向设备发出的写入请求数
avgrq-sz
: 平均请求扇区的大小
avgqu-sz
: 是平均请求队列的长度。毫无疑问,队列长度越短越好。
await
: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm
: 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。
%util
: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
在这里我们在介绍一个命令pmap
,它用于报告进程的内存映射关系,是Linux上调试及运维一个相当不错的工具。
选项:
-x
:显示扩展格式;
-d
:显示设备格式;
-q
:不显示头尾行;
我们配合pidof
命令查找ping 172.17.0.1
的进程ID,查看其映射关系。
[root@CT731 ~]#pidof ping
123245
[root@CT731 ~]#pmap 123245
123245: ping 127.0.0.1
00007efdbd000000 103588K r---- locale-archive
00007efdc3529000 84K r-x-- libz.so.1.2.7
00007efdc353e000 2044K ----- libz.so.1.2.7
00007efdc373d000 4K r---- libz.so.1.2.7
... ...
00007efdc5076000 4K r---- ping
00007efdc5077000 4K rw--- ping
00007fffe27f7000 8K r-x-- [ anon ]
ffffffffff600000 4K r-x-- [ anon ]
total 127912K
top
top命令
可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,还可以通过命令管理。
top - 16:36:51 up 2 days, 10:34, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 192 total, 1 running, 191 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1867292 total, 571368 free, 591152 used, 704772 buff/cache
KiB Swap: 4194300 total, 4191848 free, 2452 used. 994920 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21517 root 20 0 377524 18108 14144 S 0.3 1.0 3:25.88 vmtoolsd
1 root 20 0 193628 5504 3208 S 0.0 0.3 0:37.55 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.43 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:28.06 ksoftirqd/0
在%CPU
一栏中:
us
:用户空间
sy
:内核空间
ni
:调整nice时间
id
:空闲
wa
:等待IO时间
hi
:硬中断
si
:软中断(模式切换)
st
:虚拟机偷走的时间
top命令
还有选项可用,top -d #
[1]指定刷新时间,默认三秒,top -b
全部显示所有进程,top -n #
[1]刷新多少次后退出。
还有就是我们可以直接使用内置命令对命令的显示内容进程调整,以便得到我们想要的结果:
我们可以使用P
以占据的CPU百分比[%CPU]进行排序,M
以占据内存百分比[%MEM]排序,T
以累积占据CPU时长[TIME+]排序。
对于首部的信息,我们可以以l
命令对uptime信息关闭或打开,以t
命令对cup和进程状态以不同的格式显示,或者关闭;以m
命令对memory信息以不同格式进行显示或关闭;或者1
命令更改CPU信息的显示格式。
除了这些外,还有s
更改刷新时间,k
置顶终止指定进程,W
保存文件,q
退出。