linux服务变慢需系统性下钻排查:先查资源水位(cpu、内存、磁盘i/o、网络),再查内核行为(中断、上下文切换、锁竞争),接着盯进程内部(线程状态、系统调用、句柄、堆栈),最后验外部依赖(dns、数据库、rpc、存储)。

Linux服务变慢,不能只盯着应用日志或CPU使用率看。要系统性地从资源层、内核层、应用层逐级下钻,才能快速定位根因。
看资源水位:CPU、内存、磁盘I/O、网络是否打满
先用基础命令快速摸底:
- top / htop:看整体CPU负载(Load Average)和单个进程CPU%;注意区分us(用户态)、sy(内核态)、wa(I/O等待)——若wa高,说明磁盘慢是瓶颈
- free -h:关注available内存是否充足;若free极低且swap被大量使用,可能触发频繁换页(page in/out),拖慢所有进程
- iostat -x 1:重点看%util(接近100%表示设备饱和)、await(单次I/O平均耗时,>10ms需警惕)、r/s/w/s(读写频次突增常对应业务异常)
- ss -s 或 netstat -s:检查TCP重传、连接队列溢出(如listen overflows)、TIME_WAIT堆积等网络层问题
查内核行为:中断、上下文切换、锁竞争是否异常
资源没打满但服务仍卡?可能是内核调度或硬件交互出了问题:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- vmstat 1:观察cs(每秒上下文切换次数),突增10倍以上,说明进程/线程频繁抢占CPU,可能由锁争用或短周期定时器导致
- cat /proc/interrupts:检查某CPU上硬中断(如网卡、磁盘)是否严重不均衡;单核中断过高会拖慢该CPU上所有任务
- perf top -g:直接看到内核栈热点,比如卡在__fget_light(文件描述符查找慢)、mutex_spin_on_owner(互斥锁自旋等待)、tcp_transmit_skb(TCP发包慢)等,可精准指向内核路径瓶颈
盯进程内部:线程状态、系统调用、文件句柄、内存分配
锁定具体进程后,深入其运行时行为:
- ps -T -p $PID + top -H -p $PID:查看线程级CPU占用,确认是否某线程死循环或阻塞
- strace -p $PID -e trace=network,file,io -T:捕获系统调用耗时,例如read()卡住几秒,说明后端存储或网络依赖超时;open()慢可能因目录项缓存失效或权限检查复杂
- lsof -p $PID | wc -l 和 cat /proc/$PID/limits:检查文件描述符是否接近上限,导致新连接/文件打开失败而重试卡顿
- pstack $PID 或 gdb -p $PID -ex "thread apply all bt" -ex quit:获取所有线程堆栈,识别常见卡点:如Java应用停在Object.wait(线程池满)、Go程序卡在runtime.futex(goroutine调度阻塞)
验外部依赖:DNS、数据库、RPC、存储挂载点
很多“慢”本质是下游响应延迟传导上来:
- dig +short domain 或 time nslookup domain:验证DNS解析是否超时或返回异常IP
- telnet host port 或 nc -zv host port:测试端口连通性与基础延时;结合tcpdump抓包看SYN是否被丢弃、ACK是否延迟
- df -h 和 findmnt:检查挂载点是否stale(NFS卡住)、磁盘是否只读、空间是否100%(尤其/var/log或/tmp)
- 对数据库类依赖,用mysqladmin ping、pg_isready或直连执行SELECT 1,排除连接池耗尽或查询队列积压
排查不是线性流程,而是假设驱动的闭环:观察现象 → 提出根因假设 → 用最小命令验证 → 排除或确认 → 继续下钻。多数线上慢服务问题集中在I/O延迟、锁竞争、DNS失灵、连接数打满这四类,优先覆盖这些点,效率最高。










