说明
服务器结构:
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相应的配置