当前位置:首页>Linux>Linux故障检测工具之htop

Linux故障检测工具之htop

  • 2026-09-30 23:04:25
Linux故障检测工具之htop

实验环境基于天翼云服务器

工具定位

htop 是交互式 top 的增强版,适合企业现场快速按 CPU 核、线程、进程树做定位,并且更便于筛选与排序。

企业级排障地图(系统资源/硬件)

先做基线,再做归因,最后做证据链:

  • • 基线:负载/CPU/内存/IO/网络五大件是否异常
  • • 归因:是进程问题、内核问题,还是硬件/虚拟化资源约束
  • • 证据:把关键指标、命令输出、时间窗固化到事故记录

推荐最短闭环:

  1. 1. top/htop 定位 Top 进程与资源方向
  2. 2. vmstat/mpstat/pidstat/iostat 找到瓶颈维度
  3. 3. lsof/ss 确认 FD/连接等资源是否膨胀
  4. 4. perf(必要时)做 CPU 火焰图/采样证据

以下是 htop 企业级完全教程,从交互式进程管理到生产环境故障诊断的完整体系。


第一章:核心概念与定位

1.1 htop vs top:企业级差异

特性
top (传统)
htop (现代)
生产价值
视觉反馈
黑白字符
彩色编码 + 动态条形图
CPU/内存瓶颈 一眼识别
交互方式
命令行参数
鼠标 + 功能键 + Vim 键位
紧急故障时 快速定位
进程管理
需手动输入 PID
空格选择 + F9 信号发送
批量操作
 无需记忆 PID
信息密度
固定列宽
可滚动 + 自定义列
容器时代 长命令行 完整展示
树形视图
不支持
F5 快捷键
父子进程关系
 一目了然

适用场景:

  • • 紧急救火:服务卡死时快速定位僵尸进程
  • • 性能调优:实时观察 CPU 亲和性、线程切换
  • • 安全审计:查看进程启动用户、打开文件描述符

第二章:安装与启动策略

2.1 多平台安装

# RHEL/CentOS/Rocky (EPEL 仓库)
sudo yum install -y epel-release
sudo yum install -y htop

# Ubuntu/Debian
sudo apt update && sudo apt install -y htop

# Alpine (容器环境)
apk add htop

# macOS
brew install htop

# 源码编译(嵌入式/定制)
wget https://github.com/htop-dev/htop/releases/download/3.3.0/htop-3.3.0.tar.xz
tar xf htop-3.3.0.tar.xz && cd htop-3.3.0
./configure --enable-openvz --enable-vserver --enable-cgroup && make && sudo make install

2.2 启动参数(企业级用法)

# 延迟启动(避免启动瞬间 CPU 采样偏差)
htop -d 10  # 刷新间隔 10 个 0.1 秒 = 1 秒(默认)

# 只显示某用户的进程(多租户环境)
htop -u appuser

# 树形模式直接启动(排查子进程)
htop -t

# 排序字段预设(CPU 占用倒序)
htop -s PERCENT_CPU

第三章:界面深度解析(医学影像级解读)

启动后界面分为 三大区域:

3.1 头部系统资源区(诊断仪表盘)

CPU[||||||||||||||||||||||||100.0%]  # 每个核心独立条形(支持 256+ 核心)
Mem[|||||||||||||||||||||||8.5G/16.0G]  # 绿色=已用 蓝色=缓存 黄色=共享
Swp[|                   0K/4.0G]      # 红色=交换分区使用(告警指示)
Tasks: 45, 12 thr; 2 running          # 线程级统计(F2 可开启"显示线程")
Load average: 0.52 0.58 0.59          # 1/5/15 分钟负载
Uptime: 15 days, 03:20:00             # 重启标识(判断内核升级时机)

颜色编码含义:

  • • CPU 绿色:用户空间低优先级 (nice>0)
  • • CPU 蓝色:用户空间正常优先级
  • • CPU 黄色/红色:内核空间(高红色 = 硬中断风暴)
  • • 内存蓝色:缓冲区 (buffer cache)
  • • 内存黄色:共享内存 (tmpfs/shm)

3.2 进程列表区(数据密集区)

默认列(从左到右):

列名
英文
诊断价值
PID
Process ID
与 lsof -p PID / strace -p PID 联动
USER
启动用户
安全审计:检查是否有异常用户进程
PRI
优先级
实时进程判断 (RT > 99)
NI
Nice 值
负值 = 高优先级(需 root)
VIRT
虚拟内存
申请但未实际使用的内存(含交换)
RES
常驻内存
真实物理内存
消耗(排除缓存)
SHR
共享内存
代码段共享(容器环境关键指标)
S
状态
R=运行 S=睡眠 D=不可中断睡眠(IO 等待) Z=僵尸
CPU%
CPU 占用
单核百分比(>100% 表示多线程饱和)
MEM%
内存占比
容器 OOM 风险评估
TIME+
累计 CPU 时间
判断是否为长期运行的顽固进程
Command
命令行
完整参数显示(区别于 top 的截断)

关键状态码 (S 列):

  • • D (Disk Sleep):不可中断睡眠,通常为 NFS/磁盘 IO 阻塞,kill -9 无法终止
  • • Z (Zombie):僵尸进程,父进程未回收,不占用资源但污染进程表
  • • T (Stopped):Ctrl+Z 挂起,占用内存但无 CPU

第四章:核心操作实战(键盘导航)

4.1 基础导航(Vim 风格)

按键
功能
企业场景
↑/↓
 或 k/j
上下选择进程
浏览 Top 10 资源消耗者
PgUp/PgDn
翻页
上千进程的服务器快速浏览
Home/End
跳到首/尾
查看最高/最低 PID
Space标记进程批量 kill
 前多选(出现黄色标记)
l
 (小写 L)
显示打开文件排查句柄泄漏
(调用 lsof)
s选定进程跟踪
调用 strace -p(需 strace 安装)
F3
 或 /
搜索进程名
快速定位特定服务(如 nginx)
F4
 或 \
过滤进程
只显示匹配项(屏蔽系统进程干扰)

4.2 进程管理(信号发送)

选中进程后按 F9 (Kill):

信号选择菜单(常用):
1 SIGHUP    平滑重载(nginx -s reload 等同)
9 SIGKILL   强制终止(最后手段,无法捕获)
15 SIGTERM  优雅终止(默认,允许清理资源)
18 SIGCONT  恢复暂停进程
19 SIGSTOP  暂停进程(调试时使用)

企业级 Kill 策略:

  1. 1. 先尝试 15 (SIGTERM),等待 5 秒
  2. 2. 若进程变为 <defunct>(僵尸),忽略(无法 kill)
  3. 3. 若为 D 状态(不可中断),检查磁盘/NFS,切勿直接重启
  4. 4. 最后手段 9 (SIGKILL),注意可能导致数据丢失(如数据库)

4.3 排序与视图切换

按键
功能
F6
选择排序列(CPU%、MEM%、TIME 等)
F5树形模式
(显示父子关系,排查 fork 炸弹)
F2
设置菜单(颜色、列、显示选项)
t
显示/隐藏树形线
H显示用户线程
(区分进程和线程)
K显示内核线程
(排查 kworker 高 CPU)
F跟随模式
(光标始终在当前排序首位)

第五章:高级诊断功能

5.1 文件描述符检查(句柄泄漏排查)

选中进程 → 按 l (小写 L):

FD   TYPE     DEVICE       SIZE       NODE NAME
cwd  DIR      8,2          4096         21 /opt/app
rtd  DIR      8,2          4096          2 /
txt  REG      8,2         1.2M     131072 /usr/bin/java
mem  REG      8,2         2.3M     131073 /lib/libc.so.6
0u   CHR      136,0        0t0          3 /dev/pts/0  (标准输入)
1w   REG      8,2         5.6G    1048577 /var/log/app/out.log

诊断要点:

  • • 5.6G 的日志文件:若 1w(标准输出)指向巨大文件,排查日志切割失败
  • • 大量 socket:若 ESTABLISHED 连接数异常,可能是连接池泄漏
  • • deleted 文件:(deleted) 但 FD 未释放,空间未回收(需重启进程)

5.2 系统调用追踪(strace 集成)

选中进程 → 按 s:

(strace -p 12345 -s 512 的实时输出)
read(3, "SELECT * FROM orders WHERE"..., 4096) = 4096
futex(0x7f8b4c, FUTEX_WAIT_PRIVATE, 0, NULL) = 0

适用场景:

  • • 应用假死:查看是否卡在 read() 或 futex()(锁竞争)
  • • 性能瓶颈:高频 lseek 或 write 表明磁盘交互模式异常

5.3 环境变量与程序路径

  • • 按 e:显示进程环境变量(检查 LD_LIBRARY_PATH、JAVA_OPTS)
  • • 按 c:标记/取消标记进程(多选后批量操作)

第六章:企业级配置与定制(F2 设置)

按 F2 进入设置菜单:

6.1 显示选项(Display options)

必改配置:

[*] Hide kernel threads          # 取消勾选(排查 ksoftirqd 时需要)
[*] Hide userland process threads # 取消勾选(Java 线程分析)
[*] Display threads in a different color  # 建议开启(区分主线程/子线程)
[*] Show program path            # 开启(显示绝对路径,安全审计)
[ ] Highlight program "basename" # 关闭(避免同名不同路径混淆)

6.2 颜色方案(Colors)

  • • Default:标准配色
  • • Black Night:高对比度(投影演示用)
  • • Light Terminal:白底终端适配
  • • MC:Midnight Commander 风格

建议:单色服务器选择 Black Night,确保低亮度下文字清晰。

6.3 列定制(Columns)

按 F2 → Columns:

Available Columns → Active Columns
- M_TRS (Code Size)      # 代码段大小
- M_SHARE (Shared Libs)  # 共享库内存
- M_PSS (Proportional Set Size)  # 容器真实内存(含共享分摊)
- NLWP (Number of Threads)       # 线程数(排查线程泄漏)
- TGID (Thread Group ID)         # 主线程 PID
- CWD  (Current Working Dir)     # 当前工作目录(排查路径错误)

容器环境推荐列:M_PSS(比 RSS 更准确的内存计量)


第七章:生产环境实战场景

7.1 场景一:Java 进程 CPU 飙升

操作流:

  1. 1. 启动 htop,按 F6 选 CPU% 排序
  2. 2. 找到 %CPU 超过 100% 的 Java 进程(多线程利用多核)
  3. 3. 按 H显示线程,观察具体哪个线程 ID (TID) 占 CPU
  4. 4. 将 TID 转换为十六进制:printf "%x\n" 12345 → 3039
  5. 5. 用 jstack 抓栈:jstack <PID> | grep -A 20 0x3039

7.2 场景二:内存泄漏定位

操作流:

  1. 1. 按 F6 选 M_PSS 或 RES 排序
  2. 2. 观察 RES 持续增长且 SHR 不变的进程
  3. 3. 按 l 查看打开文件,检查是否有未关闭的日志或 socket
  4. 4. 按 e 检查是否配置了不当的 MALLOC_ARENA_MAX(glibc 内存碎片)

7.3 场景三:僵尸进程清理

现象:<defunct> 进程,PPID 为 1 (systemd)
排查:

  1. 1. 切到树形视图 F5,找到僵尸进程的父进程
  2. 2. 若父进程是 MySQL/Apache,说明应用未正确 wait() 子进程
  3. 3. 切勿 kill 僵尸,应重启其父进程或修复代码

7.4 场景四:IO 等待系统卡死

现象:Load Average 很高,但 CPU% 很低,wai (IO Wait) 高
操作:

  1. 1. 按 F6 选 STATE 排序,查找状态为 D 的进程
  2. 2. 按 l 查看其等待的文件(通常是 NFS 或损坏的磁盘)
  3. 3. 按 s 追踪系统调用,确认卡在 read()/sync() 等

第八章:远程与自动化集成

8.1 SSH 隧道与 tmux 保持

# 后台持续记录(结合 script 命令)
ssh server "script -q -c 'htop' /dev/null | tee htop.log"

# tmux 会话保持(断网后继续监控)
tmux new -d -s monitor 'htop'
# 稍后重连:tmux attach -t monitor

8.2 非交互式批处理(限制说明)

htop 不适合直接管道导出(ncurses 依赖 TTY),变通方案:

# 使用 batch 模式(需编译时支持,通常不可用)
# 推荐替代:直接使用 ps 或 atop -b
ps aux --sort=-%cpu | head -20

8.3 与 Systemd 集成

查看 cgroup 资源限制:

# 安装 systemd 支持(部分发行版)
htop --enable-cgroup  # 启动时
# 或在 F2 中添加 "CGROUP" 列

显示:

  • • CGROUP 列显示 /system.slice/nginx.service
  • • 内存列显示实际使用 vs cgroup 限额的百分比

第九章:故障排查与限制

9.1 常见问题

症状
原因
解决
启动后空白/花屏
TERM 变量错误
export TERM=xterm-256color
鼠标无法点击
终端不支持
换用 iTerm2/Windows Terminal
不显示线程
编译选项缺失
按 H 切换,或重新编译带 --enable-taskstats
普通用户看不到其他用户进程
权限限制
sudo htop
 或调整 /proc 挂载权限
容器内显示宿主机全部进程
PID Namespace 共享
使用 htop --pid=$(pgrep -d, <app>)

9.2 性能影响

  • • 轻量级:htop 本身 CPU 占用 < 1%
  • • 大规模进程:当进程数 > 10,000 时,建议增大刷新间隔 htop -d 50

附录:快捷键速查表

导航:

  • • ↑/↓ 或 k/j:移动
  • • PgUp/PgDn:翻页
  • • Home/End:首尾
  • • Space:标记
  • • a:设置 CPU 亲和性(Affinity,多核绑核)

功能:

  • • F1:帮助
  • • F2:设置
  • • F3:搜索
  • • F4:过滤
  • • F5:树形
  • • F6:排序
  • • F9:终止 (Kill)
  • • F10:退出
  • • u:过滤用户
  • • l:lsof 查看文件
  • • s:strace 追踪系统调用
  • • e:环境变量
  • • t:树形线切换
  • • H:显示线程
  • • K:显示内核线程
  • • I:反转排序
  • • M:按内存排序(快捷)
  • • P:按 CPU 排序(快捷)
  • • T:按时间排序(快捷)

最佳实践总结:

  • • 日常巡检:htop -d 50(慢刷新减少干扰)
  • • 故障应急:sudo htop -u problem_user(隔离查看)
  • • 多核优化:按 a 设置 CPU 亲和性(将关键进程绑到特定核心)

最新文章

随机文章