1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com
  1. Linux 性能调优系列(一) 建立科学的性能分析思路
  2. Linux 性能调优系列(二) 掌握基础性能监控命令
  3. Linux 性能调优系列(三) sysstat实现性能数据持久采集
  4. Linux 性能调优系列(四) 别只会用 sysstat,PCP 才是 Linux 性能监控的进阶玩法
  5. Linux 性能调优系列(五) 给你的服务器做一次全面体检
  6. Linux 性能调优系列(六) 想调内核参数?先搞懂 /proc、sysctl 和 sysfs
  7. Linux 性能调优系列(七) 还在手动改 sysctl?TuneD 智能性能调优实战来了
  8. Linux 性能调优系列(八) 进程太能吃资源怎么办?用 ulimit 和 systemd 给它加个"上限"
  9. Linux 性能调优系列(九) cgroup v2实战:防止一个烂进程干崩整台服务器
  10. Linux 性能调优系列(十) CPU 100% 到底是谁在忙?用 perf 把"元凶"揪出来
  11. Linux 性能调优系列(十一) 程序为什么卡住了?strace 和 ltrace 带你找到答案
  12. Linux 性能调优系列(十二) 服务器又卡了?SystemTap 带你杀到内核看看为啥
  13. Linux 性能调优系列(十三) 从 SystemTap 到 eBPF,Linux 性能追踪进入新时代
  14. Linux 性能调优系列(十四) CPU 这么忙,到底是谁决定“让谁先跑”?一文搞懂 Linux 调度器
  15. Linux 性能调优系列(十五) CPU 到底该先给谁?搞懂 Linux 实时调度
  16. Linux 性能调优系列(十六) Linux CPU 隔离实战,为什么实时线程绑核后延迟还会抖?
  17. Linux 性能调优系列(十七) CPU 占用不高却跑的慢?深挖 CPU 缓存性能瓶颈
  18. Linux 性能调优系列(十八) 程序申请了1GB内存,为什么系统却说它没用?
  19. Linux 性能调优系列(十九) 服务器硬盘慢得像蜗牛?先别急着换硬盘,这四招先把瓶颈找出来
  20. Linux 性能调优系列(二十) 磁盘 I/O 调度器怎么选?一文搞懂 mq-deadline、kyber、bfq 和 none
  21. Linux 性能调优系列(二十一) 磁盘为什么慢?从文件系统到 I/O 调优,一次讲透
  22. Linux 性能调优系列(二十二) Linux 网络调优别乱改 sysctl!先找瓶颈再调 TCP 缓冲区
  23. Linux 性能调优系列(二十三) MTU 从 1500 到 9000,巨帧真的能提升性能吗?
  24. Linux 性能调优系列(二十四) 从 CPU 省电到网卡卸载,聊聊 Linux 网络调优
  25. Linux 性能调优系列(二十五) 聊聊VirtIO、TuneD、virtio-mem 调优

这是 Linux性能调优系列第二篇。上一篇我们讲完性能调优基础理论,学会了USE分析法的排查思路。

思路有了,那用什么工具拿到服务器真实指标呢?这一篇就来讲系统自带的基础监控命令。不需要装任何额外软件,系统开箱即用,线上排错天天都会敲。

做系统监控,说白了就是收集系统各项数据,看看CPU、内存、磁盘、网络这些资源现在跑的怎么样。一方面帮我们排查线上故障,另一方面验证我们的调优改动到底有没有生效。

很多人不知道,Linux内核里面维护了一大堆内核计数器。每当发生磁盘读写、进程系统调用、中断这些事件的时候,对应的计数器数值就会往上加。我们用的ps、top这些命令,本质就是读取内核的这些计数器,整理成人类看得懂的输出。大部分统计信息普通普通用户就可以查看,不需要root权限。

进程监控工具 ps

💡重点:ps拿到的是执行命令那一瞬间的静态快照,执行完就退出,不会自动刷新。

玩 Linux 的 ps 命令的时候,你会发现网上有两类写法:一类参数不带短横杠 -,一类参数带短横杠 -,这分别对应 BSD 风格与 POSIX 标准风格。

  1. BSD 风格(无横杠,来自BSD Unix)
    代表命令:ps aux
  • 参数前面不加 -,比如 aux,而不是 -aux
  • 源自 BSD 版本的 Unix,是运维圈子流传最广、教程最常见的写法
  • 输出格式偏向人性化,列布局适合日常人工阅读
  1. POSIX 标准风格(带横杠,IEEE标准)
    代表命令:ps -ef
  • 参数前面必须带上短横杠 -,符合 POSIX 可移植标准
  • 属于统一Unix规范,不同Unix/Linux之间兼容性更好,适合写shell脚本
  • -e 显示全部进程、-f完整格式、-o自定义字段,都是POSIX标准参数

查看服务器全部进程

BSD风格,运维最常用:

1
ps aux
  • a:展示所有用户的进程
  • u:输出更友好的用户可读格式
  • x:把没有绑定终端的后台守护进程也打印出来

执行出来你会看到很多进程的TTY那一列是问号?,这就代表这个进程是后台服务,没有登录终端,比如systemd、sshd这类守护进程。

输出看看:

1
2
3
4
5
6

[root@localhost ~]# ps aux | more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 17:06 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 17:06 0:00 [pool_workqueue_release]
root 4 0.0 0.0 0 0 ? I< 17:06 0:00 [kworker/R-rcu_gp]

ps输出关键字段解释

1
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
  • USER:运行进程的用户名
  • PID:进程ID,杀进程、调优先级全靠它
  • %CPU:⚠️注意!这个是进程整个生命周期的CPU平均使用率,不是此刻瞬间CPU占用!想看瞬时CPU不要看ps,要用top
  • %MEM:该进程RSS占整机物理内存的百分比
  • VSZ:虚拟内存大小(KB),对应top里面的VIRT
  • RSS:常驻集大小,进程实际占的物理内存,单位KB,不包含交换出去的内存
  • TTY:关联终端,?代表后台守护进程
  • STAT:进程状态码(R/S/T/I等)
  • START:进程启动时间
  • TIME:进程从启动到现在累计消耗的CPU总时间,看的是历史总的工作量,不是瞬时占用
  • COMMAND:执行的完整命令

POSIX标准写法:

1
ps -ef
  • -e:列出系统里面每一个进程
  • -f:完整格式输出,会多出PPID父进程ID

输出看看:

1
2
3
4
5
6
7
[root@localhost ~]# ps -ef | more
UID PID PPID C STIME TTY TIME CMD
root 2 0 0 17:06 ? 00:00:00 [kthreadd]
root 3 2 0 17:06 ? 00:00:00 [pool_workqueue_release]
root 4 2 0 17:06 ? 00:00:00 [kworker/R-rcu_gp]
root 5 2 0 17:06 ? 00:00:00 [kworker/R-sync_wq]
root 6 2 0 17:06 ? 00:00:00 [kworker/R-kvfree_rcu_reclaim]
字段说明
UID进程运行的用户ID,root代表root用户
PID进程ID,操作进程的唯一标识
PPID父进程ID,这个进程由哪个进程创建。追查进程父子、僵尸进程就看这一列
CCPU 调度利用率计数,范围 0‑99,数值越高代表进程近期消耗 CPU 越多。⚠️不是 CPU 百分比,是历史加权统计,内核线程大多显示 0;现在排查性能一般不依赖此字段,优先使用 top 看瞬时占用。
STIME进程启动的时间;如果跨天会显示日期
TTY进程关联终端;?代表无终端,后台守护进程
TIME进程累计占用CPU总时间,是历史累加值,不是瞬时CPU使用率
CMD启动进程的命令,内核线程会用方括号 [] 包裹

✨小实战:当你要追查僵尸进程、看进程父子继承关系的时候,就用ps -ef,通过PPID可以看到是谁拉起的这个进程。

只想看某一类进程

比如我只想看sshd相关进程,直接用‑C参数,按程序名字过滤:

1
2
3
[root@localhost ~]# ps -C sshd
PID TTY TIME CMD
1016 ? 00:00:00 sshd

如果你手上已经知道程序名,先用pidof抓PID,再传给ps查看详情:

1
2
3
4
[root@localhost ~]# ps -p $(pidof sshd)
PID TTY TIME CMD
1016 ? 00:00:00 sshd

自定义输出列,按资源排序

线上经常要找吃内存最多的进程,我们可以自己指定输出哪些列,再做排序。

示例:只打印PID、内存占比、执行命令,按照内存从大到小排序,取前10行

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# ps axo pid,pmem,cmd --sort -pmem | head
PID %MEM CMD
966 0.5 /usr/bin/python3 -sP /usr/sbin/firewalld --nofork --nopid
1 0.4 /usr/lib/systemd/systemd --switched-root --system --deserialize=51
1006 0.2 /usr/sbin/NetworkManager --no-daemon
1101 0.1 /usr/lib/systemd/systemd --user
879 0.1 /usr/lib/systemd/systemd-udevd
1098 0.1 sshd-session: root [priv]
1094 0.1 sshd-session: root [priv]
969 0.1 /usr/lib/systemd/systemd-logind
835 0.1 /usr/lib/systemd/systemd-journald

POSIX等价写法:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# ps -eo pid,pmem,cmd --sort -pmem | head
PID %MEM CMD
966 0.5 /usr/bin/python3 -sP /usr/sbin/firewalld --nofork --nopid
1 0.4 /usr/lib/systemd/systemd --switched-root --system --deserialize=51
1006 0.2 /usr/sbin/NetworkManager --no-daemon
1101 0.1 /usr/lib/systemd/systemd --user
879 0.1 /usr/lib/systemd/systemd-udevd
1098 0.1 sshd-session: root [priv]
1094 0.1 sshd-session: root [priv]
969 0.1 /usr/lib/systemd/systemd-logind
835 0.1 /usr/lib/systemd/systemd-journald
  • -o:自定义要展示的字段
  • --sort -pmem:按内存占比降序,减号代表降序

长格式查看,看进程状态、nice优先级:

1
2
3
4
[root@localhost ~]# ps -ly -C sshd
S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD
S 0 1016 1 0 80 0 6276 2198 poll_s ? 00:00:00 sshd

字段说明
S进程状态码。S代表可中断睡眠;R运行;T停止;I空闲内核线程
UID运行该进程的用户ID,0代表root用户
PID进程ID
PPID父进程ID,由哪个进程创建当前进程
CCPU调度利用率计数(0‑99),数值越高近期CPU消耗越多;不是百分比,历史加权统计,性能排查基本不看此字段
PRI进程调度优先级,由系统内核自动计算;数值越小优先级越高
NInice友好值,用户可手动调整,范围‑20 ~ 19;值越小越容易拿到CPU时间,会间接影响PRI
RSS常驻内存大小,单位KB,进程实际占用物理内存
SZ虚拟内存大小,单位KB,进程全部虚拟地址空间大小
WCHAN进程当前正在等待的内核函数;poll_s代表进程正在poll休眠等待事件;不为空说明进程处于睡眠状态
TTY绑定终端;?表示无终端,后台守护进程
TIME进程累计消耗CPU总时间,历史累加,非瞬时CPU占用
CMD进程对应的程序命令

💡实战小提示:

  1. -l 开启长格式,展示调度相关信息;‑y 选项会不显示高级标志字段,让RSS直接以KB展示,可读性更好。
  2. WCHAN列非常适合看进程卡在哪个内核行为上,如果这个字段为空,代表进程此刻正在CPU上运行(R状态)。

实时进程监控 top

ps是拍一张照片,top相当于实时录像,会持续刷新屏幕,观察资源的动态变化,是运维人手必备工具。

直接敲命令进入交互界面:

1
2
3
4
5
6
7
8
top - 17:25:41 up 19 min,  2 users,  load average: 0.06, 0.02, 0.00
Tasks: 241 total, 1 running, 240 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.1 hi, 0.1 si, 0.0 st
MiB Mem : 7903.1 total, 7464.2 free, 514.4 used, 123.8 buff/cache
MiB Swap: 8032.0 total, 8032.0 free, 0.0 used. 7388.7 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1248 root 20 0 231632 5608 3428 R 0.3 0.1 0:00.01 top

top表头解释

我们分两块来看,第一块是表头

行号输出内容说明
第1行top - 17:25:41 up 19 min, 2 users, load average: 0.06, 0.02, 0.00系统时间:17:25:41;已开机运行19分钟;登录2个用户; load average:1分钟、5分钟、15分钟系统平均负载
第2行Tasks: 241 total, 1 running, 240 sleeping, 0 stopped, 0 zombie进程统计:总共241个进程,1个正在运行,240个睡眠,0个停止,0个僵尸进程
第3行%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.1 hi, 0.1 si, 0.0 stCPU整体占比: us 用户态;sy内核态;ninice调整进程;id空闲; wa等待IO;hi硬件中断;si软件中断;st虚拟化被宿主机偷走CPU时间
第4行MiB Mem : 7903.1 total, 7464.2 free, 514.4 used, 123.8 buff/cache物理内存,单位MiB:总内存、空闲内存、已使用内存、缓冲区/缓存内存
第5行MiB Swap: 8032.0 total, 8032.0 free, 0.0 used. 7388.7 avail Mem交换分区;avail Mem真正可分配给应用的可用内存,判断内存压力核心指标

第二块来解释一下下面的表头含义

字段说明
PID进程ID
USER运行进程的用户名
PR内核计算的调度优先级,数值越小优先级越高
NInice值,用户可修改,范围‑20~19,越小越优先获取CPU
VIRT虚拟内存(KB),包含物理内存、共享库、交换页,进程全部地址空间
RES常驻物理内存(KB),进程实际占用RAM,不含交换出去的内存
SHR共享内存(KB),可被多个进程共享;进程独占内存≈RES‑SHR
S进程状态:R运行、S可中断睡眠、D不可中断睡眠、T停止、I空闲内核线程
%CPU本次刷新间隔内瞬时CPU占用,按单个CPU核心百分比统计,排查CPU热点主要看这里
%MEM该进程占整机物理内存的百分比
TIME+进程累计CPU时间,精度到百分之一秒,进程从启动到现在总共消耗CPU时长
COMMAND启动该进程的程序命令

💡实战小提示:

  1. 按下 1 可以展开,查看每一颗CPU核心单独的使用率;
  2. %CPU可以超过100%,代表进程在使用多个CPU核心。

很多写脚本的时候需要拿top的输出数据,不要直接交互式跑,用批处理模式。
-b 批处理输出,‑n 1代表只采样一次就退出,输出快照,适合管道、脚本处理。

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# top -b -n 1 | more
top - 17:29:50 up 23 min, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 243 total, 1 running, 242 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7903.1 total, 7466.7 free, 511.7 used, 124.1 buff/cache
MiB Swap: 8032.0 total, 8032.0 free, 0.0 used. 7391.4 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 43568 35252 10332 S 0.0 0.4 0:01.36 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd

top高频实战快捷键

按键实战用途
1把总的CPU展开,显示每一个逻辑核单独使用率,排查单核心打满特别好用
Shift+P按CPU使用率降序,默认排序
Shift+M切换成按内存使用率降序,瞬间找出吃内存大户
Shift+H显示线程,很多Java程序排查要打开看线程数量
S修改刷新间隔,比如输入0.5就是半秒刷新一次,默认3秒
K输入PID,直接给进程发信号,可以杀死异常进程
R输入PID,修改进程nice优先级
Shift+W把你当前top的显示配置保存,下次打开top直接沿用你的设置
F自定义屏幕上显示哪些列,还可以指定用哪一列做排序依据
Q退出top

内存状态监控 free

free命令用来查看整机物理内存和交换分区的整体概况。

🚨新手最大的坑:很多人看到free那一列数字很小就慌,以为内存爆了,其实完全不是!
Linux会把空闲内存拿来做磁盘缓存,加速读写。判断内存够不够,一定要看available这一列,不要看free!

1
2
3
4
5
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 7.7Gi 511Mi 7.3Gi 9.0Mi 124Mi 7.2Gi
Swap: 7.8Gi 0B 7.8Gi

字段说明
total总内存/总交换空间大小,整机硬件配置的总容量
used已经被程序、内核占用的内存;包含进程内存、共享内存、buff/cache缓存
free完全空闲、还没有被任何程序/缓存占用的裸内存。 ⚠️不要以此判断内存不足,Linux会主动拿空闲内存做缓存,free很小属于正常现象。
shared多个进程之间共享使用的内存大小,比如共享库、tmpfs临时文件系统占用内存
buff/cache缓冲区 + 页缓存总和。内核用来加速磁盘读写;当应用需要内存的时候,内核可以快速回收这部分内存给业务使用。
available✅判断内存压力最重要指标。估算可以分配给新进程的内存总量,包含free,加上可以回收的buff/cache。看内存够不够优先看这一列,不要看free。

💡实战小提示

  1. Mem行代表物理内存RAM;Swap行代表交换分区。
  2. Swap的used数值持续上涨,代表物理内存不足,系统开始使用交换,性能会下降。
  3. -h 输出是二进制单位 Gi/Mi;如果使用 -H 参数,则为厂商十进制 GB/MB。

如果你想持续盯着内存变化,每秒刷新一次:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 7.7Gi 511Mi 7.3Gi 9.0Mi 124Mi 7.2Gi
Swap: 7.8Gi 0B 7.8Gi
[root@localhost ~]# free -h -s 1
total used free shared buff/cache available
Mem: 7.7Gi 511Mi 7.3Gi 9.0Mi 124Mi 7.2Gi
Swap: 7.8Gi 0B 7.8Gi

total used free shared buff/cache available
Mem: 7.7Gi 511Mi 7.3Gi 9.0Mi 124Mi 7.2Gi
Swap: 7.8Gi 0B 7.8Gi

total used free shared buff/cache available
Mem: 7.7Gi 511Mi 7.3Gi 9.0Mi 124Mi 7.2Gi
Swap: 7.8Gi 0B 7.8Gi

按Ctrl+C结束。

vmstat:一站式综合系统状态统计

vmstat 属于procps‑ng工具集,一条命令同时输出内存、swap、磁盘IO、中断、上下文切换、CPU状态。

⚠️非常重要:输出的第一行数据,是服务器开机到现在全部的平均值,不是当前实时状态!分析实时数据请忽略第一行,看后面采样输出。

语法:vmstat [选项] 采样间隔秒数 采样次数

示例:每1秒输出一次,一共输出3次,内存单位使用MiB

1
2
3
4
5
6
7
[root@localhost ~]# vmstat -S M 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 gu
0 0 0 7466 4 120 0 0 65 5 115 0 0 0 100 0 0 0
0 0 0 7466 4 120 0 0 0 0 230 134 0 0 100 0 0 0
0 0 0 7466 4 120 0 0 0 0 174 102 0 0 100 0 0 0

vmstat 输出表头字段详解

分类字段说明
procsr等待CPU调度运行的进程数量。数值持续偏高,代表CPU资源紧张,进程在排队
b处于不可中断睡眠状态的进程数,大多是在等待磁盘IO;数值高代表IO阻塞严重
memoryswpd已经写入交换分区的内存大小(MiB)。数值持续上涨,说明物理内存不足,发生内存换出
free完全空闲物理内存大小
buff用作块设备缓冲区的内存,存放块设备原始块数据
cache页缓存内存,文件系统缓存,加速文件读写,内存紧张时内核可以回收
swapsi每秒从swap换入内存的页数。从交换分区读回物理内存
so每秒向swap换出内存的页数。物理内存不足时,把内存页写到交换分区。si/so持续不为0代表内存压力大
iobi每秒从块设备读取的块数量(读磁盘)
bo每秒向块设备写入的块数量(写磁盘)
systemin每秒硬件中断次数,硬件设备向内核发起中断请求
cs每秒上下文切换次数。进程之间切换CPU,数值很高代表系统频繁切换进程,会带来性能损耗
cpuus用户态CPU占比,业务应用程序消耗CPU时间百分比
sy内核态CPU占比,内核、系统调用消耗CPU时间百分比
idCPU空闲时间百分比
waIO等待CPU占比,CPU空闲但是进程卡在等待磁盘IO;wa高代表磁盘IO瓶颈
st被虚拟化宿主机偷走的CPU时间,云虚拟机才会出现该指标
gu运行KVM客户机代码占用CPU时间,KVM宿主机才会看到数值

💡实战小提示

  1. vmstat 默认单位是KiB,加上 -S M 才会切换成MiB,看示例里数字 7466 就是7466MiB内存;
  2. 重点观察:r、b 判断CPU/IO排队;si so 判断内存压力;wa 判断磁盘IO瓶颈;cs 观察上下文切换。

文件系统与磁盘空间工具

线上磁盘占满会直接导致业务报错,甚至服务起不来,下面几个命令日常高频使用。

lsblk:看磁盘、分区的树状结构

想知道服务器有几块盘,分区、挂载点对应关系,用lsblk。

1
2
3
4
5
6
7
8
9
[root@localhost ~]# lsblk -p
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
/dev/sr0 11:0 1 1024M 0 rom
/dev/nvme0n1 259:0 0 500G 0 disk
├─/dev/nvme0n1p1 259:1 0 1M 0 part
├─/dev/nvme0n1p2 259:2 0 2G 0 part /boot
└─/dev/nvme0n1p3 259:3 0 498G 0 part
├─/dev/mapper/rlm-root 253:0 0 490.2G 0 lvm /
└─/dev/mapper/rlm-swap 253:1 0 7.8G 0 lvm [SWAP]

‑p打印设备完整绝对路径,加上‑f还可以打印文件系统UUID、文件系统类型。

findmnt:查看挂载详细信息

查看全部挂载点,文件系统类型、挂载参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@localhost ~]# findmnt
TARGET SOURCE FSTYPE OPTIONS
/ /dev/mapper/rlm-root xfs rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota
├─/dev devtmpfs devtmpfs rw,nosuid,seclabel,size=4022600k,nr_inodes=1005650,mode=755,inode64
│ ├─/dev/mqueue mqueue mqueue rw,nosuid,nodev,noexec,relatime,seclabel
│ ├─/dev/hugepages hugetlbfs hugetlbfs rw,nosuid,nodev,relatime,seclabel,pagesize=2M
│ ├─/dev/shm tmpfs tmpfs rw,nosuid,nodev,seclabel,inode64
│ └─/dev/pts devpts devpts rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000
├─/sys sysfs sysfs rw,nosuid,nodev,noexec,relatime,seclabel
│ ├─/sys/fs/selinux selinuxfs selinuxfs rw,nosuid,noexec,relatime
│ ├─/sys/kernel/debug debugfs debugfs rw,nosuid,nodev,noexec,relatime,seclabel
│ ├─/sys/kernel/tracing tracefs tracefs rw,nosuid,nodev,noexec,relatime,seclabel
│ ├─/sys/fs/fuse/connections fusectl fusectl rw,nosuid,nodev,noexec,relatime
│ ├─/sys/kernel/security securityfs securityfs rw,nosuid,nodev,noexec,relatime
│ ├─/sys/fs/cgroup cgroup2 cgroup2 rw,nosuid,nodev,noexec,relatime,seclabel,nsdelegate,memory_recursiveprot
│ ├─/sys/fs/pstore pstore pstore rw,nosuid,nodev,noexec,relatime,seclabel
│ ├─/sys/fs/bpf bpf bpf rw,nosuid,nodev,noexec,relatime,mode=700
│ └─/sys/kernel/config configfs configfs rw,nosuid,nodev,noexec,relatime
├─/proc proc proc rw,nosuid,nodev,noexec,relatime
│ └─/proc/sys/fs/binfmt_misc systemd-1 autofs rw,relatime,fd=35,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=9898
├─/run tmpfs tmpfs rw,nosuid,nodev,seclabel,size=1618556k,nr_inodes=819200,mode=755,inode64
│ ├─/run/credentials/systemd-journald.service tmpfs tmpfs ro,nosuid,nodev,noexec,relatime,nosymfollow,seclabel,size=1024k,nr_inodes=1024,mode=700,inode64,noswap
│ ├─/run/user/0 tmpfs tmpfs rw,nosuid,nodev,relatime,seclabel,size=809276k,nr_inodes=202319,mode=700,inode64
│ └─/run/credentials/getty@tty1.service tmpfs tmpfs ro,nosuid,nodev,noexec,relatime,nosymfollow,seclabel,size=1024k,nr_inodes=1024,mode=700,inode64,noswap
└─/boot /dev/nvme0n1p2 xfs rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota

太多了,只想看某一块设备:

1
2
3
[root@localhost ~]# findmnt /dev/nvme0n1p2
TARGET SOURCE FSTYPE OPTIONS
/boot /dev/nvme0n1p2 xfs rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota

‑s选项,直接读取/etc/fstab里面的挂载配置。

1
2
3
4
5
[root@localhost ~]# findmnt -s
TARGET SOURCE FSTYPE OPTIONS
/ UUID=e2eff4cd-de99-441c-a140-6738f64cc54a xfs defaults
/boot UUID=09609eb1-497e-42af-88be-255b5b5dbc30 xfs defaults
none UUID=66bf8ede-b5a0-4338-994d-56e7f216dde9 swap defaults

df:查看各个挂载盘占用空间

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/rlm-root xfs 490G 11G 480G 3% /
devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 1.6G 9.1M 1.6G 1% /run
tmpfs tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service
/dev/nvme0n1p2 xfs 2.0G 239M 1.8G 13% /boot
tmpfs tmpfs 1.0M 0 1.0M 0% /run/credentials/getty@tty1.service
tmpfs tmpfs 791M 4.0K 791M 1% /run/user/0
  • -h:二进制GiB/MiB单位,操作系统标准
  • -T:额外打印文件系统类型(xfs/ext4)

注意区分参数:‑H是十进制SI单位,就是硬盘厂商宣传用的1GB=1000MB,和‑h不要搞混。

du:统计目录真实占用磁盘大小

递归统计目录下面所有文件占用磁盘。

1
2
3
4
5
[root@localhost ~]# du -h /usr/share | more
96K /usr/share/licenses/libgcc
4.0K /usr/share/licenses/tzdata
416K /usr/share/licenses/linux-firmware-whence
724K /usr/share/licenses/linux-firmware

目录层级多的时候刷屏,加上‑s只输出汇总总和,不打印子文件夹明细。

示例:一次性看/etc /boot /var这几个目录各自占用多少磁盘

1
2
3
4
[root@localhost ~]# du -sh /etc /boot /var
22M /etc
169M /boot
69M /var

GNOME System Monitor 图形监控工具

如果是带GNOME桌面的服务器,可以打开系统监视器,图形界面工具,功能等价ps+top+df,带历史趋势曲线图。

分为3个选项卡:

  1. Processes(进程):图形化进程列表,可以点击表头排序,右键终止/杀死进程,调整进程优先级,设置CPU亲和性,还可以查看进程内存映射;
  2. Resources(资源):图表展示每颗CPU历史曲线、内存swap、网络收发、磁盘读写的历史走势,看波动很直观;
  3. File Systems(文件系统):图形化看各个磁盘分区容量占用。

cpuusage

⚠️注意:生产服务器绝大多数没有图形桌面,图形工具只能本地测试机玩玩,线上全部用上面命令行工具。

写在最后

本篇全部都是系统自带工具,不需要额外装任何软件包。简单梳理下各自适合的场景:

  • ps:拍进程静态快照,排查进程父子关系
  • top:实时看进程瞬时CPU、内存占用,交互式观察动态变化
  • free:整机内存总览,记住看available,不要被free列迷惑
  • vmstat:一站式看整机CPU、内存、swap、IO、中断上下文切换综合状态
  • lsblk / df / du:磁盘设备、挂载、磁盘空间排查

下一篇预告:Linux性能调优系列(三),我们讲解sysstat工具包 mpstat、iostat、pidstat、sar,以及PCP+Grafana实现长期性能数据采集与可视化。