Linux 查看系统状态
一、/proc 的意义及说明
在 Linux 中查看各种状态,其实质是查看内核中相关进程的数据结构中的项,通过工具将其格式化后输出出来。但是内核的数据是绝对不能随意查看或更改的,至少不能直接去修改。所以,在 linux 上出现了伪文件系统 /proc,它是内核中各属性或状态向外提供访问和修改的接口,记录了内核自己的数据信息,各进程独立的数据信息,统计信息等。绝大多数文件都是只读不可改的,即使对 root 也一样,但 /proc/sys 除外。
在 /proc/ 目录下,其中数字命名的目录对应的是各进程的 pid 号,其内的文件记录的都是该进程当前的数据信息,且都是只读的,例如记录命令信息的 cmdline 文件,进程使用哪颗 cpu 信息 cpuset,进程占用内存的信息 mem 文件,进程 IO 信息 io 文件等其他各种信息文件。非数字命名的目录各有用途,例如 bus 表示总线信息,driver 表示驱动信息,fs 表示文件系统特殊信息,net 表示网络信息,tty 表示跟物理终端有关的信息,最特殊的两个是 /proc/self 和 /proc/sys。
先说 /proc/self 目录,它表示的是当前正在访问 /proc 目录的进程,因为 /proc 目录是内核数据向外记录的接口,所以当前访问 /proc 目录的进程表示的就是当前 cpu 正在执行的进程。如果执行 cat /proc/self/cmdline,会发现其结果总是该命令本身,因为 cat 是手动敲入的命令,它是重要性进程,cpu 会立即执行该命令。
再说 /proc/sys 这个目录,该目录是为管理员提供用来修改内核运行参数的,所以该目录中的文件对 root 都是可写的,例如管理数据包转发功能的 /proc/sys/net/ipv4/ip_forward 文件。使用 sysctl 命令修改内核运行参数,其本质也是修改 /proc/sys 目录中的文件。
二、查看进程信息
1、pstree 命令
pstree 命令将以树的形式显示进程信息,默认树的分支是收拢的,也不显示 pid,要显示这些信息需要指定对应的选项。
pstree [-a] [-c] [-h] [-l] [-p] [pid]
选项说明:
-a:显示进程的命令行
-c:展开分支
-h:高亮当前正在运行的进程及其父进程
-p:显示进程 pid,此选项也将展开分支
-l:允许显示长格式进程。默认在显示结果中超过 132 个字符时将截断后面的字符
$ pstree -h
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─crond
├─kdeinit5─┬─2*[file.so]
│ ├─kaccess───2*[{kaccess}]
│ ├─kded5───5*[{kded5}]
│ └─klauncher───2*[{klauncher}]
├─kwalletd5───2*[{kwalletd5}]
├─sddm─┬─Xorg───6*[{Xorg}]
│ ├─sddm-helper───startplasma-x11─┬─plasma_session───{plasma_session}
│ │ └─{startplasma-x11}
│ └─{sddm}
├─start_kdeinit
├─systemd─┬─(sd-pam)
│ ├─at-spi-bus-laun─┬─dbus-daemon
│ │ └─3*[{at-spi-bus-laun}]
│ ├─at-spi2-registr───2*[{at-spi2-registr}]
│ ├─dbus-daemon
│ ├─dconf-service───2*[{dconf-service}]
│ ├─gvfsd───2*[{gvfsd}]
│ ├─gvfsd-fuse───5*[{gvfsd-fuse}]
│ ├─kactivitymanage───5*[{kactivitymanage}]
│ ├─kglobalaccel5───2*[{kglobalaccel5}]
│ ├─kscreen_backend───2*[{kscreen_backend}]
│ ├─pipewire───{pipewire}
│ ├─pulseaudio─┬─gsettings-helpe───3*[{gsettings-helpe}]
│ │ └─{pulseaudio}
│ ├─spectacle───3*[{spectacle}]
│ ├─xdg-desktop-por───5*[{xdg-desktop-por}]
│ ├─xdg-desktop-por───3*[{xdg-desktop-por}]
│ ├─xdg-document-po───5*[{xdg-document-po}]
│ └─xdg-permission-───2*[{xdg-permission-}]
├─systemd-journal
├─systemd-logind
├─systemd-timesyn───{systemd-timesyn}
├─systemd-udevd
├─udisksd───4*[{udisksd}]
├─upowerd───2*[{upowerd}]
├─wpa_supplicant
└─xembedsniproxy───2*[{xembedsniproxy}]
2、ps 命令
ps 命令查看当前这一刻的进程信息,注意查看的是静态进程信息,要查看随时刷新的动态进程信息 (如 windows 的进程管理器那样,每秒刷新一次),使用 top 或 htop 命令。选项很多,其实只需知道一个用法 ps -aux 足以,选项 "a" 表示列出依赖于终端的进程,选项 "x" 表示列出不依赖于终端的进程,所以两者结合就表示列出所有进程,选项 "u" 表示展现的进程信息是以用户为导向的。
$ ps aux | head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 187744 10240 ? Ss 10:01 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S 10:01 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 10:01 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 10:01 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< 10:01 0:00 [kworker/0:0H-kblockd]
root 8 0.0 0.0 0 0 ? I< 10:01 0:00 [mm_percpu_wq]
root 9 0.0 0.0 0 0 ? S 10:01 0:00 [ksoftirqd/0]
root 10 0.0 0.0 0 0 ? I 10:01 0:02 [rcu_preempt]
root 11 0.0 0.0 0 0 ? S 10:01 0:00 [rcuc/0]
各列的意义:
- %CPU:表示 CPU 占用百分比,注意,CPU 的衡量方式是占用时间,而不是 cpu 工作强度的状态。
- %MEM:表示各进程所占物理内存百分比。
- VSZ:表示各进程占用的虚拟内存,也就是其在线性地址空间中实际占用的内存。单位为 kb。
- RSS:表示各进程占用的实际物理内存。单位为 Kb。
- TTY:表示属于哪个终端的进程,"?" 表示不依赖于终端的进程。
STAT:进程所处的状态。
- D:不可中断睡眠
- R:运行中或等待队列中的进程(running/runnable)
- S:可中断睡眠
- T:进程处于 stopped 状态
- Z:僵尸进程
- <:高优先级进程
- N:低优先级进程
- L:该进程在内存中有被锁定的页
- s:表示该进程是 session leader,即进程组的首进程。例如管道左边的进程,shell 脚本中的 shell 进程
- l:表示该进程是一个线程
- +:表示是前端进程。前端进程一般来说都是依赖于终端的
- START:表示进程是何时被创建的
- TIME:表示各进程占用的 CPU 时间
- COMMAND:表示进程的命令行。如果是内核线程,则使用方括号 "[]" 包围
另外常用的 ps 选项是 ps -elf。其中 "-e" 表示输出全部进程信息,"-f" 和 "-l" 分别表示全格式输出和长格式输出。全格式会输出 cmd 的全部参数。
$ ps -elf |head
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 46936 - 10:01 ? 00:00:01 /sbin/init
1 S root 2 0 0 80 0 - 0 - 10:01 ? 00:00:00 [kthreadd]
1 I root 3 2 0 60 -20 - 0 - 10:01 ? 00:00:00 [rcu_gp]
1 I root 4 2 0 60 -20 - 0 - 10:01 ? 00:00:00 [rcu_par_gp]
1 I root 6 2 0 60 -20 - 0 - 10:01 ? 00:00:00 [kworker/0:0H-kblockd]
1 I root 8 2 0 60 -20 - 0 - 10:01 ? 00:00:00 [mm_percpu_wq]
1 S root 9 2 0 80 0 - 0 - 10:01 ? 00:00:00 [ksoftirqd/0]
1 I root 10 2 0 58 - - 0 - 10:01 ? 00:00:06 [rcu_preempt]
1 S root 11 2 0 58 - - 0 - 10:01 ? 00:00:00 [rcuc/0]
各列的意义:
- F:程序的标志位。0 表示该程序只有普通权限,4 表示具有 root 超级管理员权限,1 表示该进程被创建的时候只进行了 fork,没有进行 exec
- S:进程的状态位,注意 ps 选项加了 "-" 的是非 BSD 风格选项,不会有 "s""<""N""+"等的状态标识位
- C:CPU 的百分比,衡量方式是占用时间
- PRI:进程的优先级,值越小,优先级越高,越早被调度类选中运行
- NI:进程的 NICE 值,值为 -20 到 19,影响优先级的方式是 PRI(new)=PRI(old)+NI,越小将导致进程优先级越高。
- :但要注意,NICE 值只能影响非实时进程。
- ADDR:进程在物理内存中哪个地方。
- SZ:进程占用的实际物理内存
- WCHAN:若进程处于睡眠状态,将显示其对应内核线程的名称,若进程为 R 状态,则显示"-"
3、uptime 命令
显示当前时间,已开机运行多少时间,当前有多少用户已登录系统,以及 3 个平均负载值。
$ uptime
15:16:52 up 1 day, 3:31, 6 users, load average: 2.95, 3.14, 3.15
所谓负载率 (load),即特定时间长度内,cpu 运行队列中的平均进程数(包括线程),一般平均每分钟每核的进程数小于 3 都认为正常,大于 5 时负载已经非常高。在 UNIX 系统中,运行队列包括 cpu 正在执行的进程和等待 cpu 的进程(即所谓的可运行 runable)。在 Linux 系统中,还包括不可中断睡眠态(IO 等待) 的进程。运行队列中每出现一个进程,load 就加 1,进程每退出运行队列,Load 就减 1。如果是多核 cpu,则还要除以核数。
例如,单核 cpu 上的负载值为 "1.73 0.60 7.98" 时,表示:
最近 1 分钟:1.73 表示平均可运行的进程数,这一分钟要一直不断地执行这 1.73 个进程。0.73 个进程等待该核 cpu。
最近 5 分钟:平均进程数还不足 1,表示该核 cpu 在过去 5 分钟空闲了 40% 的时间。
最近 15 分钟:7.98 表示平均可运行的进程数,这 15 分钟要一直不断地执行这 7.98 个进程。
结合前 5 分钟的结果,说明前 15- 前 10 分钟时间间隔内,该核 cpu 的负载非常高。
如果是多核 cpu,则还要将结果除以核数。例如 4 核时,某个最近一分钟的负载值为 3.73,则意味着有 3.73 个进程在运行队列中,这些进程可被调度至 4 核中的任何一个核上运行。最近 1 分钟的负载值为 1.6,表示这一分钟内每核 cpu 都空闲 (1-1.6/4)=60% 的时间。
所以,load 的理想值是正好等于 CPU 的核数,小于核数的时候表示 cpu 有空闲,超出核数的时候表示有进程在等待 cpu,即系统资源不足。
4、top、htop 以及 iftop 命令
top 命令查看动态进程状态,默认每 5 秒刷新一次。
top 选项说明:
-d:指定top刷新的时间间隔,默认是5 秒
-b:批处理模式,每次刷新分批显示
-n:指定top刷新几次就退出,可以配合-b使用
-p:指定监控的pid,指定方式为-pN1 -pN2 ...或-pN1, N2 [,...]
-u:指定要监控的用户的进程,可以是uid也可以是user_name
在 top 动态模式下,按下各种键可以进行不同操作。使用 "h" 或 "?" 可以查看相关键的说明。
- 1 :(数字一)表示是否要在 top 的头部显示出多个 cpu 信息
- H :表示是否要显示线程,默认不显示
- c,S : c 表示是否要展开进程的命令行,S 表示显示的 cpu 时间是否是累积模式,cpu 累积模式下已死去的子进程 cpu 时间会累积到父进程中
- x,y :x 高亮排序的列,y 表示高亮 running 进程
- u :仅显示指定用户的进程
- n or #:设置要显示最大的进程数量
- k :杀进程
- q :退出 top
- P :以 CPU 的使用资源排序显示
- M :以 Memory 的使用资源排序显示
- N :以 PID 来排序
- 第 1 行:和 w 命令的第一行一样,也和 uptime 命令的结果一样。此行各列分别表示 "当前时间"、"已开机时长"、"当前在线用户"、"前 1、5、15 分钟平均负载率"。
- 第 2 行:分别表示总进程数、running 状态的进程数、睡眠状态的进程数、停止状态进程数、僵尸进程数。
- 第 3 - 6 行:每颗 cpu 的状况。
- us = user mode
- sy = system mode
- ni = low priority user mode (nice)(用户空间中低优先级进程的 cpu 占用百分比)
- id = idle task
- wa = I/O waiting
- hi = servicing IRQs(不可中断睡眠,hard interruptible)
- si = servicing soft IRQs(可中断睡眠,soft interruptible)
- st = steal (time given to other DomU instances)(被偷走的 cpu 时间,一般被虚拟化软件偷走)
- 第 7 - 8 行:从字面意思理解即可。
- VIRT:虚拟内存总量
- RES:实际内存总量
- SHR:共享内存量
- TIME:进程占用的 cpu 时间(若开启了时间累积模式,则此处显示的是累积时间)
top 命令虽然非常强大,但是太老了。所以有了新生代的 top 命令 htop。htop 默认没有安装,需要手动安装。htop 可以使用鼠标完成点击选中。其他使用方法和 top 类似,使用 h 查看各按键意义即可。iftop 用于动态显示网络接口的数据流量。用法也很简单,按下 h 键即可获取帮助。
4、vmstat 命令
vmstat 是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入 / 输出状态等信息。
用法:
vmstat [options] [delay [count]]
选项:
-a, --active active/inactive memory
-f, --forks number of forks since boot
-m, --slabs slabinfo
-n, --one-header do not redisplay header
-s, --stats event counter statistics
-d, --disk disk statistics
-D, --disk-sum summarize disk statistics
-p, --partition <dev> partition specific statistics
-S, --unit <char> define display unit
-w, --wide wide output
-t, --timestamp show timestamp
其中各列的意义如下:
Procs
- r: 等待运行的进程数
- b: 不可中断睡眠的进程数
- w: 被交换出去的可运行的进程数
Memory - swpd: 虚拟内存使用总量
- free: 空闲内存量
- buff: buffer 占用的内存量 (buffer 用于缓冲)
- cache: cache 占用的内存量 (cache 用于缓存)
Swap - si: 从磁盘加载到 swap 分区的数据流量,单位为 "kb/s"
- so: 从 swap 分区写到磁盘的数据流量,单位为 "kb/s"
IO - bi: 从块设备接受到数据的速率,单位为 blocks/s
- bo: 发送数据到块设备的速率,单位为 blocks/s
System - in: 每秒中断数,包括时钟中断数量
- cs: 每秒上下文切换次数
CPU:统计的是 cpu 时间百分比,具体信息和 top 的 cpu 统计列一样 - us: CPU 使用时间
- sy: CPU 系统使用时间
- id: 闲置时间
5、iostat 命令
iostat 主要统计磁盘或分区的整体使用情况。也可以输出 cpu 信息,甚至是 NFS 网络文件系统的信息。同 vmstat/sar 一样,第一次统计的都是自系统开机起的平均统计信息。使用命令 iostat 需要安装 sysstat 包。
iostat [ -c ] [ -d ] [ -n -h ][ -k | -m ] [ -p [device][,...] ] [ interval [ count ] ]
选项说明:
-c:统计cpu信息
-d:统计磁盘信息
-n:统计NFS文件系统信息
-h:使NFS统计信息更人类可读化
-k:指定以kb/s为单位显示
-m:指定以mb/s为单位显示
-p:指定要统计的设备名称
-y:指定不显示第一次统计信息,即不显示自开机起的统计信息。
interval:刷新时间间隔
count:总统计次数
$ iostat
Linux 5.2.21-1-MANJARO (kdkj2-pc) 2019年11月12日 _x86_64_ (6 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
30.16 0.00 3.06 1.58 0.00 65.20
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
sda 501.05 9754.67 8651.71 0.00 1012752945 898240888 0
各列的意义都很清晰,从字面即可理解。
- tps:每秒 transfer 速率 (transfers per second), 一次对物理设备的 IO 请求为一个 transfer,但多个逻辑请求可能只组成一个 transfer
- Blk_read/s:每秒读取的 block 数量
- Blk_wrtn/s:每秒写入的 block 总数
- Blk_read:读取的总 block 数量
- Blk_wrtn:写入的总 block 数量
6、sar 命令
sar 是一个非常强大的性能分析工具,它可以获取系统的 cpu/ 等待队列 / 磁盘 IO/ 内存 / 网络等性能指标。功能多的必然结果是选项多,应用复杂,但只要知道一些常用的选项足以。
sar [options] [-o filename] [delay [count] ]
选项说明:
-A:显示系统所有资源运行状况
-b:显示磁盘IO和tranfer速率信息,和iostat的信息一样,是总体IO统计信息
-d:显示磁盘在刷新时间间隔内的活跃情况,可以指定一个或多个设备,和-b不同的是,它显示的是单设备的IO、transfer信息。
:建议配合-p使用显示友好的设备名,否则默认显示带主次设备号的设备名
-P:显示指定的某颗或某几颗cpu的使用情况。指定方式为,-P 0,1,2,3或ALL。
-u:显示每颗cpu整体平均使用情况。-u和-P的区别通过下面的示例很容易区分。
-r:显示内存在刷新时间间隔内的使用情况
-n:显示网络运行状态。后可接DEV/NFS/NFSD/ALL等多种参数。
:DEV表示显示网路接口信息,NFS和NFSD分别表示显示NFS客户端服务端的流量信息,ALL表示显示所有信息。
-q:显示等待队列大小
-o filename:将结果存入到文件中
delay:状态刷新时间间隔
count:总共刷新几次
7、free 命令
free 用于查看内存使用情况。
free [options]
选项说明:
-h:人类可读方式显式单位
-m:以MB为显示单位
-w:宽版输出,将缓冲和缓存分开单独显示
-s:动态查看内存信息时的刷新时间间隔
-c:一共要刷新多少次退出free
$ free -h
总计 已用 空闲 共享 缓冲/缓存 可用
内存: 15Gi 9.5Gi 605Mi 132Mi 5.4Gi 6.1Gi
交换: 15Gi 350Mi 15Gi