Linux系列(41) - 监听命令Vmstart,Top(还需完善)

一、简介

  vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控;属于sysstat包;它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。与top不同的是,top是交互式工具,用于监视性能,包含整个Linux系统的性能概要和进程信息。

如果没有vmstat命令,则需要安装

yum install -y sysstat

 二、内存解读

  Linux系统的内存分为物理内存和虚拟内存两种。物理内存是真实的,也就是物理内存条上的内存。而虚拟内存则是采用硬盘空间补充物理内存,将暂时不使用的内存页写到硬盘上以腾出更多的物理内存让有需要的进程使用。当这些已被腾出的内存页需要再次使用时才从硬盘(虚拟内存)中读回内存。这一切对于用户来说是透明的。通常对Linux系统来说,虚拟内存就是swap分区。

三、参数解读

3.1、 表达式:

复制代码
SYNOPSIS
       vmstat [-a] [-n] [delay [ count]]
       vmstat [-f] [-s] [-m]
       vmstat [-S unit]
       vmstat [-d]
       vmstat [-D]
       vmstat [-p disk partition]
       vmstat [-V]
复制代码

3.2、要以1秒为时间间隔,连续收集3次性能数据,命令如下:

1
2
3
4
5
6
(py3) [root@jumpserver-168-182-149 ~]# vmstat 1 3
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 434432 700156     36 1380360    0    0     3    13   42   12  5  3 92  0  0
 1  0 434432 686628     36 1380456    0    0     0     0 2573 1434 18  6 77  0  0
 1  0 434432 662676     36 1380512    0    0     0     0 2021 1395 15  5 80  0  0

类别

项目

含义

说明

Procs(进程)

r

等待执行的任务数

展示了正在执行和等待cpu资源的任务个数。当这个值超过了cpu个数,就会出现cpu瓶颈。

B

等待IO的进程数量

 

Memory(内存)

swpd

正在使用虚拟的内存大小,单位k

 

free

空闲内存大小

 

buff

已用的buff大小,对块设备的读写进行缓冲

 

cache

已用的cache大小,文件系统的cache

 

inact

非活跃内存大小,即被标明可回收的内存,区别于free和active

具体含义见:概念补充(当使用-a选项时显示)

active

活跃的内存大小

具体含义见:概念补充(当使用-a选项时显示)

Swap

si

每秒从交换区写入内存的大小(单位:kb/s)

 

so

每秒从内存写到交换区的大小

 

IO

bi

每秒读取的块数(读磁盘)

块设备每秒接收的块数量,单位是block,这里的块设备是指系统上所有的磁盘和其他块设备,现在的Linux版本块的大小为1024bytes

bo

每秒写入的块数(写磁盘)

块设备每秒发送的块数量,单位是block

system

in

每秒中断数,包括时钟中断

这两个值越大,会看到由内核消耗的cpu时间sy会越多

 

秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目

cs

每秒上下文切换数

CPU(以百分比表示)

us

用户进程执行消耗cpu时间(user time)

us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施了

sy

系统进程消耗cpu时间(system time)

sys的值过高时,说明系统内核消耗的cpu资源多,这个不是良性的表现,我们应该检查原因。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足

Id

空闲时间(包括IO等待时间)

一般来说 us+sy+id=100

wa

等待IO时间

wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。

vmstat命令提供了许多命令行参数,使用man手册查看参数的详细文档。常用的参数有:

-m :显示内核的内存使用情况(slabs)

-a :显示活动和非活动内存分页相关信息

-n :只显示一次栏位名称行,当在取样模式通下将输出信息存储到文件时非常有用。(例如,root#vmstat –n 2 10 以每2秒钟的频率执行10次取样),如果只接一个数字,则表示每多少秒无限执行

三、系统监控的实验

实例一、大量的系统调用
本脚本会进入一个死循环,不断的执行cd命令,从而模拟大量系统调用的环境
测试脚本如下:

#!/bin/bash 
 
while (true) 
do 
cd ; 
done
chmod +x loop.sh
./loop.sh

运行: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
 3  0 435712 416576     36 1736788    0    0     0     0 5890 7219  4 21 75  0  0
 2  0 435712 361036     36 1736792    0    0     0     0 6974 7930 24 24 52  0  0
 3  0 435712 330312     36 1736968    0    0     0     0 7304 7761 18 32 51  0  0
 3  0 435712 321648     36 1737080    0    0     0     0 6767 7008 21 29 50  0  0
 1  0 435712 290116     36 1737144    0    0     0     0 6346 6591 25 24 50  0  0
 5  0 435712 289628     36 1737168    0    0     0    99 8346 13175  8 25 68  0  0
 1  0 435712 413956     36 1737188    0    0     0   144 7947 12721 18 25 58  0  0
 1  0 435712 413792     36 1737188    0    0     0     0 5701 7234  4 21 75  0  0
 2  0 435712 413368     36 1737188    0    0     0     8 5944 7442  4 21 75  0  0
 2  0 435712 415280     36 1737188    0    0     0     0 5709 7221  4 21 75  0  0
 1  0 435712 414148     36 1737188    0    0     0     0 5713 6706  4 21 75  0  0
 1  0 435712 413932     36 1737188    0    0     0     0 5298 6310  5 20 76  0  0
 2  0 435712 415592     36 1737188    0    0     0     0 5678 7199  4 21 75  0  0
 2  0 435712 414368     36 1737188    0    0     0     0 5653 6700  4 20 75  0  0
 3  0 435712 413432     36 1737188    0    0     0   210 5633 7050  4 21 75  0  0
 7  0 435712 411728     36 1737188    0    0     0   230 6648 9505  5 22 73  0  0
 2  0 435712 373168     36 1737200    0    0     0   190 9797 16602 24 31 45  0  0
复制代码

随着程序不断调用cd命令,运行队列有等待的进程r(看参数r),每秒的中断数in(看参数in),下文切换的次数cs骤然提高(看参数cs),系统占用的cpu时间sy(看参数sy)也不断提高,cpu空闲时间id(看参数id)一直为0。当程序终止的时候,r,in,cs,sy数据都下来了,id上去了,表示系统已经空闲下来了。

实例二、大量的io操作

我们用dd命令,从/dev/zero读数据,写入到/tmp/data文件中,如下:

复制代码
dd if=/dev/zero of=/tmp/data bs=1M count=1000

参数解释:
if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file > 
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file > 
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。 

/dev/zero:“零”设备,可以无限的提供空字符(0x00,ASCII代码NUL)。常用来生成一个特定大小的文件
1
dd if=/dev/zero of=./output.txt bs=1024 count=1 #产生一个1k大小的文件output.txt
复制代码

运行: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
21  0 439296 114440     36 1975824    0    0     0     0  410  769  3 97  0  0  0
24  0 439552 129656     36 1959912    0  348     0   348  287  536  4 96  0  0  0
24  0 439808 129572     36 1959316    0   36     0    36  206  423  0 100  0  0  0
18  0 439808 157688     36 1930456    0  148     0   148  308  511  4 96  0  0  0
23  0 440320 160804     36 1927740    0  456     0   456  277  540  5 95  0  0  0
17  1 440320 181112     36 1912696    0   48   208    48  373  707 10 90  0  0  0
20  0 440576 185452     36 1909900    0  168   136   168  246  373 11 89  0  0  0
30  0 440576 176440     36 1918448    0    0  3984    19  471  846 23 74  3  0  0
34  0 440576 168792     36 1921808    0    0  1072    24  448  851 17 83  0  0  0
17  0 440576 166992     36 1923036    0    0   332     0  304  704 10 90  0  0  0
12  0 440576 167552     36 1926380    0    0  1532     0  573 1381 38 62  0  0  0
13  0 440576 165368     36 1927568    0    0     0   127  267  433  5 95  0  0  0
 6  0 440576 163492     36 1928592    0    0     0     0  319  527  8 92  0  0  0
 7  0 440576 160376     36 1929892    0    0     0     0  279  613  4 96  0  0  0
10  0 440576 158276     36 1931884    0    0     0     0  325  568  4 96  0  0  0
12  0 440576 156188     36 1934068    0    0     0     0  334  584 11 89  0  0  0
12  0 440576 154172     36 1935252    0    0     0     0  282  419  4 96  0  0  0
10  0 440576 152016     36 1935856    0    0     0     0  245  452  0 100  0  0  0
 9  0 440576 149820     36 1936904    0    0     0     4  291  535  4 96  0  0  0
19  0 440576 147456     36 1937672    0    0     0     0  282  445  4 96  0  0  0
18  1 440576 145656     36 1938468    0    0     0    18  273  614  5 95  0  0  0
14  0 440576 143684     36 1940092    0    0     0     6  296  514  4 96  0  0  0
10  0 440576 141644     36 1940580    0    0     0     0  244  445  0 100  0  0  0
复制代码

1、bo写数据到磁盘的速率,bi是从磁盘读的速度
2、dd不断的向磁盘写入数据,所以bo的值会骤然提高

这回从/tmp/data文件读,写到/dev/null文件中,如下:

dd if=/tmp/test1 of=/dev/null bs=1M

1、dd不断的从/tmp/data磁盘文件中读取数据,所以bi的值会骤然变高,最后我们看到b(在等待io的进程)也由0变成了1甚至到2
2、dd读的时候,in中断数和cs上下文切换很高,还有就是等待IO所消耗的cpu时间wa相当高

四、vmstat用法:

1、查看系统已经fork了多少次

(py3) [root@jumpserver-168-182-149 ~]# vmstat -f
     14642852 forks

注意:这个数据是从/proc/stat中的processes字段里取得的

2、查看内存的active和inactive

(py3) [root@jumpserver-168-182-149 ~]# vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
1 0 376576 229028 897160 2018204 0 0 4 14 8 27 5 3 92 0 0

3、查看内存使用的详细信息

复制代码
(py3) [root@jumpserver-168-182-149 ~]# vmstat -s
      3861364 K total memory
      1758596 K used memory
      2017476 K active memory
       897136 K inactive memory
       229908 K free memory
           36 K buffer memory
      1872824 K swap cache
      4063228 K total swap
       376576 K used swap
      3686652 K free swap
      5201414 non-nice user cpu ticks
           49 nice user cpu ticks
      2814309 system cpu ticks
     89605394 idle cpu ticks
        36633 IO-wait cpu ticks
            0 IRQ cpu ticks
       110102 softirq cpu ticks
            0 stolen cpu ticks
      3924612 pages paged in
     14092886 pages paged out
        25685 pages swapped in
       117208 pages swapped out
    480587807 interrupts
    670429635 CPU context switches
   1624539986 boot time
     14652200 forks
复制代码

4、查看磁盘的读/写

复制代码
(py3) [root@jumpserver-168-182-149 ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
sr0       18      0    2056     580      0      0       0       0      0      0
sda   119355   7888 7838620 5931106 1215186 204210 27261464 4283174      0   2143
dm-0  100059      0 7566702 5788365 1302162      0 26315487 4253256      0   1819
dm-1   25773      0  209888  193185 117208      0  937664 34797615      0    522
dm-2     148      0    2532     170      4      0    4096      96      0      0
sdb      194      0    8548     304    951  33592  930656     716      0      0
复制代码

注意:这些信息主要来自于/proc/diskstats.

merged:表示一次来自于合并的写/读请求,一般系统会把多个连接/邻近的读/写请求合并到一起来操作.

5、查看/dev/sda磁盘的读/写,注意磁盘需要是已分区的。

(py3) [root@jumpserver-168-182-149 ~]# vmstat -p /dev/sdb2
sdb2          reads   read sectors  writes    requested writes
                 100       6224          0          0

五、top命令详解

5.1、参数详解

top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。

top的使用方式 top [-d number] | top [-bnp]

参数解释:

复制代码
-d:number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。 
-b:以批次的方式执行top。
-n:与-b配合使用,表示需要进行几次top命令的输出结果。
-p:指定特定的pid进程号进行观察。 在top命令显示的页面还可以输入以下按键执行相应的功能(注意大小写区分的): ?:显示在top当中可以输入的命令
P:以CPU的使用资源排序显示
M:以内存的使用资源排序显示
N:以pid排序显示
T:由进程使用的时间累计排序显示
k:给某一个pid一个信号。可以用来杀死进程
r:给某个pid重新定制一个nice值(即优先级)
q:退出top(用ctrl+c也可以退出top)。
复制代码

5.2、top前5行统计信息

第1行:top - 05:43:27 up 4:52, 2 users, load average: 0.58, 0.41, 0.30 

第1行是任务队列信息,其参数如下:

内容含义
05:43:27 表示当前时间
up 4:52 系统运行时间 格式为时:分
2 users 当前登录用户数
load average: 0.58, 0.41, 0.30 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

load average: 如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。 

第2行:Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie 
第3行:%Cpu(s): 37.0 us, 3.7 sy, 0.0 ni, 59.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 

第2、3行为进程和CPU的信息 

注意:%Cpu(s)是系统所有用户进程占用整个CPU的平均值,由于每个核心占用的百分比不同,所以按平均值来算比较有参考意义。
当有多个CPU时,这些内容可能会超过两行,其参数如下:

内容含义
159 total 进程总数
1 running 正在运行的进程数
158 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
37.0 us 用户空间占用CPU百分比
3.7 sy 内核空间占用CPU百分比
0.0 ni 用户进程空间内改变过优先级的进程占用CPU百分比
59.3 id 空闲CPU百分比
0.0 wa 等待输入输出的CPU时间百分比
0.0 hi 硬中断(Hardware IRQ)占用CPU的百分比
0.0 si 软中断(Software Interrupts)占用CPU的百分比
0.0 st  
第4行:KiB Mem: 1530752 total, 1481968 used, 48784 free, 70988 buffers 
第5行:KiB Swap: 3905532 total, 267544 used, 3637988 free. 617312 cached Mem

第4、5行为内存信息 
其参数如下:

内容含义
KiB Mem: 1530752 total 物理内存总量
1481968 used 使用的物理内存总量
48784 free 空闲内存总量
70988 buffers(buff/cache) 用作内核缓存的内存量
KiB Swap: 3905532 total 交换区总量
267544 used 使用的交换区总量
3637988 free 空闲交换区总量
617312 cached Mem 缓冲的交换区总量。
3156100 avail Mem 代表可用于进程下一次分配的物理内存数量

上述最后提到的缓冲的交换区总量,这里解释一下,所谓缓冲的交换区总量,即内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。 

计算可用内存数有一个近似的公式: 

第四行的free + 第四行的buffers + 第五行的cached

5.3、进程信息

列名含义
PID 进程id
PPID 父进程id
RUSER Real user name
UID 进程所有者的用户id
USER 进程所有者的用户名
GROUP 进程所有者的组名
TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
PR 优先级
NI nice值。负值表示高优先级,正值表示低优先级
P 最后使用的CPU,仅在多CPU环境下有意义
%CPU 上次更新到现在的CPU时间占用百分比
TIME 进程使用的CPU时间总计,单位秒
TIME+ 进程使用的CPU时间总计,单位1/100秒
%MEM 进程使用的物理内存百分比
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SWAP 进程使用的虚拟内存中,被换出的大小,单位kb
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE 可执行代码占用的物理内存大小,单位kb
DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR 共享内存大小,单位kb
nFLT 页面错误次数
nDRT 最后一次写入到现在,被修改过的页面数。
S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
COMMAND 命令名/命令行
WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
Flags 任务标志

5.4、其它实用快捷键操作

默认进入top时,各进程是按照CPU的占用量来排序的。

1、在top基本视图中,按键盘数字“1”可以监控每个逻辑CPU的状况: 

 

 2、改变进程显示字段

在top基本视图中,敲击”f”进入另一个视图,在这里可以编辑基本视图中的显示字段:

 用上下键选择选项,按下空格键可以决定是否在基本视图中显示这个选项。

top命令是一个非常强大的功能,但是它监控的最小单位是进程,如果想监控更小单位时,就需要用到ps或者netstate命令来满足我们的要求。

~~~以上就是vmstat和top工具的讲解~~~

posted @ 2021-08-19 11:14  葛老头  阅读(556)  评论(0编辑  收藏  举报