文章來源:《https://www.centos.bz/2015/04/handle-nginx-write-io-problem/》
故障現象
突然收到一台服務器負載過高告警,緊接着網站打開緩慢。
故障分析
- 1、登錄服務器,使用top命令看到Cpu行的iowait達到了70%以上,所以斷定是IO負載過高的原因;
- 2、接着使用iotop -o命令發現,Nginx的寫IO特別大,並且在上一步的top命令看到Nginx的進程狀態為D,表示Nginx在等待IO已經為僵死狀態;
- 3、這時候是清楚知道是Nginx在對文件系統進行大量的寫操作導致的系統負載過高了,但還是不能知道具體Nginx在寫什么文件導致的負載壓力,所以我們還需要繼續追查下去;
- 4、我們找到其中一個nginx worker進程的pid,使用lsof -p pid列出來的文件發現除了一些系統庫文件及日志文件,還有相當多的fastcgi_temp/xxx文件,有可能與這些文件有關聯;
- 5、再次使用strace -p pid追蹤,發現nginx進程對某個fd進行大量的寫操作,與lsof命令列出來的文件剛好符合;
- 6、使用iostat 1輸出的大量寫io的分區也與fastcgi_temp所在分區相符合;
- 7、猜測可能是外部正在上傳大量的大文件給php-fpm,於是通過EZHTTP的小工具來查看實時流量,發現入站流量其實不大。
分析結果
根據以上的故障分析,非常有可能是本機的某些程序通過http上傳大量大文件。因為對程序邏輯不熟悉,也只是猜測。為了盡快恢復服務,決定實施以下解決方案。
解決方案
既然清楚知道了fastcgi_temp io壓力大,目前也無法短時間從根本上解決問題,所以決定把fastcgi_temp指向/dev/shm,也就是映射到了內存,重啟nginx之后服務恢復了正常。最終原因還需要開發配合解決。