Skip to content

Linux 常用命令与性能排查工具 ​

考频 ⭐⭐⭐。这类题的套路是:不背命令全集,而是背「一个现象 → 一套排查链路」。面试官要的是「你线上遇到过 CPU 打满 / 内存泄漏 / IO 抖动,怎么一步步定位」,而不是让你把 man 背下来。本页给出按用途分类的速查表 + 四套排查模板 + 高频问答。

一句话总览 ​

排查问题的通用链路:先看整体指标(top / free / iostat / ss)→ 定位到具体进程(pidstat / lsof)→ 深入到线程或系统调用(top -H / strace / perf)→ 结合代码(gdb)。 记住三个维度:CPU、内存、IO / 网络;再加一个观察对象:进程、线程、文件、socket。

一、进程与负载 ​

命令典型用法一句话说明
psps aux / ps -ef / ps -eLf进程快照;-eLf 显示线程(LWP)
top / htoptop 然后按 H 展开线程、P 按 CPU 排、M 按内存排实时资源视图,排查第一站
pidstatpidstat -u 1、pidstat -t -p PID 1按进程 / 线程持续采样 CPU、内存、IO
uptimeuptime看 1 / 5 / 15 分钟平均负载(load average)
nice / renicenice -n 10 cmd、renice -n -5 -p PID调整静态 / 动态优先级(-20 最高、19 最低)
kill / pkillkill -9 PID、pkill -f name发信号;-9 强杀(SIGKILL),优先用 -15(SIGTERM)

负载高 ≠ CPU 忙:load 统计的是**运行 + 不可中断睡眠(D 状态,多为等 IO)**的进程数。load 高但 CPU 空闲,通常是 IO 卡住了。

二、内存 ​

命令典型用法一句话说明
freefree -h看总览;重点看 available 而非 free(buff/cache 可回收)
vmstatvmstat 1看 si/so(换入换出)、r(运行队列)、b(阻塞)、wa(IO 等待)
pmappmap -x PID按内存段看某进程的映射与 RSS
/proc/PID/smapscat /proc/PID/smaps逐段内存明细(Rss/Pss/Private 等),定位谁在涨
valgrindvalgrind --leak-check=full ./a.out检测内存泄漏 / 非法读写(慢,适合离线调试)

三、磁盘与 IO ​

命令典型用法一句话说明
dfdf -h / df -i看空间与 inode 占用(inode 满也会写不进去)
dudu -sh * / du -ah dir | sort -h递归统计目录占用,找「谁把盘吃满了」
iostatiostat -x 1看每块盘的 %util、await、r/s、w/s
iotopiotop -oPa按进程 / 累计看谁在读写磁盘
fiofio --name=t --rw=randread --size=1G ...压测磁盘 IOPS / 带宽(基准测试)

四、网络 ​

命令典型用法一句话说明
ssss -lntp / ss -s / ss -tn state establishednetstat 的现代替代,更快,看连接 / 监听 / 汇总
netstatnetstat -anp / netstat -tulnp老牌工具,看端口与连接(多数系统已由 ss 取代)
lsoflsof -p PID / lsof -i :8080列出进程打开的文件 / 端口(一切皆文件的取证利器)
iftopiftop -i eth0实时看哪对 IP 在占用带宽
tcpdumptcpdump -i any port 80 -w a.pcap抓包,配合 Wireshark 分析协议细节
curlcurl -v / curl -o /dev/null -s -w '%{time_total}\n' URL请求并输出各阶段耗时,接口调优必备

五、跟踪与调试 ​

命令典型用法一句话说明
stracestrace -p PID -f -T / strace -c cmd跟踪系统调用与信号;-c 统计耗时,-T 显示每调用耗时
ltraceltrace -p PID跟踪库函数调用(如 malloc/free)
perfperf top / perf record -g + perf report采样 CPU,火焰图定位热点函数
gdbgdb -p PID 然后 thread apply all btattach 到进程,查看所有线程调用栈,定位卡死 / 崩溃
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 只到进程粒度。要下沉到线程:

  1. top -H -p <PID>(H 切换线程视图),或 ps -eLf,或 pidstat -t -p <PID> 1,找到 TID;
  2. 把 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。

相关 ​

糌粑的面经笔记 · VitePress 版