系统资源监控:htop入门
网站变慢先别急着升级配置,用 htop 看一眼:是 CPU 满了、内存爆了,还是硬盘 IO 卡了。小够手把手教你读懂 htop 的每一行。
我是小够。
网站突然变慢,很多人第一反应是"配置不够,升级!"——且慢。先花一分钟看一眼 htop,搞清楚到底是哪里不够,再决定要不要花钱。很多时候问题根本不在配置,而是某个进程跑飞了。
htop 是 Linux 下最好用的实时系统监控工具,比自带的 top 好看十倍、好用十倍。今天这篇,新手照着看一遍就会。
安装和启动
大多数发行版都没预装,一条命令装上:
# Debian / Ubuntu
sudo apt install htop -y
# CentOS / Rocky / AlmaLinux
sudo dnf install htop -y
# Alpine
sudo apk add htop
装完直接输入 htop 回车,就能看到彩色的实时监控界面。按 q 或 Ctrl+C 退出。建议用普通用户 + sudo 运行,别养成什么都 root 的习惯。
界面分区解读
htop 界面分三块:顶部是资源总览,中间是进程列表,底部是快捷键栏。
顶部:CPU、内存、Swap
- CPU 条:每个逻辑核心一条彩色横条。颜色含义:蓝色是低优先级进程,绿色是普通用户进程,红色是内核进程,橙色是虚拟化占用(steal time)。如果所有条都满格飘红,CPU 就是瓶颈。
- Mem 条:绿色是已用内存,蓝色是缓存(buffer/cache),黄色是缓存页。看内存够不够,别看"已用",看"可用"——Linux 会把空闲内存拿去做缓存,这是好事,不是内存泄漏。
- Swp 条:Swap 使用量。Swap 长期被大量占用,说明物理内存真的不够了,这时候才考虑升级内存。
中间:进程列表
默认按 CPU 占用排序,每行一个进程。关键几列:
- PID:进程号,杀进程时用。
- USER:谁在跑这个进程。看到陌生用户跑着可疑进程,要警惕。
- CPU% / MEM%:这个进程吃了多少 CPU 和内存。找"凶手"主要看这两列。
- TIME+:累计占用 CPU 的时间。一个刚启动的进程 TIME+ 却很大,说明它一直在狂转。
- Command:完整的启动命令,认出进程是干嘛的就靠它。
底部:快捷键栏
记住几个就够:F6 排序、/ 搜索进程、k 杀进程、u 按用户过滤、t 树形显示、h 帮助。
快捷键大全
htop 的精髓在快捷键,背下这几个,效率翻倍:
| 按键 | 作用 |
|---|---|
| 上下箭头 | 选择进程 |
| 空格 | 标记进程(可多选) |
| F6 / > | 选择排序列 |
| P / M / T | 按 CPU / 内存 / 时间排序 |
| / | 搜索进程名(高亮) |
| u | 按用户过滤 |
| k | 结束选中的进程(可发不同信号) |
| t | 树形视图(看父子关系) |
| H | 显示/隐藏用户线程 |
| K | 显示/隐藏内核线程 |
| F2 | 设置(自定义显示列、颜色) |
| q | 退出 |
杀进程时,k 默认发 SIGTERM(优雅退出),杀不掉再选 SIGKILL(强制)。别一上来就 KILL,给进程留个体面,也给自己留条后路。
实战:网站变慢排查全流程
假设你的 WordPress 网站突然变慢,按这个顺序排查:
第一步:看 CPU
所有核心都满格 → 按 P 按 CPU 排序,看谁在吃。如果是 php-fpm 或 mysqld,可能是流量涨了或有慢查询;如果是不认识的随机名进程(如 kinsing、ddg 这类),大概率中了挖矿病毒,赶紧断网查杀。
只有一两个核心满、其他空闲 → 可能是单线程程序跑满单核,加核数没用,得优化程序。
第二步:看内存
按 M 按内存排序。Mem 条绿色接近满、Swp 也在涨 → 内存不足。1 核 1G 的机器跑 MySQL + PHP + Redis 三件套,内存爆是常态——要么升级到 2G,要么精简服务。
第三步:看负载 Load Average
右上角三个数字是 1 分钟、5 分钟、15 分钟平均负载。粗略判断:负载长期超过 CPU 核心数,系统就在排队。比如 1 核机器负载 4.0,说明有 4 倍任务在等 CPU,卡是必然的。
第四步:树形视图找关联
按 t 切换树形视图,看进程父子关系。网站卡的时候,经常是一个父进程 fork 出几十个子进程把资源吃光,树形视图一眼看出来。php-fpm 子进程数配多了,就是典型。
第五步:超出 htop 范围的,用专科工具
htop 看不到硬盘 IO 和网络细节,配合这几个:
sudo iotop # 看哪个进程在狂读写硬盘
sudo iftop # 看实时网络流量
sudo nethogs # 按进程看流量占用
网站慢但 CPU 内存都正常,多半是硬盘 IO 瓶颈(便宜 VPS 的通病)或带宽跑满,iotop/iftop 一看便知。
自定义:把 htop 调成你的样子
按 F2 进入设置,可以:
- Columns:增删显示列,建议加上
IO_READ_RATE、IO_WRITE_RATE,硬盘读写一目了然。 - Display options:勾选"Hide kernel threads",界面清爽很多。
- Colors:换个顺眼的配色,长时间看不累。
配置存在 ~/.config/htop/htoprc,配好一次,终身受用。换机器直接把这个文件拷过去。
htop 的盲区:长期趋势
htop 是实时工具,关掉就没了。想看历史趋势,得用别的:
- sar:系统自带的历史记录,
sar -u看 CPU 历史,sar -r看内存历史,适合事后复盘"昨晚几点开始卡的"。 - netdata:装一个,浏览器看实时曲线,漂亮又详细,个人小站够用。
- Prometheus + Grafana:重型方案,多台机器、有业务收入再考虑。
分工明确:htop 负责"现场抓凶手",历史曲线靠别的工具。别指望一个工具干所有事。
几个常见误区
误区一:缓存占用高 = 内存不够
htop 里 Mem 条蓝色部分是缓存,Linux 主动用空闲内存加速文件读写,需要时自动释放。别看到"内存用了 90%“就慌,看 Swap 和可用内存才是正经判断。
误区二:CPU 偶尔 100% 就要升级
突发 100% 很正常,关键是持续。htop 里盯 5 分钟,一直满格才是真瓶颈。网站被爬虫爆刷时 CPU 也会满,装个限流比升级配置便宜。
误区三:只看不记
现场看到凶手,顺手记下来:进程名、时间、当时在干什么。下次再犯,直接对照。运维经验就是这么攒出来的。
实战案例:一次完整的排查记录
光讲理论不够看,来个真实场景的排查记录。某天晚上,博客打开要 5 秒,按流程走:
1. htop 看资源
CPU:4 个核心,3 个空闲、1 个 90%。内存:用了 60%,Swap 没动。负载:2.5(4 核机器,偏高但不离谱)。
2. 按 P 排序找凶手
第一名是 mysqld,CPU 85%,TIME+ 很大。再看树形视图,mysqld 下面没有异常子进程,是它自己在忙。
3. 查 MySQL 在忙什么
# 登录 MySQL 看当前在跑的查询
SHOW FULL PROCESSLIST;
发现一条慢查询卡了 200 秒,是一条没加索引的统计查询。博客插件自动跑的。
4. 解决
给那张表加了索引,查询从 200 秒降到 0.1 秒,网站恢复。全程没升级配置,一分钱没花。
这个案例说明:htop 找到"谁在吃资源”,剩下的就是顺藤摸瓜。大部分性能问题,根子都在应用层,不在配置。
htop 看不出的东西
htop 很强,但也有盲区,提前知道:
- 硬盘 IO 等待:htop 顶部看不到 iowait,得用
iotop或sar -d。网站慢但 CPU 不高,八成是硬盘在排队。 - 网络带宽:htop 不显示流量,用
iftop、nethogs。带宽跑满和 CPU 跑满,症状很像,工具不同。 - 历史数据:htop 关掉就没了。想知道"昨晚几点开始卡的",得靠 sar 的历史记录或 netdata。
- 容器内部:宿主机 htop 能看到容器进程,但分不清哪个容器在吃资源。用
docker stats看容器级别的占用。
工具箱要配齐:htop 管 CPU 内存,iotop 管硬盘,iftop 管网络,docker stats 管容器。各管一摊,排查不抓瞎。
按场景看:三种典型负载长什么样
htop 看多了,你会发现卡顿就三种长相,对号入座:
CPU 密集型:所有核心飘红
表现:CPU 条全满,负载高,内存正常。常见于:视频转码、压缩打包、大计算量脚本。 对策:优化程序(换更高效的算法)、加核心、或把任务扔到配置更高的机器上。1 核机器跑转码,神仙也救不了。
内存密集型:Mem 满、Swap 在涨
表现:内存绿色部分接近 100%,Swap 缓慢增长,系统偶尔卡死。常见于:Java 应用、MySQL 大查询、Docker 开太多。 对策:加内存是最直接的;或者减服务、调参数(比如调小 MySQL 的 buffer pool、JVM 堆内存)。
IO 密集型:CPU 空闲但就是卡
表现:CPU 不高、内存够用,但操作反应慢,htop 里看不出问题。常见于:便宜 VPS 的共享硬盘、数据库大量读写。
对策:iotop 确认是哪个进程在读写;换 NVMe 硬盘的商家;数据库加索引、加缓存,减少硬盘压力。
记住这个口诀:CPU 看条,内存看 Swap,IO 看 iotop。
htop 配置文件详解
~/.config/htop/htoprc 是 htop 的配置文件,文本格式,可以直接改:
# 看当前配置
cat ~/.config/htop/htoprc
# 几个常用选项的含义
# hide_kernel_threads=1 隐藏内核线程
# hide_userland_threads=1 隐藏用户线程
# tree_view=1 默认树形视图
# sort_key=PERCENT_CPU 默认按 CPU 排序
换机器时把这个文件拷过去,习惯无缝迁移。重装系统前记得备份它——小文件,大作用。
内存详解:htop 里的每一种内存
Mem 条五颜六色,到底都是啥?一次讲清:
- used(绿色):程序实打实占用的,重点关注这个
- buffers(蓝色):块设备缓存,系统自动管理,不用管
- cache(黄色):文件缓存,系统自动管理,不用管
- shared:共享内存,多进程共用的部分
- available:真正可用的 = 空闲 + 可回收的缓存,看这个判断够不够
新手口诀:别看 used 多高,看 available 剩多少。available 长期低于 10%,才是真不够。
还有个细节:htop 默认显示的 MEM% 是按 used 算的,和系统实际压力可能有出入。心里有数就行,别被数字吓到。
CPU 详解:每个数字的意思
CPU 条的颜色密码,再展开讲讲:
- 绿色(user):用户程序占用,正常业务就该是绿的
- 红色(system):内核占用,偶尔红正常,一直红说明系统调用频繁,可能有问题
- 蓝色(nice):低优先级进程,系统忙时先被牺牲
- 橙色(steal):被宿主机/邻居抢走的时间,VPS 用户重点看这个
- 灰色(idle):空闲,越多越好
steal time 单独说一句:这是虚拟化环境特有的。宿主机 CPU 不够分,你的 vCPU 想跑但跑不上,htop 里显示为橙色。偶尔几个点正常,长期 20%+,说明商家超售严重——CPU 数字再好看也白搭,考虑换商家。
新手常见报错
报错一:htop: command not found
没安装。按前面的安装命令装一个。最小化系统(如 Alpine、Debian netinst)默认都没带,正常。
报错二:界面显示错乱
终端窗口太小,或者 TERM 环境变量不对。把终端窗口拉大,或者:
export TERM=xterm-256color
htop
报错三:看不到完整命令行
Command 列被截断,按左右箭头滚动,或者按 F2 → Columns 把 Command 列调宽。进程启动参数很长时,这个操作很常用。
报错四:htop 里杀不掉进程
先确认你有权限(普通用户杀不了 root 的进程,加 sudo htop)。再确认信号选对了:SIGTERM 不行再 SIGKILL。还杀不掉的,可能是 D 状态(不可中断睡眠),一般是硬盘 IO 卡死,重启机器吧。
报错五:颜色看不清
浅色终端下 htop 默认配色可能看不清,按 F2 → Colors 换一套配色(比如 Light 背景选对应的主题)。长时间看,配色顺眼很重要。
小够的建议
买 VPS 之前,先想清楚你要跑什么;跑起来之后,定期 htop 看一眼。很多"配置不够"其实是"配置没用对"——1 核 2G 跑个博客绰绰有余,跑不起来多半是哪里配错了。
记住:监控是运维的第一步,先看明白,再花钱。 这就是够用主义在运维上的体现。
常见问题
问:htop 和 top 有什么区别? 答:htop 是 top 的增强版:彩色界面、支持鼠标、可以直接杀进程、树形视图更直观。功能上 top 都能做到,但 htop 用起来舒服得多,新手建议直接学 htop。
问:VPS 上 htop 显示的 CPU 是真实的吗? 答:是宿主机分给你的 vCPU。注意便宜 VPS 有超售可能,htop 显示 CPU 空闲但实际卡顿,可能是邻居在抢资源——橙色 steal time 就是干这个的,长期偏高可以考虑换商家。
问:内存一直涨,重启就好,过几天又涨,是什么问题? 答:典型的内存泄漏。htop 按 MEM% 排序找到嫌疑进程,查它的日志和版本,该升级升级、该加定时重启就加。治标靠重启,治本靠修程序。
问:Swap 应该开多大? 答:个人小站开 1-2G 做缓冲就行。Swap 是救命绳不是日常用品,长期依赖 Swap 说明内存真不够了,该加内存而不是加 Swap。
问:有没有比 htop 更强的工具?
答:有,但场景不同。iotop 看硬盘 IO,iftop 看网络流量,nethogs 按进程看流量。htop 是综合体检,这几个是专科检查,配合着用。