实验环境基于天翼云服务器
工具定位
htop 是交互式 top 的增强版,适合企业现场快速按 CPU 核、线程、进程树做定位,并且更便于筛选与排序。
企业级排障地图(系统资源/硬件)
先做基线,再做归因,最后做证据链:
- • 基线:负载/CPU/内存/IO/网络五大件是否异常
- • 归因:是进程问题、内核问题,还是硬件/虚拟化资源约束
- • 证据:把关键指标、命令输出、时间窗固化到事故记录
推荐最短闭环:
- 1. top/htop 定位 Top 进程与资源方向
- 2. vmstat/mpstat/pidstat/iostat 找到瓶颈维度
- 3. lsof/ss 确认 FD/连接等资源是否膨胀
- 4. perf(必要时)做 CPU 火焰图/采样证据
以下是 htop 企业级完全教程,从交互式进程管理到生产环境故障诊断的完整体系。
第一章:核心概念与定位
1.1 htop vs top:企业级差异
| | | |
| 视觉反馈 | | | |
| 交互方式 | | | |
| 进程管理 | | | 批量操作 |
| 信息密度 | | | |
| 树形视图 | | | 父子进程关系 |
适用场景:
第二章:安装与启动策略
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 黄色/红色:内核空间(高红色 = 硬中断风暴)
- • 内存蓝色:缓冲区 (buffer cache)
3.2 进程列表区(数据密集区)
默认列(从左到右):
| | |
| | 与 lsof -p PID / strace -p PID 联动 |
| | |
| | |
| | |
| | |
| | 真实物理内存 |
| | |
| | R=运行 S=睡眠 D=不可中断睡眠(IO 等待) Z=僵尸 |
| | |
| | |
| | |
| | |
关键状态码 (S 列):
- • D (Disk Sleep):不可中断睡眠,通常为 NFS/磁盘 IO 阻塞,kill -9 无法终止
- • Z (Zombie):僵尸进程,父进程未回收,不占用资源但污染进程表
- • T (Stopped):Ctrl+Z 挂起,占用内存但无 CPU
第四章:核心操作实战(键盘导航)
4.1 基础导航(Vim 风格)
| | |
↑/↓ | | |
PgUp/PgDn | | |
Home/End | | |
Space | 标记进程 | 批量 kill |
l | 显示打开文件 | 排查句柄泄漏 |
s | 选定进程跟踪 | 调用 strace -p(需 strace 安装) |
F3 | 搜索进程名 | |
F4 | 过滤进程 | |
4.2 进程管理(信号发送)
选中进程后按 F9 (Kill):
信号选择菜单(常用):
1 SIGHUP 平滑重载(nginx -s reload 等同)
9 SIGKILL 强制终止(最后手段,无法捕获)
15 SIGTERM 优雅终止(默认,允许清理资源)
18 SIGCONT 恢复暂停进程
19 SIGSTOP 暂停进程(调试时使用)
企业级 Kill 策略:
- 1. 先尝试
15 (SIGTERM),等待 5 秒 - 2. 若进程变为
<defunct>(僵尸),忽略(无法 kill) - 3. 若为
D 状态(不可中断),检查磁盘/NFS,切勿直接重启 - 4. 最后手段
9 (SIGKILL),注意可能导致数据丢失(如数据库)
4.3 排序与视图切换
| |
F6 | |
F5 | 树形模式 |
F2 | |
t | |
H | 显示用户线程 |
K | 显示内核线程 |
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)
第六章:企业级配置与定制(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)
- • Black Night:高对比度(投影演示用)
- • 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. 启动
htop,按 F6 选 CPU% 排序 - 2. 找到
%CPU 超过 100% 的 Java 进程(多线程利用多核) - 3. 按
H显示线程,观察具体哪个线程 ID (TID) 占 CPU - 4. 将 TID 转换为十六进制:
printf "%x\n" 12345 → 3039 - 5. 用
jstack 抓栈:jstack <PID> | grep -A 20 0x3039
7.2 场景二:内存泄漏定位
操作流:
- 2. 观察
RES 持续增长且 SHR 不变的进程 - 3. 按
l 查看打开文件,检查是否有未关闭的日志或 socket - 4. 按
e 检查是否配置了不当的 MALLOC_ARENA_MAX(glibc 内存碎片)
7.3 场景三:僵尸进程清理
现象:<defunct> 进程,PPID 为 1 (systemd)
排查:
- 2. 若父进程是 MySQL/Apache,说明应用未正确
wait() 子进程 - 3. 切勿 kill 僵尸,应重启其父进程或修复代码
7.4 场景四:IO 等待系统卡死
现象:Load Average 很高,但 CPU% 很低,wai (IO Wait) 高
操作:
- 1. 按
F6 选 STATE 排序,查找状态为 D 的进程 - 2. 按
l 查看其等待的文件(通常是 NFS 或损坏的磁盘) - 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 常见问题
| | |
| | export TERM=xterm-256color |
| | 换用 iTerm2/Windows Terminal |
| | 按 H 切换,或重新编译带 --enable-taskstats |
| | sudo htop |
| | 使用 htop --pid=$(pgrep -d, <app>) |
9.2 性能影响
- • 轻量级:htop 本身 CPU 占用 < 1%
- • 大规模进程:当进程数 > 10,000 时,建议增大刷新间隔
htop -d 50
附录:快捷键速查表
导航:
- •
a:设置 CPU 亲和性(Affinity,多核绑核)
功能:
最佳实践总结:
- • 日常巡检:
htop -d 50(慢刷新减少干扰) - • 故障应急:
sudo htop -u problem_user(隔离查看) - • 多核优化:按
a 设置 CPU 亲和性(将关键进程绑到特定核心)