nginx占用大量磁盘io分析解决

背景

收到nginx的超时报警和服务所在机器的load报警,通过分析问题时间段的系统cpu,内存,网络io,磁盘io使用情况,发现是磁盘io达到瓶颈导致。通过iostat看磁盘的await(平均每次设备I/O操作的等待时间,单位为毫秒)时间达几百毫秒且util(一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比)持续100%

分析定位问题服务

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指令配置路径

原因

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指令配置的路径中

解决或者缓解磁盘io

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

相关推荐