近期在生產環境發現 PHP 執行自動加載類文件時頻繁超時。通過慢查詢日誌定位,發現卡頓點集中在 include / require 載入特定類文件階段。初步判斷為 I/O 響應異常,疑似磁碟讀取性能瓶頸或硬體故障。本文記錄完整排查鏈路與關鍵指標分析,供同類問題參考。
include_once / spl_autoload_register 回調中request_terminate_timeout 設定值iostat -d -x -k 1 10
關鍵指標解讀:
| 指標 | 含義 | 健康閾值 | 異常判讀 |
|---|---|---|---|
| await | 平均每次 I/O 請求處理時間(含隊列等待 + 服務時間),單位毫秒 | < 5 ms | > 10 ms 明顯偏高;若遠大於 svctm,說明隊列擁堵嚴重 |
| svctm | 平均每次設備 I/O 服務時間(不含隊列),單位毫秒 | 接近 await | 若 await ≫ svctm,表示請求在隊列中等待過久,磁碟吞吐不足 |
| %util | 設備帶寬利用率 | < 70% | 持續接近 100% 表示磁碟已成瓶頸 |
| await - svctm | 平均隊列等待時間 | 趨近 0 | 差值越大,I/O 隊列擁堵越嚴重 |
sudo iotop -o # 僅顯示正在產生 I/O 的進程
觀察 DISK READ、DISK WRITE 欄位,找出佔用磁碟帶寬最高的 PID,再對應至具體 PHP-FPM worker 或其他服務(如備份、日誌切割、資料庫同步等)。
sudo perf top
若見到 ext4_file_read_iter、generic_file_read_iter、page_cache_sync_readahead 等符號佔比高,進一步確認為文件系統讀取熱點。
sudo hdparm -t /dev/sdX
實測輸出:
Timing buffered disk reads: 10 MB in 3.14 seconds = 3.18 MB/sec
結論:順序讀取僅 3.18 MB/s,遠低於機械硬碟正常 100~200 MB/s,甚至 SSD 500 MB+ 基線。強烈暗示磁碟存在壞道、固件故障、RAID 降級或控制器快取失效。
while true; do date; ps auxf | awk '{if($8=="D") print $0;}'; sleep 1; done
大量 PHP-FPM worker 長期處於 D 狀態(不可中斷睡眠,通常等待 I/O 完成),佐證 I/O 子系統阻塞。
smartctl -a /dev/sdX 關注 Reallocated_Sector_Ct(重新映射扇區計數)、Current_Pending_Sector(待映射扇區)、Seek_Error_Rate(尋道錯誤率)。dmesg -T | grep -i -e error -e fail -e ext4 檢查內核報錯;考慮 fsck 離線修復(需維護窗口)。opcache(opcache.enable=1、opcache.validate_timestamps=0 生產環境)、預熱類映射表、將高頻類文件移至 tmpfs(記憶體盤)。本次故障鏈路:PHP include 超時 → 慢查詢日誌定位 → iostat 發現 await 極高、讀取速率僅 3 MB/s → 疑似硬碟壞道/控制器故障。建議優先更換疑似故障磁碟並檢查 RAID 健康度,同時在應用層開啟 OpCache 減少文件系統讀取壓力。