Linux 系统监控和 Debug
Published:
0x01 系统监控工具
CPU
top/htop:实时 CPU 使用率(三个数字代表1/5/15分钟内CPU执行进程的平均数)vmstat:查看 CPU 的 user/sys/io 等占比mpstat(来自sysstat):多核 CPU 使用情况perf top / perf record:函数级别的 CPU 开销分析
Memory
top/htop:进程级内存占用free -h:系统整体内存占用vmstat:内存分页、swap 情况perf stat:查看 cache misssar -r(来自 sysstat):内存统计历史
I/O
iotop:进程级磁盘 I/Oiostat(sysstat)查看设备级磁盘使用率dstat:实时磁盘读写 + 网络数据strace:追踪文件 read/write 系统调用
进程与线程
strace -p <pid>:查看进程的系统调用序列perf trace:按系统调用频率分析程序瓶颈,用于排查程序卡顿、慢调用、未响应等
网络与端口
ss -tulnp/netstat:查看端口监听lsof -i :80:查看哪个进程占用了 80 端口dstat -n:实时网络流量iftop/nethogs(额外工具):进程级网络流量监控
文件句柄 / FD
lsof:列出进程打开的所有文件、socket、FIFOls /proc/<pid>/fd/:直接查看 FD 数
0x02 问题排查思路
系统瓶颈判断
使用 vmstat 1 5 来快速定位系统瓶颈。通过观察 r, b, si/so, wa, 和 cs 字段
可以判断系统是 CPU 饱和、I/O 阻塞、还是内存不足
进而决定是否深入用 iotop, perf, 或 top -H 等工具进一步排查。
现象 可能问题 r≫ CPU 核心数CPU 排队严重 b持续不为 0I/O 阻塞严重 si/so持续大swap 活跃,内存不足 wa> 20%I/O 等待瓶颈,磁盘慢 cs很高线程调度过多,可能线程泄漏 id≈ 0CPU 饱和
内存泄漏诊断
程序内存占用不断上升,free -h 中可用内存持续下降;应用长时间运行后变慢、卡顿,甚至 OOM 被杀死;top/htop 中 RSS 或 VIRT 持续增大。
free -h # 查看内存变化
vmstat 1 5 # 1s一次采样5次 性能监控结果
top -o %MEM # 按内存排序
ps aux --sort=-%mem | head
watch -n 1 pmap -x <pid> | grep total # 查看进程内存增长趋势
cat /proc/<pid>/status # 排查是否是泄漏还是缓存
CPU 使用率诊断
top 中 %us 或 %sy 占用高,idle 逼近 0%;load average 高于 CPU 核心数;响应慢、线程卡顿。
top # 判断是单核爆?还是所有核爆?
mpstat -P ALL 1 5 # 1s一次采样5次 CPU核心使用情况
top -o %CPU # 定位高占用进程
ps aux --sort=-%cpu | head # 查找PID
top -H -p <pid> #查找线程级别占用
线程异常诊断
RootCause:程序线程数迅速增加,占用大量资源;上下文切换暴增(cs in vmstat);进程崩溃、卡死、响应慢。
ps -eLf | wc -l # 系统总线程数
ps -L -p <pid> | wc -l # 某进程的线程数
watch "ps -L -p <pid> | wc -l" # 监控线程增长,判断线程泄漏
# 最后查看线程堆栈,判断线程池未回收、死循环
0x03 日常系统启动与服务管理
基础工具:systemd、journalctl、systemctl
systemd系统管理服务systemd本身是一个初始化系统(init system),用于取代传统的SysVinit和Upstart。启动时由内核调用,负责初始化系统、挂载文件系统、启动服务等。同时还包含定时器、登录会话管理、日志管理等子模块。
systemctl系统管理工具操控
systemd的主力工具,支持启动、停止、查看、配置服务等操作。journalctl诊断工具用于查看 systemd 的日志系统**,是
systemd内建的日志管理工具,用来替代传统的/var/log/messages或rsyslog
基础操作:查看系统日志、服务状态、故障定位
使用 journalctl 查看系统日志,非 systemd 系统打开 /var/log 查看系统日志
journalctl -xe # 查看最近的错误日志(最常用)
journalctl -u nginx # 查看 nginx 服务日志
journalctl -f # 实时滚动日志(tail -f)
journalctl -b # 查看上次启动以来的日志
使用 systemctl 查看服务状态,非 systemd 系统使用 service 命令(SysVinit / Upstart 通用)或服务 init脚本(极简系统、容器环境或 service 命令不存在的系统)来查看服务状态
systemctl status nginx # 查看 nginx 服务状态
systemctl is-active nginx # 是否运行中(running)
systemctl is-enabled nginx # 是否开机自启
systemctl restart nginx # 重启服务
systemctl list-units --type=service # 查看所有服务状态
其他内容诊断
| 工具 | 作用 | 示例 |
|---|---|---|
top/htop | 总览资源使用情况 | CPU、内存、进程消耗 |
vmstat | 快速判断是 CPU、I/O 还是内存瓶颈 | vmstat 1 5 |
iotop | 找出磁盘 I/O 高的进程 | iotop -o -P |
lsof | 查看进程打开的文件和端口 | lsof -p <pid> |
strace | 跟踪系统调用 | strace -p <pid> |
journalctl | 查看服务失败的具体日志 | journalctl -xe |
dmesg | 查看内核级别错误信息 | 如硬盘/内存故障 |
0x04 文件系统与权限
基础概念:inode、软硬链接、文件权限
inode(索引节点)
Linux 文件系统中,每个文件(包括目录)对应的元数据结构,记录了文件除文件名外所有信息。
硬链接(Hard Link)
多个文件名指向同一个 inode 的情况,即多个目录项共享一个实际文件内容。拥有相同的 inode。
删除任意一个名字,文件实际内容不会丢失(除非最后一个 link 被删)。
不能跨分区、不能对目录创建硬链接。
软链接(Symbolic Link / symlink)
一个特殊类型的文件,指向另一个文件的路径名,类似 Windows 的快捷方式。
拥有不同 inode,可以跨分区、可以指向目录,
若原始文件被删除,则软链接失效(变成悬挂链接),可以是绝对路径或相对路径。
文件权限(Permission)
**权限中三类用户的顺序是
User/Group/Others,然后用 rwx 来去做区分,文件的特殊权限 Special Permissions
SUID(Set User ID)当用户执行某个可执行文件时,程序会临时以该文件的所有者身份运行。
chmod u+s filenameSGID(Set Group ID)程序运行时以文件所属“用户组”的身份运行(作用类似 SUID 但针对组),在该目录中新建的文件/目录,其 group 会被强制继承父目录的组。
chmod g+s filename_or_dirSticky Bit 只对目录有效。启用后,只有文件的拥有者或 root 才能删除该目录下的文件。
chmod +t directory
特殊权限总结
名称 标志 适用对象 功能作用 SUID s可执行文件 运行时使用文件“所有者”的权限 SGID s可执行文件 / 目录 可执行文件:使用“所属组”权限;目录:新建文件继承组 Sticky Bit t目录 限制删除行为:只有文件拥有者可以删除自己的文件
基础操作:文件权限变更
chmod—— 修改文件权限(change mode)chmod [权限模式] 文件名chown—— 修改文件所有者(change owner)chown [user][:group] 文件名chgrp—— 修改文件所属组(change group)chgrp [groupname] 文件名umask—— 设置默认权限掩码(user file creation mask),减去掩码才是真实权限umask # 查看当前 umask(如 0022) umask 0002 # 设置新建文件默认权限为 664,新建目录为 775
进阶概念:文件系统设计
实际工作中,在部署系统时,经常会遇到不同的文件管理场景,例如数据库、日志等。
如果前期文件系统设计没有考虑好,后期使用过程中就有可能出现下面这些问题:
- inode 不足
- 系统写入瓶颈
- 文件丢失
所以最佳实践应该是,在构建系统之初就做好文件系统选型,具体可以参考下面这些场景与用途。
| 文件系统 | 总结 | 常见用途 | 特性 |
|---|---|---|---|
| ext4 | 稳定耐用、安全默认,日常系统首选 | 传统服务器 / Web / 应用部署 | 稳定、默认、安全 |
| XFS | 并发高效,大文件日志吞吐之选 | 日志服务 / 大文件批处理 | 吞吐高、并发好 |
| Btrfs | 支持快照压缩,适合容器与开发场景 | 快照 + 压缩 + 容器/开发 | 灵活、支持子卷 |
| ZFS | 数据安全第一,适合归档/数据库 | 数据库 / 存档 / 高可靠性存储 | 自修复 + 快照 + 压缩 |
| tmpfs | 内存速度爆炸,但重启就没了 | 高速缓存 / 临时文件 / /tmp | 内存中极速读写,掉电即清空 |
详细对比
| 特性/文件系统 | ext4 | XFS | Btrfs | ZFS | tmpfs |
|---|---|---|---|---|---|
| 文件系统类型 | journaling | journaling | copy-on-write + journaling | copy-on-write + 自修复 | 内存文件系统 |
| 最大文件/分区 | 16TB / 1EB | 8EB / 8EB | 16EB / 16EB | 256ZB / 16EB | 内存限制(动态扩展) |
| 快照支持 | ❌ | ❌ | ✅ | ✅(功能强大) | ❌ |
| 自修复能力 | ❌ | ❌ | ✅(CRC 校验) | ✅(ECC、自愈) | ❌ |
| 并发写入性能 | 中 | ✅ 高 | 中(多子卷支持) | 中(吞吐高,延迟高) | 极快(纯内存) |
| 小文件读写性能 | ✅ 强 | 中 | 中 | 中 | ✅ 强 |
| 在线扩容 | ✅ | ✅ | ✅ | ✅ | — |
| 在线缩容 | ❌(有限支持) | ❌ | ✅ | ✅ | — |
| 原生压缩 | ❌ | ❌ | ✅ | ✅ | ❌ |
| 原生 RAID | ❌ | ❌ | ✅(简单) | ✅(RAID-Z 强大) | ❌ |
| 是否掉电丢数据 | ❌(持久存储) | ❌ | ❌ | ❌ | ✅(重启即失) |
