線上故障排查指南:讓你的服務(wù)器起死回生的必殺技
你是否遇到過這些讓人頭疼的場(chǎng)景?
- 凌晨3點(diǎn)被運(yùn)維電話驚醒:「線上服務(wù)響應(yīng)特別慢!」
- 大促活動(dòng)突然宕機(jī):「CPU 100%,服務(wù)器快撐不住了!」
- 收到用戶投訴:「為什么系統(tǒng)越用越卡?」
作為一名服務(wù)端工程師,這些都是我們必須面對(duì)和解決的挑戰(zhàn)。但別擔(dān)心!
通過這篇實(shí)戰(zhàn)指南,你將學(xué)會(huì):
- 快速定位性能瓶頸的實(shí)用技巧
- 應(yīng)對(duì)高并發(fā)場(chǎng)景的實(shí)戰(zhàn)經(jīng)驗(yàn)
- 系統(tǒng)調(diào)優(yōu)和故障排查的必備工具
- 內(nèi)存泄漏等常見問題的解決方案
讓我們開始動(dòng)手實(shí)踐,把每個(gè)技能都變成你的"必殺技"!
日志分析小貼士:安全第一哦!
大家好!今天我要教你一個(gè)超級(jí)重要的小技巧 - 在碰日志前要先"量體溫"!
先來看看日志文件有多重:
$ ls -lh /var/log/nginx/access.log
│ │ │
│ │ └── 要查看的文件路徑 ??
│ └──── h表示human readable,讓文件大小更易讀 ??
└────── l表示long format,顯示詳細(xì)信息 ??
-rw-r--r-- 1 nginx nginx 6.5M Mar 20 15:00 access.log # 哇!這個(gè)日志有點(diǎn)重量級(jí)!???♂?
輸出解釋:
- -rw-r--r-- :文件權(quán)限(讀寫權(quán)限)
- nginx nginx:文件所屬用戶和用戶組
- 6.5M:文件大?。ㄒ匀祟愐鬃x的方式顯示)
- Mar 20 15:00:最后修改時(shí)間
為什么要這樣做呢?因?yàn)?..
- 直接用 cat 看大文件就像一口氣吃一頭大象
- 服務(wù)器會(huì)累得直喘氣
- 可能會(huì)讓其他小伙伴訪問不了網(wǎng)站
如果發(fā)現(xiàn)日志文件太大,我們有個(gè)小妙招:
# 把大象搬到別的地方慢慢吃 ??
$ scp /var/log/nginx/access.log test-server:/tmp/
│ │ │ │
│ │ │ └── 目標(biāo)路徑:文件將被復(fù)制到這里 ??
│ │ └── 目標(biāo)服務(wù)器:可以是主機(jī)名或IP地址 ???
│ └── 源文件:要復(fù)制的日志文件路徑 ??
└──── scp命令:secure copy,安全復(fù)制協(xié)議 ??
scp 命令參數(shù)詳解:
- -r:復(fù)制整個(gè)目錄及其內(nèi)容
- -P:指定SSH端口號(hào)(大寫P)
- -i:使用指定的私鑰文件
- -v:顯示詳細(xì)的傳輸過程
- -p:保留原文件的修改時(shí)間和權(quán)限
使用示例:
# 使用指定端口復(fù)制文件
$ scp -P 2222 access.log test-server:/tmp/ # 使用2222端口 ??
# 使用私鑰文件
$ scp -i ~/.ssh/id_rsa access.log test-server:/tmp/ # 指定私鑰 ??
# 復(fù)制整個(gè)目錄
$ scp -r /var/log/nginx/ test-server:/backup/ # 復(fù)制整個(gè)目錄 ??
# 保留文件屬性
$ scp -p access.log test-server:/tmp/ # 保留時(shí)間和權(quán)限 ?
小貼士:使用 scp 的注意事項(xiàng)
- 確保目標(biāo)服務(wù)器有足夠的磁盤空間
- 檢查網(wǎng)絡(luò)連接是否穩(wěn)定
- 注意文件權(quán)限設(shè)置
- 大文件傳輸時(shí)建議使用 -C 參數(shù)壓縮傳輸
想偷偷看看日志最后幾行?試試這個(gè):
$ tail -n 5 access.log
│ │ │
│ │ └── 要查看的日志文件 ??
│ └──── 顯示的行數(shù)(這里是5行)??
└──────── tail命令:查看文件末尾內(nèi)容 ??
192.168.1.100 GET /api/users 200 # 成功啦!??
192.168.1.101 POST /api/login 401 # 哎呀,登錄失敗了 ??
# ... 更多訪問記錄 ...
tail 命令參數(shù)詳解:
- -n:指定要顯示的行數(shù)
- -f:實(shí)時(shí)監(jiān)控文件變化(follow模式)
- -F:類似-f,但是文件被刪除后會(huì)重試
- -q:不顯示文件名頭部
- -v:顯示詳細(xì)的文件名頭部
使用示例:
# 顯示最后10行(默認(rèn))
$ tail access.log # 查看最新10條記錄 ??
# 實(shí)時(shí)監(jiān)控日志更新
$ tail -f access.log # 像看電影一樣實(shí)時(shí)觀察 ??
# 同時(shí)監(jiān)控多個(gè)文件
$ tail -f access.log error.log # 多文件同步監(jiān)控 ??
# 顯示文件末尾100字節(jié)
$ tail -c 100 access.log # 按字節(jié)查看 ??
小貼士:tail 命令使用技巧
- 使用 -f 監(jiān)控時(shí),按 Ctrl+C 可以退出
- 配合 grep 可以過濾特定內(nèi)容
- 可以用 -n +1 從頭開始顯示文件
- 建議對(duì)大文件使用 tail 而不是 cat
記住:溫柔對(duì)待你的日志,日志也會(huì)溫柔對(duì)待你!
來看看誰是最活躍的訪客:
$ cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -3
156 192.168.1.100 # 這位可真是個(gè)忠實(shí)用戶!??
89 192.168.1.101 # 二等獎(jiǎng)也不錯(cuò)哦!??
67 192.168.1.102 # 銅牌得主繼續(xù)加油!??
讓我們偷偷看看服務(wù)器的小秘密:
$ top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 root 20 0 985148 65404 31220 S 25.0 3.2 12:34 nginx ??♂?
5678 mysql 20 0 1258216 326892 8216 S 15.0 8.1 5:67 mysql ??
9012 redis 20 0 162672 29684 4508 S 5.0 0.7 2:45 redis ??
# 看!每個(gè)進(jìn)程都在忙著工作呢!??
這樣看輸出結(jié)果是不是更有意思了?每個(gè)數(shù)字背后都有一個(gè)小故事在等著你發(fā)現(xiàn)!
檢查服務(wù)器狀態(tài):
$ top
這就像給服務(wù)器量體溫 :
- PID:每個(gè)進(jìn)程的身份證號(hào)
- CPU%:進(jìn)程的"體溫"
- MEM%:進(jìn)程的"食量"
- COMMAND:進(jìn)程的"名字"
小貼士:記住這些命令就像收集寶可夢(mèng)一樣有趣!
- 每個(gè)命令都有特殊技能
- 組合使用威力更大
- 熟能生巧,多練習(xí)!
看!這樣是不是更容易理解每個(gè)命令在做什么了?繼續(xù)加油,你已經(jīng)是個(gè)小小運(yùn)維高手啦!
響應(yīng)時(shí)間分析:從點(diǎn)菜到上菜
讓我們用專業(yè)工具分析響應(yīng)時(shí)間:
# 測(cè)試網(wǎng)站響應(yīng)時(shí)間
$ curl -w "\n?? 總耗時(shí): %{time_total}秒\n" -s https://example.com
?? 總耗時(shí): 0.235秒
# 詳細(xì)的性能分析
$ ab -n 100 -c 10 https://example.com/
測(cè)試結(jié)果 ??:
- 平均響應(yīng): 0.389秒 ?
- 成功率: 98% ?
- 錯(cuò)誤數(shù): 2 ??
錯(cuò)誤日志分析:發(fā)現(xiàn)并解決問題
當(dāng)系統(tǒng)出現(xiàn)問題時(shí),錯(cuò)誤日志是我們的好幫手。讓我們來學(xué)習(xí)一些實(shí)用的日志分析命令:
# 查看錯(cuò)誤日志
$ grep ERROR /var/log/app.log
│ │ │
│ │ └── 要搜索的日志文件路徑 ??
│ └──── 要搜索的關(guān)鍵詞 ??
└──────── grep命令:在文件中搜索文本 ??
[ERROR] 2024-03-20 15:00:23 數(shù)據(jù)庫(kù)連接超時(shí) ??
[ERROR] 2024-03-20 15:00:25 內(nèi)存不足 ??
grep 命令參數(shù)詳解:
- -i:忽略大小寫
- -n:顯示行號(hào)
- -r:遞歸搜索目錄
- -v:顯示不匹配的行
- -c:只顯示匹配行數(shù)
使用示例:
# 顯示行號(hào)
$ grep -n ERROR /var/log/app.log # 知道錯(cuò)誤在第幾行 ??
# 忽略大小寫搜索
$ grep -i error /var/log/app.log # 匹配 ERROR、error 等 ??
# 遞歸搜索所有日志文件
$ grep -r ERROR /var/log/ # 搜索整個(gè)日志目錄 ??
# 統(tǒng)計(jì)錯(cuò)誤次數(shù)
$ grep -c ERROR /var/log/app.log # 只顯示錯(cuò)誤數(shù)量 ??
來看看如何統(tǒng)計(jì)錯(cuò)誤類型:
$ grep ERROR /var/log/app.log | awk '{print $4}' | sort | uniq -c | sort -nr
│ │ │ │ │ │ │
│ │ │ │ └────── 統(tǒng)計(jì)出現(xiàn)次數(shù) ??
│ │ │ └── 去重 ??
│ │ └── 排序 ??
│ └── 提取第4列(錯(cuò)誤類型)??
└── 過濾出錯(cuò)誤日志 ??
15 數(shù)據(jù)庫(kù)超時(shí) ?? # 最常見的錯(cuò)誤
8 內(nèi)存不足 ??
3 網(wǎng)絡(luò)異常 ??
小貼士:分析錯(cuò)誤日志的最佳實(shí)踐
- 定期檢查錯(cuò)誤日志,及早發(fā)現(xiàn)問題
- 使用 grep 的 -C 參數(shù)查看錯(cuò)誤上下文
- 結(jié)合時(shí)間戳分析錯(cuò)誤發(fā)生規(guī)律
- 建立錯(cuò)誤類型統(tǒng)計(jì)報(bào)表,找出常見問題
錯(cuò)誤日志分析流程圖:
獲取日志 ?? --> 過濾錯(cuò)誤 ?? --> 分析原因 ?? --> 解決問題 ?
面試要點(diǎn):日志分析技巧
面試官最愛問的問題:
- 如何快速定位性能問題
# 組合使用多個(gè)工具
$ dstat -cdngy 1 # 實(shí)時(shí)監(jiān)控系統(tǒng)資源 ??
│ │││││ │
│ ││││└─ y: 系統(tǒng)統(tǒng)計(jì)信息 ??
│ │││└── g: 顯示頁面統(tǒng)計(jì)信息 ??
│ ││└─── n: 網(wǎng)絡(luò)統(tǒng)計(jì)信息 ??
│ │└──── d: 磁盤統(tǒng)計(jì)信息 ??
│ └───── c: CPU 統(tǒng)計(jì)信息 ??
└───────── 1: 每秒更新一次 ??
$ iotop # 監(jiān)控磁盤 I/O ??
PID USER IO> DISK READ DISK WRITE COMMAND
1234 mysql 2.1 50.2 M/s 10.1 M/s mysqld
5678 nginx 0.8 2.1 M/s 1.2 M/s nginx
$ netstat -antp # 查看網(wǎng)絡(luò)連接 ??
│ │││└── p: 顯示進(jìn)程信息 ??
│ ││└─── t: 只顯示TCP連接 ??
│ │└──── n: 顯示數(shù)字地址而不是主機(jī)名 ??
│ └───── a: 顯示所有連接 ??
└─────────── 查看網(wǎng)絡(luò)統(tǒng)計(jì)信息 ??
- 如何處理大型日志文件?
# 使用高效的日志分析方法
$ zcat large.log.gz | grep ERROR | tail -n 100
│ │ │ │ │ │
│ │ │ │ │ └── 顯示行數(shù) ??
│ │ │ │ └──── 查看末尾 ??
│ │ │ └────────── 過濾ERROR關(guān)鍵詞 ??
│ │ └─────────────── 管道傳遞輸出 ??
│ └─────────────────── 壓縮文件分隔符 |
└────────────────────────────── 讀取壓縮文件 ??
$ awk '/ERROR/ {print $4}' large.log | sort | uniq -c
│ │ │ │ │ │ │
│ │ │ │ │ │ └── 計(jì)數(shù) ??
│ │ │ │ │ └──── 去重 ??
│ │ │ │ └────── 排序 ??
│ │ │ └──────────── 打印第4列 ??
│ │ └────────────────── 執(zhí)行的動(dòng)作 ??
│ └─────────────────────── 匹配模式 ??
└───────────────────────── 文本處理工具 ???
性能分析工具對(duì)比圖:
dstat ?? 系統(tǒng)整體狀況 ??
├── CPU使用率 ??
├── 磁盤I/O ??
├── 網(wǎng)絡(luò)流量 ??
└── 內(nèi)存使用 ??
iotop ?? 磁盤I/O詳情 ??
├── 讀取速度 ??
├── 寫入速度 ??
└── 進(jìn)程信息 ??
netstat ?? 網(wǎng)絡(luò)連接狀態(tài) ??
├── TCP/UDP連接 ??
├── 端口占用 ??
└── 進(jìn)程信息 ??
小貼士:性能分析最佳實(shí)踐
- 先用 dstat 獲取系統(tǒng)整體狀況
- 發(fā)現(xiàn) I/O 異常時(shí)使用 iotop 深入分析
- 網(wǎng)絡(luò)問題用 netstat 排查
- 注意收集足夠的樣本數(shù)據(jù)
- 建立基準(zhǔn)數(shù)據(jù),便于對(duì)比分析
常見性能問題及解決方案:
(1) CPU 使用率高
- 使用 top 找出高負(fù)載進(jìn)程
- 分析進(jìn)程是否存在死循環(huán)
- 考慮增加 CPU 核心或優(yōu)化代碼
(2) 磁盤 I/O 瓶頸
- 使用 iotop 監(jiān)控磁盤讀寫
- 檢查是否存在大量小文件操作
- 考慮使用 SSD 或優(yōu)化存儲(chǔ)策略
(3) 網(wǎng)絡(luò)延遲高
- 使用 netstat 檢查連接狀態(tài)
- 分析網(wǎng)絡(luò)包是否丟失
- 考慮優(yōu)化網(wǎng)絡(luò)配置或增加帶寬