收到nginx的超時報警和服務所在機器的load報警,經過分析問題時間段的系統cpu,內存,網絡io,磁盤io使用狀況,發現是磁盤io達到瓶頸致使。經過iostat看磁盤的await(平均每次設備I/O操做的等待時間,單位爲毫秒)時間達幾百毫秒且util(一秒中有百分之多少的時間用於 I/O 操做,即被io消耗的cpu百分比)持續100%html
1,經過使用iotop來看系統上使用io最多的進程,發現是nginx有大量的write磁盤操做,基本定位是nginx致使了磁盤io飆升
2,咱們須要知道nginx在讀寫哪些文件。故選擇一個nginx worker進程的pid,使用lsof -p pid命令,查看nginx佔用的文件,發現有不少/var/lib/nginx/tmp/client_body目錄的文件被佔用。
3,經過查閱nginx文檔,發現這個目錄默認是nginx存放client post body臨時文件的地方,能夠經過client_body_temp_path指令配置路徑ios
1,因爲跑在nginx上某一個域名的業務特性,最近對此nginx的post訪問量增長,故nginx壓力增大,從而致使nginx對資源的使用增大
2,nginx默認使用client_body_buffer_size指令配置的buffer存放post body,若是body過大則會使用client_body_temp_path指令配置的路徑臨時存放。因此,大量攜帶大點的body的post請求會對磁盤io產生壓力
3,在/var/lib/nginx/tmp/目錄還發現proxy目錄,此目錄有proxy_temp_path指令配置,當proxy_buffering指令爲開啓狀態的時候,會把被代理返回給nginx的response先緩存到proxy_buffers指令配置的buffer中,若是response超過buffer大小,則會把response緩存到proxy_temp_path指令配置的路徑中nginx
1,使用高性能的磁盤代理現有的磁盤,從硬件方便提高io性能
2,關閉proxy_buffering功能,nginx再也不緩存被代理服務的response,下降磁盤io使用
3,若是機器上有多個磁盤,不一樣域名配置不一樣的client_body_temp_path和proxy_temp_path,充分利用每塊磁盤的io
4,若是系統內存資源充足,適當調大client_body_buffer_size和proxy_buffer_size,proxy_buffers,充分使用內存資源,下降磁盤io使用
5,若是/dev/shm空間夠用,配置client_body_temp_path和proxy_temp_path到/dev/shm中,使用tmpfs來存儲臨時文件,下降磁盤io使用緩存
http://nginx.org/en/docs/http/ngx_http_proxy_module.html
http://nginx.org/en/docs/http/ngx_http_core_module.html網絡