Featured image of post Linux 监控与系统性能工具:top/glances/lsof/systemctl/dstat 性能观测

Linux 监控与系统性能工具:top/glances/lsof/systemctl/dstat 性能观测

2020 视角下的 Linux 系统监控——top 字段精读、glances 一屏综合监控、lsof 端口/文件排查、systemctl 资源限制(CPUQuota/MemoryLimit)、dstat/pidstat/iotop/vmstat 五把刀、mount 修复与时区配置

一、为什么是 2020 年这一份

2020 年这个时间点,Linux 系统监控进入"工具集成化"阶段:

  • top 3.x 仍是终端监控的入门首选
  • glances(2014 发布,2.x 时代)作为"一屏式综合监控"被广泛接受
  • dstat 替代 vmstat 成为综合 I/O / CPU / 网络监控的事实标准
  • systemd resource control 全面成熟(CPUQuota / MemoryLimit / IOWeight)
  • lsof 仍是排查"端口被谁占用"的首选
  • iotop 与 pidstat 形成"按进程看 I/O"的组合

这一篇覆盖 top 字段精读、glances 一屏监控、lsof 端口排查、systemctl 资源限制、五把刀(dstat/pidstat/iotop/vmstat/top)、mount 修复、时区配置——日常性能观测的"七种武器"。

阅读建议:本文是"工具集"性质——日常每个工具都要会用,遇到具体场景再回头查。

二、top 字段精读

top 是 1991 年起的"上古"工具,至今仍是 Linux 性能观测的入门首选。

2.1 启动参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
top --help

# -d 两次刷新间隔(秒)
# -p 只监控指定 PID
# -q 无延迟刷新(高优先级)
# -S 累计模式
# -s 安全模式
# -i 不显示闲置/僵死进程
# -c 显示完整命令行(不只命令名)

top -c -bw 512    # 显示完整命令行,输出宽度 512

2.2 字段含义

第一行:当前时间、运行时间、当前用户、CPU 平均负载(1/5/15 分钟)——“1 代表一个核心满了”

第二行:总/运行/休眠/停止/僵尸进程数

第三行

  • us —— 用户空间占用 CPU%
  • sy —— 内核空间占用 CPU%
  • ni —— 用户改过优先级的进程占用
  • id —— 空闲
  • wa —— 等待 I/O
  • hi —— hardware IRQ
  • si —— software IRQ
  • st —— steal time(仅与虚拟机相关,被偷走的时间)

第四行:物理内存总量、空闲、已用、内核缓存

第五行:虚拟内存总量、空闲、已用、下一波分配量

进程字段

字段含义
PID进程 ID
USER进程用户名
PR动态优先级(内核视角)
NI静态优先级(用户视角,nice 值)
VIRT虚拟内存
RES物理内存
SHR共享内存
S状态:D 不可中断 / I idle / R 运行 / S 睡眠 / T 停止 / Z 僵尸
%CPU / %MEMCPU / 内存占用
TIME+累计 CPU 时间
COMMAND命令

2.3 Java VIRT 异常大问题

Java 8+ 用 Metaspace 取代 PermGen,元空间放在 OS 本地内存。每个线程分配一个 arena(64MB),线程一多 VIRT 就巨大。这不是真用了那么多内存——用 pmap 查真实占用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 按内存块大小排序
pmap -x <pid> | sort -n -k3

# 输出内存块详细信息
cat /proc/<pid>/smaps

# 通过 gdb dump 指定内存块
gdb attach <pid>
dump memory /tmp/0x7fb9b0000000-0x7fb9b3ffe000.dump 0x7fb9b0000000 0x7fb9b3ffe000

# 提取长度超过 10 字符的字符串
strings -10 /tmp/0x7fb9b0000000-0x7fb9b3ffe000.dump

2.4 常用快捷键

功能
shift+m按内存排序
shift+P按 CPU 排序
shift+t按时间排序
shift+n按 PID 排序
m内存显示模式
E内存总览单位
e进程内存单位
c显示完整命令行
i不显示闲置
l启动时间和平均负载

2.5 用户下的所有进程

1
2
3
4
5
# 查某用户进程
top -u username

# 取 top 一屏输出供管道调用
top -bn 1 -i -c | awk '{ if (NR > 6) print }' | awk '{print $1,$9}'

三、glances:一屏式综合监控

glances(2014-12 发布 2.0)被称为 htop 的"加强版",提供一屏式综合监控(CPU / 内存 / 磁盘 / 网络 / 进程全维度)。

3.1 安装

1
2
3
4
5
yum -y install glances        # CentOS
apt install -y glances        # Debian/Ubuntu

# 配套:硬件温度监控
yum -y install lm_sensors

3.2 启动

1
glances

与 htop 的差异:htop 主要聚焦进程列表;glances 把 CPU / 内存 / 磁盘 / 网络 / 进程都堆在一屏里,类似 Windows 任务管理器的"详细信息"视图。

四、lsof:端口与文件排查

lsof(list open files)是"端口被谁占用"排查的首选。

4.1 安装

1
2
yum -y install lsof    # CentOS
apt install -y lsof    # Debian/Ubuntu

4.2 常用命令

 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
# 查 8080 端口被谁占用
lsof -i:8080

# 查谁打开了 abc.txt
lsof abc.txt

# 查 abc 进程打开的文件
lsof -c abc

# 查 PID 1234 打开的文件
lsof -c -p 1234

# 查 gid 组打开的文件
lsof -g gid

# 查 /usr/local/ 下被进程打开的文件
# +d 不递归,+D 递归
lsof +d /usr/local/
lsof +D /usr/local/

# 查 fd 为 4 的进程
lsof -d 4

# 查所有打开的端口和 UNIX domain 文件
lsof -i -U

五、systemctl 资源限制

systemd 的 resource control(cgroup 集成)能精细控制服务资源。

5.1 查看服务列表

1
2
3
4
5
# 当前已激活的服务
systemctl list-units

# 所有 unit 文件(激活 + 未激活)
systemctl list-unit-files

5.2 修改 service 后重载

1
2
3
4
5
# 重载所有 unit 文件
systemctl daemon-reload

# 重置失败状态
systemctl reset-failed 服务名

5.3 给服务加资源限制

1
systemctl edit sshd
1
2
3
4
5
[Service]
CPUQuota=20%
MemoryLimit=256M
Nice=-10
IOWeight=100
1
2
sudo systemctl daemon-reload
sudo systemctl restart sshd
字段含义
CPUQuota=20%限制最多用 20% 单核 CPU
MemoryLimit=256M限制最大 256M 内存
Nice=-10优先级(-20~19,越小越高)
IOWeight=100IO 权重(1~10000)

5.4 区分 Ubuntu Server 与桌面

1
2
# display-manager 服务存在 = 桌面版
systemctl status display-manager

六、性能观测"五把刀"

6.1 五把刀概览

工具用途
top监控整体服务器:CPU / 内存 / 磁盘 / 网络综合
dstat -d查看磁盘每秒读写量(单位 K)
dstat -r查看磁盘随机的读/写 IOPS
dstat -n查看网卡每秒接收/发送量(单位 K)
pidstat统计各进程磁盘 I/O(也可监控 CPU 和内存)
iotop类似 top,但只看 I/O 相关的进程
vmstat监控 I/O 活跃的进程、内存、CPU

6.2 实战组合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 整体情况
top -c

# 磁盘读写
dstat -d

# 随机 IOPS
dstat -r

# 网络流量
dstat -n

# 各进程磁盘 I/O
pidstat -d 1

# I/O 排行
iotop

# 虚拟内存/IO 活跃
vmstat 1

七、磁盘挂载故障

7.1 重新挂载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 1. 卸载(如果有进程占用,先 fuser -m -k)
mount /dev/sdb /home

# 2. 查 UUID
blkid

# 3. 写 fstab
echo UUID=3cef6fe2-3899-463a-a0cb-2477765fb446 /media/dell/data ext4 nodev,nosuid 0 2 >> /etc/fstab

# 4. 重启
reboot

7.2 fstab 配错 SSH 连不上

如果 fstab 写错导致机器起不来,SSH 连不上。两种处理:

  1. 云控制台 VNC 登录 —— 直接进系统改 fstab
  2. Live CD 启动 —— 挂载原系统盘,编辑 /etc/fstab

预防:写 fstab 之前先 mount -a 测试一下,mount -a 会按 fstab 把所有文件系统都挂一遍。

八、时区配置

1
2
3
4
5
6
7
8
9
# 查时区
timedatectl
date

# 改时区
timedatectl set-timezone Asia/Shanghai

# 老方法:直接覆盖 localtime
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

为什么用 timedatectl:systemd 时代 timedatectl 会自动同步 RTC,且与 NTP 服务联动。直接覆盖 /etc/localtime 简单粗暴但可能让 systemd 状态错乱。

九、systemctl 启动 Java 微服务

写一个 service 文件让 Java 程序由 systemd 管理:

 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
27
28
# 1. 写启动脚本
vim /home/project/safety/sh/gateway.sh
vim /home/project/safety/sh/bash.sh
vim /home/project/safety/sh/chemistry.sh

# 2. 写 service 文件
vim /etc/systemd/system/gateway.service
vim /etc/systemd/system/base.service
vim /etc/systemd/system/chemistry.service

# 3. 重载 + 启动
systemctl daemon-reload
systemctl start gateway
systemctl start base
systemctl start chemistry

# 4. 停止
systemctl stop gateway
systemctl stop base
systemctl stop chemistry

# 5. 失败重置
systemctl reset-failed gateway

# 6. 卸载
rm -rf /etc/systemd/system/gateway.service
rm -rf /etc/systemd/system/base.service
rm -rf /etc/systemd/system/chemistry.service

service 文件模板:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[Unit]
Description=Gateway Service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/home/project/safety/sh/gateway.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

十、卸载旧版 Java

1
2
3
4
# CentOS
rpm -qa | grep java | xargs rpm -e --nodeps
rpm -qa | grep jdk | xargs rpm -e --nodeps
rpm -qa | grep gcj | xargs rpm -e --nodeps

Ubuntu/Debianapt remove --purge openjdk-* + apt autoremove

十一、前置知识 / 下一步

  • 想看 iotop / dstat / vmstat 详细用法 → man iotop / man dstat / man vmstat
  • 想看 Prometheus + Grafana 监控栈 → 翻本系列《Linux 监控告警:Prometheus 全家桶》(系列其他文章)
  • 想看 cgroup 原理 → 翻独立文章
  • 想看 systemd 高级用法(target、socket 激活)→ 翻独立文章

十二、参考资源


2024 视角:从"工具集"到"观测平台"

2020 年这套"五把刀 + glances + lsof"在 2024 年仍是单机排查的速查。但 2024 主流是 eBPF + 观测平台

一、eBPF 已经成为 Linux 监控的"基础设施"

  • 2020 → 2024 这 4 年里,eBPF 从"前沿技术"变成"事实标准":

    • Cilium(CNI)+ Hubble(eBPF 网络可观测性)已成 K8s 网络主流
    • Pixie(New Relic 开源)直接用 eBPF 抓应用 trace
    • bpftrace(2020 文章已经提到)从 0.9 升到 0.16+,单行命令就能看内核状态
    1
    2
    3
    4
    5
    
    # 看哪些进程在 5 秒内读了 /etc/passwd
    bpftrace -e 'tracepoint:syscalls:sys_enter_openat /arg2->filename == "/etc/passwd"/ { printf("%s [%d]\n", comm, pid); }'
    
    # 跟踪 TCP 重传统计
    bpftrace -e 'kprobe:tcp_retransmit_skb { @retrans[comm] = count(); }'
    

二、bpftool + bcc 工具集更全

  • BCC 工具集(2020 提过)已经 100+ 工具,2024 必装:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    apt install bpfcc-tools linux-headers-$(uname -r) linux-tools-$(uname -r)
    
    # 看 CPU 调度延迟
    /usr/share/bcc/tools/runqlat
    
    # 看 4 层级网络延迟
    /usr/share/bcc/tools/netqtop eth0
    
    # 看进程页错误
    /usr/share/bcc/tools/sofdsnoop
    
  • 替代了大部分 2020 那篇提到的"五把刀"——runqlatpidstat 更细,tcpconnectss | grep 更实时。

三、systemd 资源控制的"v2 时代"

systemd 252+(2022-10)在资源控制上做了大量增强:

  • MemoryHigh(软上限,超过触发回收,不杀进程)
  • MemoryMax(硬上限,OOM 杀手)
  • IOReadBandwidthMax / IOWriteBandwidthMax(IO 带宽)
  • CPUWeight(cgroup v2 的 CPU 权重,比 quota 灵活)
  • IPAccounting + IPAddressAllow / IPAddressDeny(网络白名单)
1
2
3
4
5
6
7
[Service]
MemoryHigh=1G
MemoryMax=2G
CPUWeight=200
IOReadBandwidthMax=/var/lib/mysql 200M
IPAddressAllow=10.0.0.0/8
IPAddressDeny=any

四、top 的 2024 替代品

  • htop 3.x(2022 起的活跃版):彩色 + 鼠标 + 树状折叠。
  • btop(2021 推出,2024 仍是 C++ 写的最"美"的终端监控):CPU/内存/磁盘/网络/温度全屏 sparkline
  • gtop(Node.js 写的同类)。
  • atop(老牌但 2024 仍是"事后分析"王者):日志记录 + 回放。
1
2
3
4
5
# atop 录到日志,事后看
atop -w /var/log/atop.log 5

# 回放
atop -r /var/log/atop.log

五、Prometheus 仍是 2024 事实标准

2020 那篇提到 Prometheus + Grafana 监控栈是"系列其他文章"。到 2024 年:

  • Prometheus 2.50+(2024)支持远程写入(Remote Write 2.0)+ Agent Mode(无状态 agent)。
  • OpenTelemetry(OTel) 已经是 Metrics / Traces / Logs 统一标准,Prometheus 通过 OTLP 接收 trace。
  • VictoriaMetrics / Thanos / Mimir 是 Prometheus 长期存储的三大选择。
  • Grafana 10+(2024)原生支持 drill-down link / Explore / Alerting 集成。

六、生产环境监控的"完整架构"

1
2
3
4
5
6
7
[主机 / 容器] → node_exporter / otel-collector
            ↓ remote write
        [Prometheus / VictoriaMetrics]
            ↓ PromQL
        [Grafana 仪表盘] + [Alertmanager 告警]
        [钉钉 / 企微 / 飞书 / PagerDuty]

单机时代用 top + glances + iotop 是"万金油";2024 的微服务 / K8s 时代已经必须走这套观测平台。

使用 Hugo 构建
主题 StackJimmy 设计