Appearance
Linux 常用命令与性能排查工具
考频 ⭐⭐⭐。这类题的套路是:不背命令全集,而是背「一个现象 → 一套排查链路」。面试官要的是「你线上遇到过 CPU 打满 / 内存泄漏 / IO 抖动,怎么一步步定位」,而不是让你把
man背下来。本页给出按用途分类的速查表 + 四套排查模板 + 高频问答。
一句话总览
排查问题的通用链路:先看整体指标(top / free / iostat / ss)→ 定位到具体进程(pidstat / lsof)→ 深入到线程或系统调用(top -H / strace / perf)→ 结合代码(gdb)。 记住三个维度:CPU、内存、IO / 网络;再加一个观察对象:进程、线程、文件、socket。
一、进程与负载
| 命令 | 典型用法 | 一句话说明 |
|---|---|---|
ps | ps aux / ps -ef / ps -eLf | 进程快照;-eLf 显示线程(LWP) |
top / htop | top 然后按 H 展开线程、P 按 CPU 排、M 按内存排 | 实时资源视图,排查第一站 |
pidstat | pidstat -u 1、pidstat -t -p PID 1 | 按进程 / 线程持续采样 CPU、内存、IO |
uptime | uptime | 看 1 / 5 / 15 分钟平均负载(load average) |
nice / renice | nice -n 10 cmd、renice -n -5 -p PID | 调整静态 / 动态优先级(-20 最高、19 最低) |
kill / pkill | kill -9 PID、pkill -f name | 发信号;-9 强杀(SIGKILL),优先用 -15(SIGTERM) |
负载高 ≠ CPU 忙:
load统计的是**运行 + 不可中断睡眠(D 状态,多为等 IO)**的进程数。load 高但 CPU 空闲,通常是 IO 卡住了。
二、内存
| 命令 | 典型用法 | 一句话说明 |
|---|---|---|
free | free -h | 看总览;重点看 available 而非 free(buff/cache 可回收) |
vmstat | vmstat 1 | 看 si/so(换入换出)、r(运行队列)、b(阻塞)、wa(IO 等待) |
pmap | pmap -x PID | 按内存段看某进程的映射与 RSS |
/proc/PID/smaps | cat /proc/PID/smaps | 逐段内存明细(Rss/Pss/Private 等),定位谁在涨 |
valgrind | valgrind --leak-check=full ./a.out | 检测内存泄漏 / 非法读写(慢,适合离线调试) |
三、磁盘与 IO
| 命令 | 典型用法 | 一句话说明 |
|---|---|---|
df | df -h / df -i | 看空间与 inode 占用(inode 满也会写不进去) |
du | du -sh * / du -ah dir | sort -h | 递归统计目录占用,找「谁把盘吃满了」 |
iostat | iostat -x 1 | 看每块盘的 %util、await、r/s、w/s |
iotop | iotop -oPa | 按进程 / 累计看谁在读写磁盘 |
fio | fio --name=t --rw=randread --size=1G ... | 压测磁盘 IOPS / 带宽(基准测试) |
四、网络
| 命令 | 典型用法 | 一句话说明 |
|---|---|---|
ss | ss -lntp / ss -s / ss -tn state established | netstat 的现代替代,更快,看连接 / 监听 / 汇总 |
netstat | netstat -anp / netstat -tulnp | 老牌工具,看端口与连接(多数系统已由 ss 取代) |
lsof | lsof -p PID / lsof -i :8080 | 列出进程打开的文件 / 端口(一切皆文件的取证利器) |
iftop | iftop -i eth0 | 实时看哪对 IP 在占用带宽 |
tcpdump | tcpdump -i any port 80 -w a.pcap | 抓包,配合 Wireshark 分析协议细节 |
curl | curl -v / curl -o /dev/null -s -w '%{time_total}\n' URL | 请求并输出各阶段耗时,接口调优必备 |
五、跟踪与调试
| 命令 | 典型用法 | 一句话说明 |
|---|---|---|
strace | strace -p PID -f -T / strace -c cmd | 跟踪系统调用与信号;-c 统计耗时,-T 显示每调用耗时 |
ltrace | ltrace -p PID | 跟踪库函数调用(如 malloc/free) |
perf | perf top / perf record -g + perf report | 采样 CPU,火焰图定位热点函数 |
gdb | gdb -p PID 然后 thread apply all bt | attach 到进程,查看所有线程调用栈,定位卡死 / 崩溃 |
bash
# 一个典型的「进程卡住」排查组合
gdb -p <PID> -batch -ex 'thread apply all bt' # 看所有线程栈
strace -p <PID> -f -T -tt # 看卡在哪个系统调用六、排查思路模板(面试重点)
模板 1:CPU 100% 怎么查
text
1. top → 看整体:是 us(用户态)高,还是 sy(内核态)高?
2. top -H -p <PID> 或 pidstat -t -p <PID> 1
→ 找到占用最高的线程 TID(线程 id)
3. 定位线程在干什么:
- 内核态高 / 卡系统调用 → strace -p <TID>
- 用户态高(算得凶) → perf top / perf record -g,看热点函数
- 死循环 / 卡死 → gdb -p <PID>,thread apply all bt 看栈
4. 结合代码:看该函数为何不退出(缺 sleep、锁自旋、正则回溯、序列化大对象…)模板 2:内存持续上涨怎么查
text
1. free -h → 是 free 少,还是 buff/cache 正常占用?(别误判)
2. 按进程排:ps aux --sort=-rss | head
3. 看进程内部:pmap -x <PID>,或 cat /proc/<PID>/smaps | grep -E 'Rss|Private'
4. 是否泄漏:valgrind --leak-check=full(离线),或观察 RSS 是否单调递增
5. 常见根因:容器未释放、缓存无上限、句柄/连接未关闭(配合 lsof 看 fd 数)模板 3:IO 居高不下怎么查
text
1. iostat -x 1 → 看 %util 接近 100%?await 是否很大?(盘被压满)
2. iotop -oPa → 找到读写最猛的进程
3. 进一步:strace 或 lsof 看它在读写哪些文件
4. 判断:是应用疯狂刷盘(写日志 / fsync 过多),还是换页(vmstat 的 si/so 不为 0)
5. 优化方向:缓存、批量写、异步落盘、换 SSD / 调 io 调度器模板 4:端口被占用怎么查
bash
ss -lntp 'sport = :8080' # 直接看谁在监听 8080
lsof -i :8080 # 等价,列出占用端口的进程
fuser -n tcp 8080 # 另一种查法七、高频问答(Q&A)
Q1. 如何查看某个进程打开了哪些文件 / 端口?
答案
用 lsof -p <PID> 列出该进程打开的所有文件描述符(含普通文件、socket、管道)。只看网络可加 -i:lsof -p <PID> -i。 也可以直接看 /proc/<PID>/fd/ 目录里的符号链接,或 ls -l /proc/<PID>/fd | wc -l 统计 fd 数量(fd 泄漏就是这么查出来的)。
易错点:fd 泄漏(打开不关)会先耗尽进程的 fd 上限(ulimit -n),表现为 Too many open files,此时用 lsof -p 看哪类 fd 在堆积。
Q2. 如何定位 CPU 占用高的线程?
答案
top 只到进程粒度。要下沉到线程:
top -H -p <PID>(H切换线程视图),或ps -eLf,或pidstat -t -p <PID> 1,找到 TID;- 把 TID 转成 16 进制(
printf '%x\n' <TID>),再在gdb里thread apply all bt或 jstack(Java)里按 nid 匹配,就能看到该线程的执行栈。
一句话:top -H 找线程 → 栈回溯找代码。
Q3. 平均负载(load average)到底是什么意思?
答案
uptime 里的三个数是过去 1 / 5 / 15 分钟的可运行 + 不可中断睡眠进程的平均数。它衡量的是「系统压力」,包含等 IO 的进程,所以:
- load 高 + CPU 利用率高 → 计算密集;
- load 高 + CPU 空闲 → 多半卡在 IO(看
vmstat的b、wa)。 经验值:load 持续超过 CPU 核数才需要警惕(乘上一个容忍系数)。
Q4. vmstat 输出里哪些列最关键?
答案
r(运行队列长度,超过核数说明 CPU 排不上)、b(阻塞进程数)、si/so(内存换入换出,非 0 说明内存压力大、在用 swap)、wa(IO 等待占比)。这几个一出现异常,基本就指向 CPU 争抢、内存不足或磁盘瓶颈。
Q5. strace 和 perf 有什么区别,各用在哪?
答案
strace 跟踪系统调用(用户态与内核边的边界),适合查「程序卡在哪个 syscall」「fopen 了哪些文件」「为啥报 ENOENT」。开销大,是「慢速放大镜」。 perf 基于 CPU 采样,适合查「CPU 花在哪个函数上」,能出火焰图,开销相对小。 一句话:行为不对用 strace,性能不对用 perf。