1. 先看整体健康状况和内核日志直接排除硬件故障或内核panic。# 1. 查看 Load Average 是否远超 CPU 核心数和 系统运行时间uptime# 2. 看available可用内存是否见底。看swap是否被大量占用。如果 swap 正在被频繁读写说明物理内存早已被榨干系统正处于极度卡顿的“颠簸”状态。free -h# 3. 【最重要】查看内核最后输出的几十条日志硬件错误、OOM、磁盘报错dmesg -T | tail -20快速判断若dmesg出现Out of memory、I/O error、segfault直接定位根因不用往下看2. cpu、内存、进程sudo ps aux | sort -rn -k 3 | headsort -rn -k 3该命令中的-rn的r表示是结果倒序排列n为以数值大小排序而-k 3则是针对第3列的内容进行排序第三列是 cpu第四列是内存再使用head命令获取默认前10行数据。(其中的|表示管道操作)如果free -h显示可用内存available很少且交换分区swap使用量飙升说明内存压力大。# 查看内存占用 TOP 10 的进程按RSS排序 sudo ps aux --sort-%mem | head -10 # 查看具体内存映射若怀疑某个进程 cat /proc/[PID]/smaps | grep -i pss | sort -nr | head -10提示如果系统突然变慢但内存剩余较多检查cat /proc/meminfo | grep -i Dirty脏页过多说明磁盘I/O刷写阻塞了内存分配。按内存升序排列ps aux --sortrss按CPU降序排列ps aux --sort-%cpu--sort[|-] key“”字符是可选,因为默认地是按数字升序或者词典顺序.toptop -d 1按P按 CPU 使用率排序按M按内存使用率排序运行中按c可以随时切换是否显示完整命令 【常用】点亮显示先按b 再按x按z 反色显示按 找帮助在 top 中紧盯这三项%us用户态高 → 业务应用如Java/Python死循环或计算密集。%sy内核态高20%→ 系统调用频繁可能是上下文切换过高用vmstat 1 5查看cscontext switch列。%waI/O等待高 →CPU在等磁盘问题转向下面的磁盘排查。僵尸进程zombie数量不为0用ps aux | grep Z找出父进程。看top里排在最前面的进程PID看它是 CPU 飙高还是处于D状态不可中断睡眠通常意味着卡在磁盘 I/O 上。3. 磁盘如果top中%wa高或者应用响应卡顿立即执行# -x 显示扩展信息1 表示间隔1秒2 表示输出2次iostat -x 1 2iostat -dxk 1vmstat 1看vmstat的procs下面的b列等待输入输出的进程数。如果b大于 0说明有进程卡在磁盘写入上。关键列%util接近 100% → 磁盘设备饱和带宽打满。await平均等待时间 20ms 表明磁盘响应慢 100ms 表明严重I/O拥堵。查找具体哪个进程在读写sudo iotop -o直接列出实际产生I/O的进程。df -h -x tmpfs -x devtmpfsdf -i看是否有分区的Use%达到了100%看IUse%Inode 使用率是否达到了 100%df -T这是最直接的方法可以查看所有已挂载文件系统的类型cat/proc/filesystems查看系统支持的文件系统类型。如果一个文件系统被标记为nodev表示它不需要关联物理设备如虚拟文件系统、网络文件系统案例磁盘爆满使用率已经100%了、I/O 锁死或根目录极度迟钝时怎么找出哪个目录过大解决方法的核心逻辑是通过将底层块设备挂载到一个干净、全新的挂载点如/mnt绕过了原有挂载点上可能存在的繁重业务 I/O 读写和软链接干扰。在 Linux 运维中被称为“影子挂载”或“双重挂载”。它的核心精妙之处在于在 Linux 中同一个底层块设备Block Device是可以同时被挂载到多个不同的目录挂载点上的。[rootkaifa ~]# df -h Filesystem Size Used Avail Use% Mounted on ... /dev/mapper/cl-root 37G 17G 21G 46% / /dev/sdb2 976G 164G 745G 19% /var正常状态下/dev/sdb2挂载在/var上。所有业务程序如 Nginx、MySQL都通过/var这扇大门向磁盘写入数据。此时这扇门人满为患I/O 请求排起长队大门文件系统元数据锁被严重占用。影子挂载后你执行mount /dev/sdb2 /mnt相当于为同一个物理盘又开了一扇叫/mnt的“后门”。当你通过/mnt进去时你看到的内容和/var完全一样但你走的是一条完全没有业务流量堵塞的专用绿色通道。为什么能绕过“繁重的业务 I/O 读写”当磁盘 100% 满且有程序疯狂写入时原挂载点如/var会面临严重的元数据锁Metadata Lock竞争。在原目录查找的困境如果你直接在/var下执行du -sh系统不仅要读取文件大小还要频繁与正在疯狂写入的业务进程竞争目录的读取锁。由于 I/O 已经满载du命令发送的内核请求只能在队列里死等表现出来就是命令完全卡死。在影子目录查找的优势文件系统如 Ext4、XFS内部有不同的路径缓存和索引机制。通过/mnt访问时你避开了原目录树Directory Tree上被高频修改的节点锁。虽然底层的物理磁头/固态硬盘通道依然繁忙但在操作系统内核的软件层面你成功绕过了严重的进程上下文切换和文件锁挂载点阻塞从而能以快得多的速度返回结果。处理过程# 配合“只读挂载ro”实现完美隔离 mount -o ro /dev/sdb2 /mnt 或者 mount /dev/sdb2 /mnt mount --bind /dev/sdb2 /mnt # 挂载成功后你就可以直接进入 /mnt/ 开启你的超速排查通道了 du -h -x --max-depth1 /mnt/ 2/dev/null | sort -hr | head -n 10 # 加上 -x (或 --one-file-system) 参数可以让 du 只在当前文件系统内扫描绝对不跨越到其他分区或挂载点 find / -xdev -type f -size 500M 2/dev/null | xargs du -h | sort -hr | head -n 10 # -xdev同样是限制在当前文件系统内不跨分区。 方法一 find -maxdepth 1 -print0 | xargs -0i du -hs {} | sort -rh | head -11 | cut -f2 | xargs -i du -hs {} # find -maxdepth 1 -print0在当前目录深度为 1不往子目录深挖查找所有文件和文件夹。-print0 表示用 \0空字符作为分隔符这是为了防止文件名里有空格导致命令断开。 # xargs -0i du -hs {}-0 配合前面的 print0 接收空格文件名i 和 {} 配合把前面找到的路径一个一个喂给 du -hs计算人类可读的大小如 1G, 500M。 mount /dev/sdb2 /mnt/ cd /mnt/ find -maxdepth 1 -print0 | xargs -0i du -hs {} | sort -rh | head -11 | cut -f2 | xargs -i du -hs {} cd umount /mnt/ exit 方法二 根据cat /etc/fstab |grep -v ^# 排除不是真正在/ 目录的文件特别地 要去掉bind方式挂载的目录。 du -h /* --max-depth0 \ --excludehome \ --excludevar \ --excluderesult \ --excludepkg \ --excludecephfs 2/dev/null | grep G找出已被删除但仍被进程占用的文件lsof L1# 或者使用下面这个更直观的命令lsof | grep deleted输出结果中会显示进程名COMMAND、进程 PID 以及被删除的文件名带有(deleted)字样。抓到罪魁祸首比如 PID 为1234的 nginx 进程后你有两种处理方式1. 重启该服务或让其重载配置。2. 在线清空如果不能重启服务如果该进程在持续写入且不能停机可以通过它的 PID 直接在/proc目录下将其文件内容清空#文件描述符 ID 可以在lsof的FD列看到通常是个数字echo /proc/1234/fd/文件描述符ID# 或者不删文件释放空间echo /var/log/app.log /var/log/app.log# 用chattr锁死文件不准任何进程写入chattr i /var/log/app.log# 解锁chattr -i /var/log/app.log4. 网络如果应用返回超时或连接失败快速检查网络层面。# 1. 查看所有监听端口及连接状态比 netstat 快ss -tulnp# 2. 统计 TIME_WAIT 或 CLOSE_WAIT 堆积大量 CLOSE_WAIT 是代码未关闭连接ss -ant | awk {print $1} | sort | uniq -csudo ss -antp | grep CLOSE-WAIT | awk {print $NF}# 3. 检查网卡丢包和错误eth0替换为实际网卡名ip -s link show eth0特殊情况如果ifconfig显示overruns或dropped数量暴增说明网卡缓冲区不足或硬件队列溢出。查看 TCP 汇总ss -s -t查看 UDP 汇总ss -s -uss -s快速查看整机所有网络连接数量概览排查 TIME_WAIT、连接数过高问题。是否有大量的TIME-WAIT遭遇并发洪峰或CLOSE_WAIT应用程序代码网络泄漏。5. 其它sudo grep -RniE critical|error|fatal|panic|exception /var/log/messages | grep -v ACPI Error ps -ef |grep thanos sudo grep -E thanos\[12096\]: /var/log/messages # 查看是否有 D 状态进程重点看 WCHAN 栏卡在哪个内核函数如 rwsem_down_write_failed, blk_wait_io, 进程正在内核中等待什么资源显示等待的内核函数名 ps -eo pid,ppid,stat,wchan,comm | grep -w D # 查看 I/O 队列长度和等待时间如果 await 达到几百毫秒甚至上千毫秒说明 I/O 彻底挂了 iostat -x 1 106. 查看Linux上启用的服务需求推荐命令 (systemd系统)备选命令 (SysVinit系统)查看正在运行的服务systemctl list-units --typeservice --staterunningservice --status-all查看开机自启的服务systemctl list-unit-files --typeservice --stateenabledchkconfig --list查看特定服务的状态systemctl status 服务名service 服务名 status如果不确定你的系统使用的是systemd还是SysVinit可以运行pstree -p | head -n 2或ps -p 1来查看。如果输出中包含systemd则说明系统使用的是systemd。