收到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网络