进程管理
1、什么是进程
在 Linux 系统当中:触发任何一个事件,系统都会将他定义为一个进程,并且给予这个进程一个 ID,称为 PID,同时依据启发这个进程的用户与相关属性,给予这个 PID 一组有效的权限设定。
1.1、进程与程序
如上图所示,程序一般存储在实体磁盘中的,然后通过用户的执行来触发。触发后会加载到内存中成为一个个体,那就是进程。操作系统通过 PID 来管理进程。举例来说,我们要使用操作系统的时候,通常是利用联机程序或直接在主机前面登录,然后取得我们的 shell。那么,我们的 shell 是 bash,这个 bash 在 /bin/bash,那么同一个时间每个人登录都是执行 /bin/bash。不过,每个人取得的权限就是不同!如图:
总结如下:
- 程序:通常为 binary program,放置在存储媒体中,为实体文件存在;
- 进程:程序被触发后,执行者的权限与属性、程序的程序源代码与所需数据等都会被加载到内存中,操作系统并给予这个内存内的单元一个标识符(PID),可以说,进程就是一个正在运行的程序。
1.1.1、子进程与父进程
当我们登录系统后,会取得一个 bash 的 shell,然后,我们利用这个 bash 提供的接口去执行另一个指令,例如 /usr/bin/passwd 或是 touch 等,那么另外的指令也会被触发成为 PID,那个后来执行指令才产生的 PID 就是 “子进程”,而我们原本的 bash 环境下,就称为 “父进程”。
每个进程都有一个 PID,那某个进程的父进程该如何判断?通过 Parent PID(PPID)来判断即可。子进程可以继承父进程的环境变量。
#请在目前的 bash 环境下,再触发一次 bash,并以 ps -l 这个指令观察进程相关的输出信息
[root@li ~]# bash
[root@li ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1296 1290 0 80 0 - 28886 do_wai pts/0 00:00:00 bash #PID 为 1296
4 S 0 1396 1296 0 80 0 - 28886 do_wai pts/0 00:00:00 bash #PPID 为 1296
0 R 0 1431 1396 0 80 0 - 38337 - pts/0 00:00:00 ps
1.1.2、fork and exec:进程呼叫的流程
其实子进程与父进程之间的关系还是挺复杂的,最大的复杂点在于进程互相之间的呼叫。在 Linux 的进程呼叫通常称为 fork-and-exec 的流程!进程都会由父进程以复制的方式产生一个一模一样的子进程,然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。整个流程如下:
1.1.3、系统或网络服务
有些指令被触发后所产生的 PID 很快就结束了,比如:ls、touch、rm、cp 等。那有没有一直在执行的进程呢?当然有。比如说,系统会每分钟都去扫描 /etc/crontab 以及相关配置文件,那谁来负责工作安排呢?就是 crond 这个程序所管理的。我们将启动在背景中并一直持续不断地运作的进程,称为 “常驻内存中的进程”。
常驻在内存中的进程通常都是负责一些系统所提供的功能以及服务用户各项任务,因此这些常驻内存程序就会被我们称为:服务(daemon)。系统的服务非常多,不过主要大致分成系统本身所需要的服务,例如刚刚提到的 crond。还有一些负责网络联机的服务,例如 Apache、named 等等。这些网络服务启动后,还会启动一个端口,
1.2、Linux 的多人多任务环境
现在我们知道,其实 Linux 底下执行一个指令时,系统会将相关属性、权限、程序代码与数据等加载内存,并给予这个单元一个进程标识符(PID),最终该指令可以进行的任务则与这个 PID 的权限有关。根据这个说明,我们就可以简单的了解,为什么 Linux 这么多用户,但是为什么每个人都可以拥有自己的环境了吧。
1.2.1、多人环境
在 Linux 上面具有多种不同的账号,每种账号都具有其特殊的权限,只有一个人拥有至高无上的权限,那就是 root(系统管理员)。除了 root 之外,其他人都必须受到一些限制!而每个人进入 Linux 的环境设定都可以随着每个人的喜好来设定,就是 ~/.bashrc 文件。
1.2.2、多任务环境
其实就是操作系统的多道程序处理,即并发性。
在 Linux 中,默认提供了六个文字界面登录窗口,以及一个图形界面,你可以使用 [Alt]+[F1]…[F7] 进行切换。
2、工作管理(job control)
这个工作管理是用在 bash 环境下的,也就是说:当我们登录系统取得 bash shell 后,在单一终端接口下同时进行多个工作的行为管理。
2.1、什么是工作管理
进行工作管理的行为中,其实每个工作都是目前 bash 的子进程,即彼此之间是有相关性的。我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 bash。
既然我们可以在六个终端接口登录,那何必使用 job control 呢?不要忘记了,我们可以在 /etc/security/limits.conf 中限制使用者同时可以登录的联机数,在这样的情况下,某些使用者仅能登录一个终端窗口。由于假设我们只有一个终端接口,因此可以出现提示符让你操作的环境称为前景(foreground),至于其他工作就可以让你放入背景(background)去暂停或运作。要注意的是,放入背景的工作想要运作时,它必须不能够与使用者互动。
总之,要进行 bash 的 job control 必须要注意的限制是:
- 这些工作所触发的进行必须来自于你的 shell 的子进程(只管理自己的 bash);
- 前景:你可以控制与下达指令的这个环境称为前景的工作;
- 背景:可以自行运作的工作,你无法使用 [ctrl]+c 终止它,可使用 bg/fg 呼叫该工作;
- 背景中 “执行” 的进程不能等待 terminal/shell 的输入。
2.2、job control 的管理
2.2.1、直接将指令丢到背景中 “执行” 的 &
我想将 /etc 整个备份成为 /tmp/etc.tar.xz 且不想等待,可以这么做:
[root@li ~]# tar -Jpcf /tmp/etc.tar.xz /etc &
[1] 17200
[root@li ~]# tar: 从成员名中删除开头的“/”
#在空括号中的是工作代码,该号码与 bash 的控制有关
#后续的 17200 则是这个工作在系统中的 PID
#由于我们没有加上数据流重定向,所以会影响画面!不过不影响前景的操作
那丢到背景中的工作什么时候完成呢?当出现这样的画面时:
[1]+ 完成 tar -Jpcf /tmp/etc.tar.xz /etc
就代表 [1] 工作已经完成。此外,将工作丢到背景中要特别注意资料的流向。包括上面的信息导致我的前景工作受影响。虽然按下 [enter] 键就会出现提示符。最佳的解决方法就是利用数据流重定向,将输出的数据传送至某个文件中:
[root@li ~]# tar -Jpcf /tmp/etc.tar.xz /etc > /tmp/log.txt 2>&1 &
[1] 19773
2.2.2、将 “目前” 工作丢到背景中 “暂停”:[ctrl]+z
想个情况:如果我正在使用 vim,却发现我有个文件不知道放在哪,需要到 bash 环境下进行搜索,此时是否要结束 vim 呢?当然不需要,只要将 vim 给他暂时丢到背景中等待即可:
[root@li ~]# vim ~/.bashrc
#在 vim 的一般模式下,按下 [ctrl]+z
[2]+ 已停止 vim ~/.bashrc
#1 代表这是第一个工作,+ 代表的是最近一个被丢进背景的工作
2.2.3、观察目前背景工作状态:jobs
[root@li ~]# jobs [-lrs]
选项与参数:
-l:除了列出 job number 与指令串之外,同时列出 PID 号码
-r:仅列出正在背景 run 的工作
-s:仅列出正在背景 stop 的工作
[root@li ~]# jobs -l
[2]- 20743 停止 vim ~/.bashrc
[3]+ 21135 停止 find / -print
2.2.4、将背景工作拿到前景来工作:fg
[root@li ~]# fg %jobnumber #其中 % 可有可无
[root@li ~]# fg #预设拿出那个 + 的工作
[root@li ~]# fg %2 #vim ~/.bashrc,再次按下 [ctrl]+z
[root@li ~]# jobs -l
[2]+ 20743 停止 vim ~/.bashrc
2.2.5、让工作在背景下变成运行状态:bg
[root@li ~]# find / -perm /7000 > /tmp/text.txt
[3]+ 已停止 find / -perm /7000 > /tmp/text.txt
[root@li ~]# jobs ;bg %3 ;jobs
[2]- 已停止 vim ~/.bashrc
[3]+ 已停止 find / -perm /7000 > /tmp/text.txt
[3]+ find / -perm /7000 > /tmp/text.txt &
[2]+ 已停止 vim ~/.bashrc
[3]- 运行中 find / -perm /7000 > /tmp/text.txt &
2.2.6、管理背景中的工作:kill
如何将背景的工作直接移除?或者是将该工作重新启动呢?这时候就需要给予该工作一个信号:
[root@li ~]# kill -signal %jobnumber
[root@li ~]# kill -l
选项与参数:
-l:列出目前 kill 能够使用的信号
signal:代表给予后面接的那个工作什么样的指示
-1:重新读取配置文件(类似 reload)
-2:代表与由键盘输入 [ctrl]+c 同样的动作
-9:立刻强制删除一个工作
-15:以正常的进程方式终止一项工作
[root@li ~]# jobs
[2]+ 已停止 vim ~/.bashrc
[root@li ~]# kill -9 %2
[root@li ~]# jobs
[2]+ 已杀死 vim ~/.bashrc
[root@li ~]# jobs #为空,已被移除
3、进程管理
3.1、进程的观察
3.1.1、ps:将某个时间点的进程运作情况截取下来
[root@li ~]# ps aux #观察系统所有的进程数据
[root@li ~]# ps -lA #也是能够观察所有的系统的数据
[root@li ~]# ps axjf #连同部分进程树的状态
选项与参数:
-A:所有的 process 均显示出来,与 -e 具有同样的效用
-a:不与 terminal 有关的所有 process
-u:有效使用者相关的 process
x:通常与 a 这个参数一起使用,可列出交完整的信息
输出格式规划:
l:较长、较详细的将该 PID 的信息列出
j:工作的格式
-f:做一个更为完整的输出
3.1.1.1、近观察自己的 bash 相关进程:ps -l
[root@li ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1296 1290 0 80 0 - 28917 do_wai pts/0 00:00:00 bash
4 S 0 31369 1296 2 80 0 - 121138 ep_pol pts/0 00:00:00 yum
0 R 0 31608 1296 0 80 0 - 38337 - pts/0 00:00:00 ps
- F:代表这个进程旗帜(process flags),说明这个进程的总结权限,常见的号码有:
- 若为 4 表示此进程的权限为 root;
- 若为 1 表示此子进程仅进行复制而没有实际执行。
- S:代表这个进程的状态,主要的状态有:
- R:运行中;
- S:正在休眠状态,等待被唤醒;
- D:不可被唤醒的睡眠状态,通常可能这支程序可能在等待 I/O;
- T:停止状态,可能是在工作背景(背景暂停)或除错(traced)状态;
- Z(Zombie):僵尸状态,进程已经终止但却无法被移除内存。
- UID/PID/PPID:此进程的 UID、PID 和 PPID。
- C:代表 CPU 使用率。
- PRI/NI:Priority/Nice 的缩写,代表此进程被 CPU 所执行的优先级,数值越小代表该进程越快被 CPU 执行。
- AADR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该进程在内存的哪个部分,如果是 running 的进程,一般会显示 “-”/SZ 代表此进程用到多少内存/ WCHAN 表示目前进程是否运行中,同样的,若为 - 表示正在运行中。
- TTY:登陆者的终端机位置,若为远程连接则使用动态终端接口(pts/n)。
- TIME:使用掉的 CPU 时间,注意,是此进程实际花费的 CPU 运行时间,而不是系统时间。
- CMD:就是 command 的缩写,造成此进程的触发程序之指令为何。
3.1.1.2、观察系统所有的进程:ps aux
[root@li ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 46188 6512 ? Ss 08:37 0:01 /usr/lib/systemd/systemd --syste
root 2 0.0 0.0 0 0 ? S 08:37 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 08:37 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 08:37 0:00 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 08:37 0:00 [migration/0]
...
- USER:该 process 属于哪个使用者;
- PID:process 的 PID;
- %CPU:该 process 使用掉的 CPU 资源百分比;
- %MEM:该 process 使用掉的内存资源百分比;
- VSZ:该 process 使用掉的虚拟内存量(Kbytes);
- RSS:该 process 占用的固定内存量(Kbytes);
- TTY:该 process 是在哪个终端机上面运行的,若与终端机无关则显示 ?;若是 pts/0 等等,则是表示由网络连接;
- STAT:该进程的状态;
- START:该进程被触发启动的时间;
- TIME:该进程实际使用 CPU 运行的时间;
- COMMAND:该进程的实际指令为何。
[root@li ~]# ps -lA
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 11547 ep_pol ? 00:00:01 systemd
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd
1 S 0 4 2 0 60 -20 - 0 worker ? 00:00:00 kworker/0:0H
1 S 0 6 2 0 80 0 - 0 smpboo ? 00:00:00 ksoftirqd/0
...
#与 ps -l 的输出输出情况类似,但显示的是系统全部进程
[root@li ~]# ps axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
2 4 0 0 ? -1 S< 0 0:00 \_ [kworker/0:0H]
2 6 0 0 ? -1 S 0 0:00 \_ [ksoftirqd/0]
...
1 1019 1019 1019 ? -1 Ss 0 0:00 /usr/sbin/sshd -D
1019 1290 1290 1290 ? -1 Ss 0 0:06 \_ sshd: root@pts/0
1290 1296 1296 1296 pts/0 67678 Ss 0 0:00 | \_ -bash
1296 67678 67678 1296 pts/0 67678 R+ 0 0:00 | | \_ ps axjf
1290 1297 1297 1297 ? -1 Ss 0 0:05 | \_ bash -c while [ -d /proc/$PP
1297 67677 1297 1297 ? -1 S 0 0:00 | \_ sleep 1
1019 1294 1294 1294 ? -1 Ss 0 0:00 \_ sshd: root@notty
除此之外,我们必须知道的是 “僵尸进程” 是什么?通常,造成僵尸进程的原因是因为该进程应该已经执行完毕,或是因故应该要终止了,但是该进程的父进程却无法完整的将该进程结束掉,而造成那个进程一直存在在内存中。如果你发现某个进程的 CMD 后面还接上<defunct> 时,就代表该进程是僵尸进程。如果发现系统中很多的僵尸进程,要找出该进程的父进程,然后做个追踪,进行主机的环境优化。不要只是简单的 kill,否则可能一直产生!事实上,僵尸进程都已经无法控管了,而直接是交给 systemd 这支程序来负责了,偏偏 systemd 是系统第一支执行的程序,它是所有进程的父进程!我们无法杀掉它。所以,如果产生僵尸进程,而系统过一阵子还没有办法通过内核非经常性的特殊处理来将该进程删除时,那只能通过 reboot 的方式将该进程抹去了。
3.1.2、top:动态观察进程的变化
[root@li ~]# top [-d 数字] | top [-bnp]
选项与参数:
-d:后面接数字,就是整个进程画面更新的秒数
-b:以批次的方式执行 top,通常搭配数据流重定向来将批次的结果输出成文件
-n:与 -b 搭配,意义是,需要进行几次 top 的输出结果
-p:指定某些个 PID 来进行观察检测而已
在 top 执行过程中可以使用的按键指令:
?:显示在 top 当中可以输入的按键指令
P:以 CPU 的使用资源排序显示
M:以 Memory 的使用资源排序显示
N:以 PID 来排序显示
T:由该 process 使用的 CPU 时间累积排序
k:给予某个 PID 一个信号
r:给予某个 PID 一个信号
q:离开 top
[root@li ~]# top -d 2
top - 15:28:29 up 8 min, 1 user, load average: 0.00, 0.01, 0.01
Tasks: 100 total, 1 running, 99 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995680 total, 703164 free, 174444 used, 118072 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 686916 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1281 root 20 0 113416 1636 1336 S 0.7 0.2 0:00.36 bash
1 root 20 0 128000 6608 4132 S 0.0 0.7 0:00.86 systemd
...
top 的画面主要分为两个,上面的画面为整个系统的资源使用状态,基本上总共分为六行,显示的内容依次为:
- 第一行(top…):这一行显示的信息分别为:
- 目前的时间
- 开机到现在的时间
- 登录的用户数
- 系统在 1,5,15 分钟的平均工作负载
- 第二行(Tasks…):显示的是目前进程的总量与个别进程在什么状态
- 第三行(%Cpus…):显示的是 CPU 的整体负载。需要特别注意的是 wa 的项目,那个项目代表的是 I/O wait,通常你的系统变慢都是 I/O 产生的问题比较大
- 第四行与第五行:表示目前的物理内存与虚拟内存的使用情况
- 第六行:输入指令时,显示状态的地方
至于 top 下半部分的画面,则是每个 process 使用的资源情况。比较注意的是:
- PID
- USER
- PR:Priority 的简写,优先级,越小越早执行
- NI:Nice,与 Priority 有关,也是越小越早执行
- %CPU
- %MEM
- TIME+:CPU 的使用时间的累加
如果想把 top 的信息输出到文件:
#将 top 的信息进行 2 次,然后将结果输出到 /tmp/top.txt
[root@li ~]# top -b -n 2 > /tmp/top.txt
可以观察单一进程:
[root@li ~]# echo $$
1280 #bash 的 PID
[root@li ~]# top -d 2 -p 1280
top - 15:41:20 up 21 min, 1 user, load average: 0.00, 0.01, 0.01
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.5 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995680 total, 703160 free, 174316 used, 118204 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 686976 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1280 root 20 0 115668 2144 1672 S 0.0 0.2 0:00.03 bash
3.1.3、pstree
[root@li ~]# pstree [-A|U] [-up]
选项与参数:
-A:各进程之间的连接以 ASCII 字符来连接
-U:各进程之间的连接以万国码字符来连接
-p:并同时列出每个进程的 PID
-u:并同时列出每个进程的所属账号
3.2、进程管理
进程之间可以相互控制的!那进程之间是如何相互控制的呢?其实是通过给予进程一个信号去告诉进程你想让它做什么?因此这个信号就很重要了。主要的信号代号与名称对应内容是:
代号 | 名称 | 内容 |
---|---|---|
1 | SIGHUP | 启动被终止的进程,可让该 PID 重新读取自己的配置文件,类似重启 |
2 | SIGINT | 相当于键盘输入 [Ctrl]+c 来中止 |
9 | SIGKILL | 代表强制中断一个进程的执行,如果进程进行到一半,那么就会有 “半成品” 产生 |
15 | SIGTERM | 以正常的方式结束该进程 |
19 | SIGSTOP | 相当于键盘输入 [ctrl]+z 来暂停一个进程 |
那么如何传送一个信号给某个进程呢?那就通过 kill 和 killall。
3.2.1、kill -signal PID
需要强调的是:kill 后面直接加数字与加上 %number 是不一样的。单纯的数字是 PID,加上 % 则指的是工作管理。
3.2.2、killall -signal 指令名称
[root@li ~]# killall [-iIe] [指令名称]
选项与参数:
-i:交互式
-e:exact 的意思,表示 “后面接的 “指令名称” 要一致
-I:指令名称忽略大小写
[root@li ~]# yum install psmisc -y
[root@li ~]# killall -1 rsyslogd
4、系统资源的观察
4.1、观察内存使用情况
[root@li ~]# free [-b|-k|-m|-g|-h] [-t] [-s N -c N]
选项与参数:
-b|-k|-m|-g|-h:单位
-t:显示物理内存和 swap 的总量
-s:可以让系统每几秒输出一次,不间断的输出
-c:与 -s 同时处理,让 free 列出几次的意思
[root@li ~]# free -m
total used free shared buff/cache available
Mem: 972 172 555 7 244 656
Swap: 2047 0 2047
4.2、uname:查阅系统与内核相关信息
[root@li ~]# uname [-asrmpi]
选项与参数:
-a:所有系统参数,包括底下的参数都被列出来
-s:系统核心名称
-r:核心的版本
-m:本系统的硬件名称
-p:CPU 的类型
-i:硬件的平台
[root@li ~]# uname -a
Linux li.erver 3.10.0-1127.18.2.el7.x86_64 #1 SMP Sun Jul 26 15:27:06 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
4.3、uptime:观察系统启动时间与工作负载
[root@li ~]# uptime
16:12:24 up 52 min, 1 user, load average: 0.02, 0.02, 0.03
就是 top 指令其中的一行。
4.4、netstat:追踪网络或 socket 文件
[root@li ~]# netstat [-atunlp]
选项与参数:
-a:将目前系统上所有的联机、监听、socket 数据都列出来
-t:tcp 相关
-u:udp 相关
-n:不以进程的服务名称,以端口号列出
-l:列出目前正在监听的网路服务
-p:列出该网络服务的 PID
[root@li ~]# netstat
Active Internet connections (w/o servers) #与网络相关的部分
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 li.lan:ssh Li-911m.lan:52138 ESTABLISHED
tcp 0 64 li.lan:ssh Li-911m.lan:52136 ESTABLISHED
Active UNIX domain sockets (w/o servers) #与本机进程相关的部分
Proto RefCnt Flags Type State I-Node Path
unix 3 [ ] DGRAM 8992 /run/systemd/notify
unix 2 [ ] DGRAM 8994 /run/systemd/cgroups-agent
...
[root@li ~]# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1019/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1173/master
tcp6 0 0 :::22 :::* LISTEN 1019/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1173/master
udp 0 0 0.0.0.0:68 0.0.0.0:* 836/dhclient
4.5、dmesg:分析内核产生的信息
[root@li ~]# dmesg | more
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
...
[root@li ~]# dmesg | grep -i sda
[ 1.346843] sd 0:0:0:0: [sda] 41943040 512-byte logical blocks: (21.4 GB/20.0 GiB)
[ 1.346867] sd 0:0:0:0: [sda] Write Protect is off
[ 1.346869] sd 0:0:0:0: [sda] Mode Sense: 61 00 00 00
...
4.5、vmstat:侦测系统资源变化
vnstat 可以动态了解以下系统资源的运作。
[root@li ~]# vmstat [-a] [延迟 [总计侦测次数]] #CPU/内存等信息
[root@li ~]# vmstat [-fs] #内存相关
[root@li ~]# vmstat [-S 单位] #设定显示数据的单位
[root@li ~]# vmstat [-d] #与磁盘有关
[root@li ~]# vmstat [-p 分区] #与磁盘有关
选项与参数:
-a:使用 inactive/active 取代 buffer/cacahe 的内存输出信息
-f:开机到目前为止,系统复制的进程数
-s:将一些事件导致的内存变化情况列表说明
-S:让显示的数据有单位
-d:列出磁盘的读写总量计表
-p:后面列出分区,可显示该分区的读写总量统计表
#每秒 1 次,共计 3 次
[root@li ~]# 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
1 0 0 555784 2108 259376 0 0 61 6 49 115 0 1 99 0 0
0 0 0 555660 2108 259376 0 0 0 0 38 68 0 1 99 0 0
0 0 0 555784 2108 259376 0 0 0 0 43 71 0 1 99 0 0
上面各字段的意义:
-
进程字段的项目分别为:
-
r:等待运作中的进程数量;
-
b:不可被唤醒的进程数量;
这两个项目越多,说明系统越繁忙。
-
-
内存字段的项目分别为:
- swpd:虚拟内存被使用的容量;
- free:未被使用的内存容量;
- buff:用于缓冲存储器;
- cache:用于高速缓存;
-
内存置换空间的项目分别为:
- si:由磁盘中将进程取出的量;
- so:由于内存不足而将没用的进程写入到磁盘的 swap 的容量
如果 si/so 的数值太大,说明内存内的数据常常得在内存和磁盘之间相互传来传去,系统效能会很差。
-
磁盘读写的项目分别为:
- bi:由磁盘读入的区块数量;
- bo:写入到磁盘中去的区块数量;
如果这部分数值较高,代表系统的 I/O 非常忙碌!
-
系统的项目分别为:
- in:每秒被中断的进程数;
- cs:每秒进行的事件切换次数;
这两个数值越大,代表系统于接口设备的沟通非常频繁。
-
CPU 的项目分别为:
- us:非内核的 CPU 使用状态;
- sy:内核层所使用的 CPU 状态;
- id:闲置的状态;
- wa:等待 I/O 所消耗的 CPU 状态;
- st:被虚拟机所盗用的 CPU 使用状态;
[root@li ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 5052 5 502647 3004 1222 221 47312 566 0 2
sr0 18 0 2056 24 0 0 0 0 0 0
dm-0 4654 0 478350 2950 1433 0 43176 680 0 2
dm-1 88 0 4408 8 0 0 0 0 0 0