Linux运维故障排查:从CPU飙高到磁盘满的定位思路与实战方法
2026/9/15 12:51:58 网站建设 项目流程

1. 遇到故障先别急着敲命令:先建立“故障坐标系”

做了这么多年Linux运维,我最深的体会是:排查故障最难的往往不是解决本身,而是定位。就好比去医院看病,医生不会上来就开药,一定先问诊、再安排检查,最后才下结论。系统出了问题,第一步永远是搞清楚“病在哪个系统、什么表现、什么时候开始的”。

很多人一拿到报错就急着翻搜索引擎或者群里发截图,这样效率其实很低。我自己的习惯是花两到三分钟做一个快速分类,把这个故障放进一个“坐标系”里。

这个坐标系由两个维度组成:

  • 影响范围:是整个服务器挂了,还是某个服务挂了,还是某条网络链路不通?这决定了从哪一层开始查。
  • 故障类型:是性能问题(慢、卡、CPU高),还是可用性问题(宕机、进程退出、端口不通),还是数据问题(文件丢失、磁盘满、权限错乱)?

判断完这两个维度,一个初步的排查方向就出来了。比如“所有用户访问网站都超时”和“单个用户在特定时间段访问慢”,这两者的排查路径是完全不同的。前者要先看网络入口、负载均衡、后端实例存活,后者可能要查数据库慢查询、中间件线程池,甚至要怀疑是不是本地网络的问题。

还有一点我踩过不少坑:变更与故障的强关联。大多数故障都不是无缘无故的。排查前先回想一下,系统最近有没有动过什么?装过什么包、改过什么配置、升级过什么内核、调整过什么防火墙规则、做过分区扩容?哪怕只是觉得“可能顺手改了一下”,也要当作一个重要线索去确认。我见过太多案例,最后定位到根因的时候才发现,就是前一天随手改了一个参数或者重启了一个依赖服务导致的。把变更历史整理清楚,排查时间能缩短一半以上。

有了这个大方向,接下来的每一条命令、每一次排查才是有的放矢的。下面我会按照Linux系统中最常见的几类故障场景,把完整的排查链路和工具用法展开讲清楚。

2. 系统起不来别慌:从开机日志一步步往回推

服务器起不来,是所有运维最不希望遇到的场景,因为影响面最大。但这类问题恰恰是最有规律可循的,因为Linux的启动流程是固定的——固件、引导加载器、内核、init进程、服务启动。只要按照这个链路一层层往回排查,基本都能找到问题所在。

2.1 启动卡住的位置,就是问题所在的方向标

开机过程中如果卡住了,注意观察卡在哪个阶段:

  • 如果是硬件自检阶段就卡住,或者直接黑屏,那大概率是硬件问题,比如内存条松动、硬盘掉盘、电源供电不稳。先去机房或者通过带外管理看硬件状态指示灯。
  • 如果过了自检,但在GRUB引导界面卡住,多半是引导配置损坏或磁盘分区表异常。
  • 如果内核已经开始加载,屏幕上滚过了很多内核日志然后卡死,那要重点看最后几行输出,通常内核会打印出它卡在哪个驱动或哪个设备上。
  • 如果是内核加载完成,但进入systemd阶段后卡住,那可能是某个关键服务启动失败或者在等待超时。

判断出大致位置之后,再看日志就有的放矢了。很多故障重启一次复现不了,就是因为没在卡住的当下抓住现场。

2.2 进入救援模式的几种手段

系统起不来,不代表救不回来。最常见的办法是使用系统安装盘或者Live CD进入救援模式。具体步骤如下:

  1. 通过带外管理(如iLO、iDRAC、IPMI)挂载系统安装镜像,从光驱或虚拟光驱引导。
  2. 在安装界面选择“Troubleshooting”,然后选择“Rescue a CentOS system”或类似选项。
  3. 选择已安装的系统分区,通常会挂载到/mnt/sysimage目录。
  4. 执行chroot /mnt/sysimage进入原系统环境。
  5. 此时就可以检查和修复引导问题了。

进去以后的排查动作,按优先级来:

# 查看磁盘分区和挂载情况,确认系统盘是否正常识别 fdisk -l lsblk # 检查GRUB配置文件 cat /etc/default/grub ls /boot/grub2/ # 重新生成GRUB配置(在chroot环境下) grub2-mkconfig -o /boot/grub2/grub.cfg

修复引导是救援模式里最高频的操作。很多情况就是更新内核或者意外修改了GRUB配置导致的。还有一种场景是磁盘满了,导致系统启动时无法写入临时文件或日志,表现为启动卡住或反复重启。在救援模式下先清理临时目录,比如/tmp里的旧文件,释放空间后再重启,问题往往就解决了。

2.3 dmesg和journalctl是启动故障的“黑匣子”

如果系统能起来,只是起来的过程很慢,或者有服务报错,那第一手资料就是内核日志和系统日志。

# 查看内核环形缓冲区日志,重点看硬件错误、驱动加载失败、文件系统报错 dmesg -T | grep -Ei "error|fail|warn|usb|scsi|block" | tail -50 # 查看本次启动之后的系统日志 journalctl -b

我遇到过一台机器,每次开机都要等三到五分钟才能ping通。用dmesg一查,发现是某个网卡驱动反复加载失败,一直在重试,最终靠备份驱动才起来。这类问题不做日志分析根本找不到原因。

journalctl有几个常用参数值得记一下:

# 查看上一次启动的日志(适用于系统重启后排查上一次启动的故障) journalctl -b -1 # 查看指定服务的启动日志 journalctl -u nginx.service # 按优先级过滤,只显示错误及以上级别 journalctl -p err -b

排查启动类故障,我的原则是:先确认能启动到哪一步,再决定从哪个环节入手,绝不盲目重装系统。重装是最不得已的办法,因为它会丢失现场、丢失数据,而且如果网络配置和分区方案是手工做的,重装本身的成本和风险也很高。

3. 应用卡顿和CPU飙高:CPU视角的排查工具链

服务器CPU飙到100%或者load average居高不下,是运维每天都会遇到的高频问题。这一节我不打算简单堆命令,而是想把排查的思路讲清楚——CPU高只是一种现象,背后的原因可能差别很大。

3.1 先分清是“计算密集”还是“进程异常”

拿到一台CPU高的机器,第一步不是杀进程,而是看整体情况。

# 查看系统负载,1分钟、5分钟、15分钟的平均负载 uptime # 按CPU占用排序查看进程 top -c

这里有一个新手容易绕进去的坑:load average高,并不一定代表CPU忙。它统计的是处于可运行状态和不可中断睡眠状态的进程数。如果进程大量卡在磁盘IO上(不可中断的D状态),load也会飙高,但CPU的使用率可能并不高。你跑top%Cpu(s)里的wa列,如果这个数字很高,说明磁盘IO才是瓶颈。

所以拿到一台“卡顿”的机器,第一件事是先看四个数字:load average、CPU使用率、wa(IO等待)占比、内存是否吃紧。这四个数字能帮你快速判断这是CPU瓶颈、IO瓶颈还是内存瓶颈。

3.2 线程级定位:找出真正吃CPU的代码路径

如果确认是CPU占用高,接下来要精确到进程里的线程,再到线程对应的代码或系统调用。这一步才是真正的深度定位。

# top进入后按H键,切换为线程模式,就能看到每个线程的CPU占用 top -H -p <PID> # 把指定进程的线程占用情况排序输出 top -H -b -n 1 -p <PID>

拿到线程ID后,把它转成十六进制:

# 假设线程ID是 12345 printf "%x\n" 12345

这个十六进制数字后面有大用。如果Java应用,可以配合jstack打印线程栈,然后去栈文件里搜这个十六进制nid:

jstack <PID> > /tmp/thread_dump.txt # 在thread_dump.txt中搜索 nid=0x3039

如果是C/C++或者Python的GIL问题,用perf会更直接:

# 以指定进程为目标采样CPU调用栈 perf top -p <PID> # 采样结束后生成火焰图数据 perf record -g -p <PID> -o /tmp/perf.data perf script -i /tmp/perf.data > /tmp/perf.unfold

perf这样用的意义在于,能直接看到CPU时间花在了哪个函数上,而不只是看到哪个进程占用高。实战中我遇到过PHP-FPM进程CPU高,用perf一看,发现是某个扩展的哈希函数在极端数据分布下退化了,根本不是业务代码的问题。如果只看top,最多只能定位到PHP-FPM这个进程,根本没办法继续往下挖。

3.3 CPU排查的经典场景:从现象到结论

我整理几个高频的实际场景,大家可以对照着看。

现象初步判断进一步排查工具
单个进程CPU持续100%可能是死循环或CPU密集计算top -H定位线程,perf采样看调用栈
load很高但CPU不高磁盘IO或内存换页导致D状态进程iostat、vmstat、pidstat -d
CPU使用率忽高忽低可能是定时任务、流量突增、日志刷得太猛crontab -l,结合业务访问日志排查
多核机器,单个核打满可能是单线程应用或者锁竞争mpstat -P ALL,观察是否单核爆满
用户态CPU高业务代码本身计算密集gdb attach、perf top
内核态CPU高(sy列高)系统调用频繁、上下文切换开销大pidstat -w、perf top查看内核函数

这里说一个我个人常用的“三板斧”习惯,遇到CPU问题先跑这三条命令,基本能确定大半:

# 1. 按CPU占用排序,先看是哪个进程 ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%cpu | head -20 # 2. 看这个进程的线程分布 top -H -p <PID> # 3. 再看这个进程在等什么(上下文切换和等待情况) pidstat -w -p <PID> 1 5

CPU问题的排查,核心思维就一句话:从进程到线程,从线程到调用栈,从调用栈到代码行。每一步都是缩小嫌疑范围的过程,而不是盲目杀进程重启。杀进程是最快的“解决”,但如果不定位到根因,同样的故障明天还会来,而且你仍然不知道为什么。

4. 磁盘满了不等于没空间:那些“假满”和真满的区分

磁盘告警是运维最常见的告警之一。df -h一跑,使用率100%,但奇怪的是,du统计下来的所有文件大小加起来,和分区大小对不上。这种时候你如果按照“删大文件”的思路去处理,可能忙活半天,磁盘空间一点也没释放。

4.1 为什么文件删了,空间却没释放

这是网上被问爆了的问题,也是运维必踩的坑。在Linux中,如果一个文件被删除,但仍有进程在持有它的文件描述符,那么文件的inode和磁盘块并不会立即释放。也就是说,从文件系统层面看,这个文件已经不存在了(ls、du都看不到了),但空间被那个进程占着,直到进程关闭文件描述符或者进程退出。

遇到df满了但du找不到大头的情况,第一反应应该是:

# 找出所有已删除但仍被进程占用的文件 lsof | grep deleted

lsof输出的第一列是进程名,第二列是PID,最后一列会标(deleted)。看到了吗,就是这个进程在占用空间。解决办法分两种:

  • 如果这个进程可以重启,重启进程,空间就会释放。
  • 如果进程不能重启,就要看是哪个日志文件被删了,需要想办法在不中断服务的情况下处理。

这种问题最典型的场景是:应用把日志写到/var/log/app.log,运维手工执行了rm /var/log/app.log,但应用进程还开着这个文件的句柄,日志仍在写入这个已经被删除的inode,于是磁盘空间只增不减,前端的表现就是“日志文件没了,但磁盘空间还在减少”。

正确的清空日志方式应该是:

# 用重定向清空文件而不是删除文件 > /var/log/app.log # 或者更优雅的方式 truncate -s 0 /var/log/app.log

这样文件在文件系统层面仍然存在,inode不变,进程持有的文件描述符不会被破坏,空间也释放了。这个小细节,值得每个做运维的人都刻在脑子里。

4.2 inode耗尽:还有空间,但什么都写不进去

另外一个反直觉的“满”是inode满。出现“No space left on device”的报错,可是df -h一看明明还有几个GB。这时候要看的是inode使用率:

df -i

inode是文件系统维护文件元数据的数据结构。每个文件或目录都要占用一个inode。如果小文件特别多,inode会被消耗光,哪怕数据块还有很多剩余,系统也无法再创建新文件。

最常见的元凶是邮件队列、session文件、临时目录里堆积了海量小文件,还有某些应用疯狂写缓存文件但从不清理。处理办法也很直接,找到那个目录,把过期文件清掉。

# 找到inode占用最多的目录 for dir in /var/* /tmp /home; do echo "$dir: $(find $dir -xdev -type f | wc -l)" done # 快速清理一个目录下N天前的文件 find /var/spool/clientmqueue -type f -mtime +7 -delete

还有一个技巧,遇到某些目录文件多到ls都卡的现象时,不要用ls去数文件,直接用find | wc -l或者ls | wc -l也会很慢。可以用find /dir -maxdepth 1 -type f | wc -l,但还是慢。这种极端情况下只能靠目录内部结构来定位,比如按时间分批删,或者干脆用rsync配合--delete的方式同步一个空目录过去清理,速度会快很多。

4.3 磁盘IO慢和“只读文件系统”

还有两类磁盘场景需要单独说。

第一类是IO延迟高。磁盘性能问题的排查思路是看队列长度、等待时间、利用率这几个指标:

# iostat查看各设备的IO情况,重点是await、svctm、util iostat -x 1 5 # 定位哪些进程在大量读写磁盘 iotop -o

util如果长期接近100%,说明磁盘确实在满负荷工作,这时候要考虑升级存储、加缓存或者排查业务上是否有不合理的IO模式。如果util不高但await很高,那可能是磁盘本身有坏道、RAID降级重建,或者同一块盘上有其他虚拟机在抢IO。这些情况靠iostat能看出一些端倪,但最终可能需要结合存储侧的状态来确认。

第二类是文件系统变成只读。这个现象一出现,基本上意味着文件系统发现了严重的元数据错误,或者硬件层面的IO错误。系统会把文件系统挂载为只读来防止进一步损坏。

# 查看挂载状态,ro表示只读 mount | grep " / " # 查看内核日志,通常会有ext4或xfs的报错 dmesg -T | grep -Ei "ext4|xfs|I/O error|remount"

如果确认是硬件故障,先备份能备份的数据,然后联系硬件厂商处理。如果是意外断电导致的文件系统脏状态,可以在救援模式下执行文件系统检查和修复。但这里要特别提醒:修复文件系统前一定先做好数据备份或者镜像,因为fsck这类工具在极端情况下也可能导致数据进一步损失。

# 以只读方式检查文件系统,先看有没有错误 fsck -n /dev/sda1 # 确认无误后再执行修复 fsck -y /dev/sda1

我个人的习惯是,能通过挂载副本或者快照检查的,绝不直接对原盘做修复。云环境就先打快照,物理机就先做磁盘镜像。

5. 网络不通的排查顺序:从网卡到DNS层层拆解

网络故障排查,最大的陷阱是没有顺序。一会儿ping,一会儿看路由,一会儿查DNS,结果乱成一锅粥。网络是分层的,排查就应该严格按照从底层到顶层的顺序来:物理链路、链路层、网络层、传输层、应用层。

5.1 最笨但最有效的排查三步曲

我自己不管遇到多复杂的网络问题,都先跑这三个命令:

# 第一步:确认本机IP和网卡状态 ip addr show # 第二步:确认默认路由和网关 ip route show # 第三步:确认到网关的连通性 ping -c 4 <网关IP>

这三步能解决90%的“无法上网”“外网ping不通”类问题。如果IP不对,说明DHCP没获取到地址或者配置错了。如果路由不对,说明默认网关缺失或者配置错了。如果网关ping不通,说明下面一层出问题了——物理网线、交换机端口、网卡驱动、防火墙。

在这里,有一个新手容易踩的坑:服务器有两个网卡,一个内网一个外网。默认路由经常会被配错,导致内网走外网网关,外网流量又回不来。这时候就要借助策略路由或者配置静态路由解决。判断方法是:

# 查看到目标IP的具体路由走向 ip route get 8.8.8.8

这条命令会告诉你实际访问某个IP时,系统会从哪个网卡、走哪个网关出去,波段适合做路由排查。

5.2 服务端口通不通:telnet、nc、ss三件套

网络层通,不代表应用层通。很多时候我们要确认一个服务端口是否在监听,是否能从外部访问,会用到这几条:

# 查看本机监听端口和服务 ss -lntp # 从本机测试端口连通性 telnet 192.168.1.10 3306 # 从远端测试端口连通性好用,telnet不可用时用nc nc -vz 192.168.1.10 3306

ssnetstat的替代品,输出更清晰,速度也更快。看State这一列,如果是LISTEN说明服务在听,是SYN-SENT说明发出的连接请求没人响应,是ESTABLISHED说明已经建立了连接。

端口不通的情况,除了服务本身没起来,最大嫌疑就是防火墙。检查顺序是这样的:

# 查看防火墙规则(firewalld) firewall-cmd --list-all # 查看iptables规则 iptables -L -n -v # 临时放行某个端口测试 iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

一套查完,基本能区分是防火墙拦截还是服务本身的问题。还有一点需要注意,云服务器上还有一个安全组的概念,它是在虚拟机外面那一层拦的,服务器内部的防火墙查不出问题时要想到去云控制台看安全组规则。

5.3 DNS问题的隐蔽性:能ping通IP却打不开网站

“能ping通,但浏览器打不开网页”,这个问题在运维工单里出现的频率极高。ping用的是ICMP协议,而访问网站用的是TCP协议和DNS解析。能ping通只能说明网络层通,和DNS、端口是否开放没有关系。

排查DNS问题,先确认解析是否正常:

# 使用系统配置的DNS做解析 nslookup www.example.com # 手动指定一个公共DNS做对比,判断是不是系统DNS配置的问题 nslookup www.example.com 223.5.5.5 # 直接看系统DNS配置 cat /etc/resolv.conf

如果指定了公共DNS能解析,但用系统DNS解析失败,那就是/etc/resolv.conf配置有问题。常见的坑包括:

  • DNS服务器地址配置错误或者不可达。
  • resolv.conf里的search域配置导致解析了不必要的域名,增加了查询时间。
  • systemd-resolved或NetworkManager可能动态重写这个文件,手工改完一重启又被覆盖。
  • DNS超时时间可能很短,导致解析反复失败。

网络排查的最终心法就是:每一层都要有“确定通”的证据,才能进入下一层。底层没通就跑到应用层去翻日志,是浪费时间;底层全通还怀疑网线,也是浪费时间。按照顺序检查,即使问题不能马上解决,也能明确缩小到具体是哪一层,后续求助或者提单都有明确的方向。

6. 日志系统和systemd:运维手里最锋利的“黑匣子”

如果让我选一个“如果只能教运维新手一个技能,我会选什么”,那一定是“会看日志”。Linux系统里几乎所有的组件都会产生日志,只是输出的位置和格式各不相同。掌握日志的查看方法,就等于拿到了系统的“黑匣子”。

6.1 journalctl的正确打开方式

现在主流的Linux发行版都使用systemd作为init系统,配套的日志系统是journald。很多人只知道journalctl能看日志,但没有用好它的“时间窗口”“单元过滤”“优先级过滤”这几个核心能力。

实战中,我经常要回答一个问题:“昨晚2点到3点之间发生了什么?”这时候直接用:

# 查看某个时间段的全部日志 journalctl --since "2025-01-15 02:00" --until "2025-01-15 03:00"

这个时间窗口能力在做故障复盘时尤其重要。还有一个很有用的场景:排查“某个服务为什么启动失败”。

# 查看服务最近一次启动的完整日志,不截断 journalctl -u nginx.service -b --no-pager # 查看该服务的最近日志并持续跟踪 journalctl -u nginx.service -f # 查看服务上次启动失败的完整输出 journalctl -u nginx.service -b -1 --no-pager

很多服务启动失败的真正原因,在systemctl status输出的最后几行里根本看不出来,必须用journalctl看完整日志。比如我在排查PHP-FPM启动失败时,systemctl status只显示failed,但journal里明确写着“address already in use”——端口被占用了。这个差别,决定了排查时间是三分钟还是三小时。

6.2 日志轮转:让磁盘不被日志写满的“保命配置”

日志文件永远只增不减,如果不做轮转(rotation),任何系统最终都会磁盘满。绝大多数发行版默认都装了logrotate,但默认配置不一定适合所有业务,所以自己要学会配。

一个生产环境常见的配置长这样:

cat /etc/logrotate.d/myapp /var/log/myapp/*.log { daily rotate 14 compress delaycompress missingok notifempty dateext postrotate /bin/kill -USR1 $(cat /var/run/myapp.pid 2>/dev/null) 2>/dev/null || true endscript }

配置项的意思分别是:每天轮转一次,保留14份,旧日志压缩,延迟一天压缩(避免刚轮转就压缩,影响还在写的平滑过渡),日志文件不存在不报错,空文件不轮转,日志文件名带日期后缀。关键是最后那一段postrotate——轮转之后向应用进程发送信号,让它重新打开日志文件,否则应用还握着旧文件的句柄,日志会继续写到被改名(但还没删除)的文件里,又会出现“空间不释放”的老问题。

不同应用重新加载日志的信号不同:

  • Nginx:kill -USR1 <nginx-master-pid>
  • Apache:kill -USR1 <apache-pid>
  • Java应用(Logback):通常不需要信号,它会自己感知文件变化。

6.3 服务起不来的通用检查路径

无论是自己写的脚本还是标准的系统服务,启动失败都遵循一个共通排查路径:

# 第一步:查看服务状态,确认失败原因 systemctl status my-service # 第二步:查看该服务的完整journal日志 journalctl -u my-service -b --no-pager | tail -100 # 第三步:检查服务的依赖项是否正常 systemctl list-dependencies my-service # 第四步:手工运行一次,直接看终端输出(很多服务的报错不会写全到journal) sudo -u <运行用户> /usr/local/bin/my-service --foreground

第四步非常管用,因为它绕过了systemd,直接把服务的标准输出打到终端上,任何报错信息都逃不掉。但要记住一个原则:手工运行前先确认不会对现有环境造成影响。比如一个端口型服务,手工前台运行可能和你正在跑的实例冲突,那就先停掉systemd管理的实例,或者换个测试端口再跑。

7. Linux系统运维故障排查Q&A:高频疑问解答

篇幅有限,没法把191页手册里的所有内容都放进一篇文章。但有几个高频问题,几乎每个运维都被问过,我在这一节集中解答掉。

7.1 系统负载突然飙高,但找不到是哪个进程在搞事

出现这种情况,十有八九是以下三类原因:

  • 短时间内的进程高峰已经过去,但load平均值还没降下来。这时候看uptime里的1分钟、5分钟、15分钟数值变化趋势,如果1分钟已经明显回落,那基本就是瞬时高峰。
  • 进程在D状态(不可中断睡眠),通常卡在磁盘IO。ps aux里看到大量D状态的进程,用iostat -x 1确认磁盘是否异常。
  • 容器环境下,宿主机上其他容器的资源竞争。单独看容器内的top是看不到宿主整体情况的,要在宿主机上用top观察整体。

7.2 Linux系统安装了软件但找不到命令

刚部署完Linux环境时,systemctl或者nginx命令提示“command not found”,通常不是因为软件没装上,而是PATH环境变量没包含对应目录。排查思路如下:

# 确认命令是否存在,只是不在PATH里 find / -name "nginx" -type f 2>/dev/null # 查到实际路径后,尝试直接执行 /usr/local/nginx/sbin/nginx -v # 如果要长期可用,把路径加入PATH export PATH=$PATH:/usr/local/nginx/sbin

7.3 运维常用的“后悔药”:备份和回滚

最后说一个理念,可能比任何具体命令都重要:一切变更之前必须考虑回滚方案。改配置前备份原文件,动数据库前做备份,换内核前保留旧内核。这些看似多花两分钟的动作,在故障发生时就是你的“后悔药”。

# 改配置前备份 cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%Y%m%d%H%M) # 做变更之后验证,确认没问题再真正收工 nginx -t && systemctl reload nginx # 升级内核前,确认旧内核还在,防止新内核无法启动时束手无策 grubby --info=ALL | grep "^kernel"

8. 写在最后:运维故障排查的核心心法

说了这么多具体的命令和场景,最后想分享一下这几年来我个人在故障排查这件事上的体会。

第一,故障排查拼的不是记忆力,是方法论。那些看起来“他好厉害,一秒就定位了”的同行,不是背下了所有报错的含义,而是脑子里有一套清晰的排查框架。无论是启动、CPU、磁盘还是网络问题,有框架的人在按步骤缩小范围,没框架的人在到处试运气。

第二,要把每一次故障当作一次学习机会。我建议每个运维都建立一个自己的“故障档案”,记录日期、现象、影响范围、排查过程、根因、解决方案、后续预防措施。这个档案刚开始可能没什么感觉,但积累半年到一年后,你会发现自己对系统的理解会有质的飞跃。很多看似“新”的故障,其实都能从档案里找到类似的影子。

第三,敬畏线上环境,重视变更管理。大部分故障都来源于变更。“能用一条命令解决的问题,绝不用两条;能不在高峰期做的操作,绝不在高峰期做;能不重启的尽量热加载;非要重启的一定提前确认所有依赖。”这几句话听起来平平无奇,却是无数个凌晨四点的故障电话换来的教训。

第四,善于利用工具,但没有万能钥匙。这本文档里提到的top、dmesg、journalctl、iostat、perf、lsof,都是好工具,但它们只是放大器——放大你大脑里的排查思路,不能替代思路本身。真正值钱的是你能在正确的时候选择正确的命令,并且读懂它输出背后的含义。

Linux系统运维这个岗位,看起来是和冰冷的机器打交道,但本质上是在和“不确定性”打交道。系统总是会以你意想不到的方式出问题,你能做的不是杜绝问题,而是在问题来临时有章法、不慌乱、快速恢复,并且从每一次故障中让系统变得更健壮。希望这篇文章的分享,能帮你在下一次遇到问题时,少走一些弯路,多一份从容。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询