引言
當Linux系統"生病"時,它不會說話但卻會通過各種癥狀"求救"🆘!本文將帶你建立系統化的故障排查思維,從磁盤到內存,從網絡到服務,全方位掌握Linux系統的"把脈問診"技巧。無論遇到多么詭異的系統問題,這篇文章都會成為你的"急診手冊"!準備好你的終端,讓我們一起成為Linux系統的"全能醫生"吧~ 🚑
一、系統級故障排查框架
1.1 通用排查流程
- 現象確認:明確故障表現(服務不可用、性能下降、報錯信息等)
- 日志分析:檢查系統日志(
/var/log/
)和應用日志 - 資源監控:查看CPU、內存、磁盤、網絡使用情況
- 隔離定位:通過排除法確定問題組件
- 復現測試:嘗試復現問題以確認根本原因
1.2 常用診斷命令
# 系統狀態概覽
uptime # 負載情況
dmesg | tail # 內核日志
journalctl -xe # 系統日志(systemd系統)# 資源快速檢查
top # 動態資源監控
df -h # 磁盤空間
free -h # 內存使用
ss -tulnp # 網絡連接
二、磁盤相關故障
2.1 常見磁盤錯誤
- “No space left on device”:磁盤空間不足
- “Input/output error”:磁盤I/O錯誤
- “Read-only file system”:文件系統變為只讀
- “Disk quota exceeded”:磁盤配額超限
2.2 排查步驟
# 1. 檢查磁盤空間
df -h # 查看各分區使用率
df -i # 檢查inode使用情況# 2. 查找大文件
du -sh /* # 查看根目錄下各目錄大小
find / -type f -size +100M -exec ls -lh {} + | sort -rh# 3. 檢查文件系統錯誤
sudo fsck /dev/sda1 # 需要先umount# 4. 檢查磁盤健康(SMART)
sudo smartctl -a /dev/sda# 5. 檢查掛載選項
mount | grep /dev/sda1
cat /etc/fstab
2.3 解決方案
-
空間不足:
# 清理日志/緩存 sudo journalctl --vacuum-size=100M # 限制日志大小 sudo apt clean # Debian/Ubuntu清理包緩存# 擴容或添加存儲 lvextend -L +10G /dev/vg_data/lv_home # LVM擴容 resize2fs /dev/vg_data/lv_home
-
文件系統損壞:
umount /dev/sda1 fsck -y /dev/sda1 mount /dev/sda1
三、內存相關故障
3.1 常見內存錯誤
- “Out of memory”:內存耗盡
- “Killed process”:OOM Killer終止進程
- “Cannot allocate memory”:內存分配失敗
- 系統卡頓/交換頻繁:內存不足表現
3.2 排查步驟
# 1. 檢查內存使用
free -h # 查看物理內存和交換空間
vmstat 1 # 監控虛擬內存統計# 2. 查看內存占用進程
top # 按內存排序(M)
ps aux --sort=-%mem | head# 3. 檢查OOM事件
dmesg | grep -i oom # 查看OOM Killer日志
journalctl -k | grep -i oom# 4. 檢查內核參數
sysctl vm.swappiness
cat /proc/sys/vm/overcommit_memory
3.3 解決方案
-
優化內存使用:
# 調整swappiness sudo sysctl vm.swappiness=10# 限制進程內存 systemctl set-property apache2 MemoryLimit=1G
-
處理內存泄漏:
# 使用valgrind檢測 valgrind --leak-check=yes ./application# 定期重啟有內存泄漏的服務 sudo systemctl restart service_name
四、網絡相關故障
4.1 常見網絡錯誤
- “Network is unreachable”:網絡不可達
- “Connection refused”:目標服務未監聽
- “No route to host”:路由問題
- “Name or service not known”:DNS解析失敗
- 高延遲/丟包:網絡質量問題
4.2 排查步驟
# 1. 檢查網絡配置
ip addr show # 查看IP地址
ip route show # 查看路由表
cat /etc/resolv.conf # 檢查DNS配置# 2. 測試基本連通性
ping 8.8.8.8 # 測試基礎網絡
ping google.com # 測試DNS解析# 3. 檢查端口連通性
telnet example.com 80
nc -zv example.com 443# 4. 追蹤網絡路徑
traceroute google.com
mtr google.com # 更高級的路由追蹤# 5. 檢查防火墻規則
sudo iptables -L -n # iptables規則
sudo firewall-cmd --list-all # firewalld規則
4.3 解決方案
-
DNS問題:
# 檢查/etc/resolv.conf nameserver 8.8.8.8 nameserver 1.1.1.1# 測試不同DNS服務器 dig @8.8.8.8 example.com
-
防火墻阻擋:
# 臨時添加規則 sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT# 永久保存規則 sudo iptables-save > /etc/iptables.rules
-
網絡接口問題:
# 重啟網絡服務 sudo systemctl restart networking # Debian/Ubuntu sudo systemctl restart NetworkManager # RHEL/CentOS# 檢查接口狀態 ethtool eth0
五、服務特定故障
5.1 服務啟動失敗
# 1. 查看服務狀態
systemctl status apache2# 2. 查看詳細日志
journalctl -u apache2 -xe# 3. 測試配置文件語法
apachectl configtest # Apache
nginx -t # Nginx# 4. 檢查端口沖突
ss -tulnp | grep :80
5.2 數據庫連接問題
# 1. 檢查服務狀態
systemctl status mysql# 2. 檢查錯誤日志
tail -f /var/log/mysql/error.log# 3. 檢查連接限制
show variables like 'max_connections';# 4. 檢查網絡訪問權限
SELECT host, user FROM mysql.user;
六、硬件相關故障
6.1 常見硬件錯誤
- “kernel: CPU#0: Possible thermal throttling”:CPU過熱
- “blk_update_request: I/O error”:磁盤I/O錯誤
- “EDAC MC0: UE memory read error”:內存錯誤
6.2 排查命令
# CPU/溫度監控
sensors # 需要安裝lm-sensors
mpstat -P ALL 1 # CPU使用率# 內存檢測
sudo memtester 1G 1 # 測試1GB內存(需安裝memtester)# 磁盤健康
sudo smartctl -a /dev/sda
sudo badblocks -v /dev/sda
七、系統崩潰分析
7.1 內核崩潰(crash)
# 查看內核轉儲
ls -lh /var/crash/ # Ubuntu
ls -lh /var/core/ # RHEL/CentOS# 分析core dump
gdb /usr/bin/application core-file# 配置kdump(內核轉儲)
sudo kdump-config show # Debian/Ubuntu
7.2 系統日志分析
# 查看關鍵錯誤
grep -i error /var/log/syslog
journalctl -p 3 -xb # 顯示錯誤級別及以上日志# 按時間篩選
journalctl --since "2023-01-01" --until "2023-01-02"
八、性能問題排查
8.1 CPU瓶頸
# 1. 查看CPU負載
top
htop# 2. 分析熱點進程
perf top# 3. 追蹤系統調用
strace -p <PID> -c
8.2 I/O瓶頸
# 1. 查看磁盤I/O
iostat -xz 1# 2. 查看I/O等待
vmstat 1# 3. 查找高IO進程
iotop
九、故障排查工具箱
9.1 必備工具列表
工具 | 用途 |
---|---|
strace | 跟蹤系統調用 |
ltrace | 跟蹤庫調用 |
lsof | 列出打開文件 |
tcpdump | 網絡抓包 |
sysdig | 系統監控和排錯 |
bpftrace | 高級性能分析 |
9.2 診斷腳本示例
#!/bin/bash
# 快速系統診斷腳本echo "===== System Overview ====="
uptime
echo -e "\n===== Disk Usage ====="
df -h
echo -e "\n===== Memory Usage ====="
free -h
echo -e "\n===== Top Processes ====="
ps aux --sort=-%cpu | head -10
echo -e "\n===== Recent Errors ====="
journalctl -xe -n 20 --no-pager
總結 🎯
通過本文的系統學習,我們已經構建了完整的Linux故障排查知識體系:
- 系統化思維:從現象到根源的推理方法 🧠
- 分層診斷:硬件→系統→服務的檢查路徑 🔍
- 工具鏈應用:各類專業診斷工具的使用 🛠?
- 應急方案:崩潰恢復與數據搶救技巧 🚑
排障黃金法則:
- 先備份再操作:重要數據優先保護 💾
- 最小變動原則:一次只改一個變量 🔧
- 日志為王:系統日志是最佳線索 📜
記住:優秀的運維工程師都是經驗豐富的偵探! 現在就去實踐這些排查技巧吧!🐧?
PS:如果你在學習過程中遇到問題,別慌!歡迎在評論區留言,我會盡力幫你解決!😄