nginx存在大量磁盘io问题及解决方案

查看进程磁盘io读写情况

#ipstat命令 只能查看总的IO数据,不能查看某个进程的IO数据

#iotop命令,该命令需要python环境才能运行

sudo iptop -p $PID -d 1
#当需要查看所有进程的情况时  去掉-p参数即可

#pidstat命令 
sudo pidstat -p $PID -d 1
#当需要查看所有进程的情况时  去掉-p参数即可

nginx占用分析

#使用lsof命令查看nginx占用的文件,看proxy_temp路径下临时文件是否很多

首先,需要确定一件事:Nginx不是立即转发收到的请求,而是等buffer满之后再转发,默认是On。那么道理很简单了,我们将Nginx作为代理进行转发数据时,由于我们转发的body相对较大(几百K),而且在并发又很高的情况,那么大量的数据就要被缓存,而当Nginx的buffer空间不够的时候,就会将buffer的数据刷新到磁盘缓存目录,到时候磁盘写入非常高,同时由于磁盘的性能也会影响到转发的性能和效率。

说白了就是当我们请求发送的数据超过nginx的配置参数proxy_busy_buffer_size配置的值时,就会导致nginx会把多的数据写入到磁盘。

解决方案

方案一

增大proxy_busy_buffer_size参数的值
不过这样可能就会很耗内存资源

方案二

nginx 配置中添加 proxy_buffering off;

proxy_buffering : 被代理服务器的数据和客户端的请求异步。也就是 后端服务器把数据返回到nginx服务器,nginx服务器缓存一下,然后再返回给客户端

方案三

此方案严格来说不是解决磁盘io,而是提高io性能
使用SSD硬盘以提高io性能

你可能感兴趣的:(nginx存在大量磁盘io问题及解决方案)