Linux 查看系统状态

admin
admin 2019年11月11日
  • 在其它设备中阅读本文章

一、/proc 的意义及说明

在 Linux 中查看各种状态,其实质是查看内核中相关进程的数据结构中的项,通过工具将其格式化后输出出来。但是内核的数据是绝对不能随意查看或更改的,至少不能直接去修改。所以,在 linux 上出现了伪文件系统 /proc,它是内核中各属性或状态向外提供访问和修改的接口,记录了内核自己的数据信息,各进程独立的数据信息,统计信息等。绝大多数文件都是只读不可改的,即使对 root 也一样,但 /proc/sys 除外。
proc.png
在 /proc/ 目录下,其中数字命名的目录对应的是各进程的 pid 号,其内的文件记录的都是该进程当前的数据信息,且都是只读的,例如记录命令信息的 cmdline 文件,进程使用哪颗 cpu 信息 cpuset,进程占用内存的信息 mem 文件,进程 IO 信息 io 文件等其他各种信息文件。非数字命名的目录各有用途,例如 bus 表示总线信息,driver 表示驱动信息,fs 表示文件系统特殊信息,net 表示网络信息,tty 表示跟物理终端有关的信息,最特殊的两个是 /proc/self 和 /proc/sys。
proc691.png
先说 /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 来排序

top.png

  • 第 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 键即可获取帮助。
htop.png

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

vmstat.png
其中各列的意义如下:
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