nginx反向代理 磁盘IO高

说明

服务器结构:
nginx + trafficserver

说明:
最近trafficserver 服务器高峰期老是报警磁盘IO高。由于ats会读写磁盘,所以认为是正常的,开始没有理会。后来发现几乎每天都有这情况,并且服务器流量开始断崖式下降。已经影响到业务正常使用了,不得不引起足够的重视了。。。

找问题

top
发现 wa: 100% , cpu全部用来等待磁盘IO了

iostat
磁盘IO问题,肯定得先看磁盘读写情况。

# iostat -m 1

发现读写达到了700M/s ,此时有大疑问了,trafficserver作为缓存服务器,命中率95% 以上,不可能会有这么大的写操作,并且磁盘容量也都是正常。nginx 日志也都关闭。带着困惑继续找原因

iotop

此时发现了新大陆, IO排第一的是trafficserver,读 2-300M/s, 写 40M/s, 说明trafficserver服务正常,读写符合预期! 但是下面就发现了问题, 全是nginx进程,每个进程 写磁盘达到了70-80M, 因为有几十个nginx进程,加起来300多M。

此时基本上定位到了问题出在 nginx, 但是nginx目录大小正常,日志也都关闭了,哪里来的写操作呢?

lsof

根据nginx进程 使用lsof查看 nginx占用的文件,发现出现了大量的proxy_temp 路径下的临时文件

proxy_temp: nginx 作为反向代理时,当proxy_busy_buffer_size 满了的情况下,nginx会将文件写入缓存到proxy_temp中。

此时真相大白, 由于trafficserver 上缓存对象远大于nginx的proxy_busy_buffer_size 值,所以nginx都写到磁盘上了。因为nginx和trafficserver在同一台机器上,这样无异于脱裤子放屁了。。。

解决问题

nginx 配置中添加 proxy_buffering off;

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

总结

  • 优化trafficserver, 将trafficserver缓存 目录单独使用裸盘,提高缓存的IO
  • 关掉nginx相应的配置

你可能感兴趣的:(nginx反向代理 磁盘IO高)