今天遇到一个使用了nginx proxy_cache 的机器,io 出奇地高,简单处理了一下,简单记录下,没有太详细的数据。 这个nginx 的前面是一堆squid ,它作为一个二级缓存,这样对后端是很有好处的。 开发的同事说,这台机器使用了 proxy_cache 后,io 压力很大。 我粗略分析了一下,分析结果如下: #vmstat 1
procs ———–memory———- —swap– —–io—- -system– —-cpu—-
r b swpd free buff cache si so bi bo in cs us sy id wa
0 7 68 52720 437416 1325168 0 0 1 2 2 2 0 0 10 1
0 7 68 51916 437528 1325848 0 0 0 4000 2812 2737 0 2 6 90
0 7 68 51868 437624 1325644 0 0 8 3040 2808 2705 1 2 0 99
0 7 68 52540 437596 1325068 0 0 8 510 3040 2841 0 1 1 97
0 7 68 51668 437700 1325964 0 0 60 4033 3479 3220 1 2 5 90
可以看到procs 栏处于b 状态的很多,一般情况下是io 阻塞了 #ps aux nobody 32622 1.1 0.6 530236 19248 ? D 23:31 0:12 nginx: worker process nobody 32623 0.9 0.6 530136 19064 ? D 23:31 0:10 nginx: worker process nobody 32624 0.9 0.6 530372 19276 ? D 23:31 0:09 nginx: worker process nobody 32625 1.1 0.6 530332 19296 ? D 23:31 0:11 nginx: worker process 看下nginx worker 的状态,全是D,请求资源阻塞了? #iostat -x 1 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.00 16.16 0.00 83.84 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 8.00 0.00 15.00 0.00 184.00 12.27 0.58 38.67 4.53 6.80 sdb 0.00 611.00 0.00 308.00 0.00 7200.00 23.38 98.31 193.23 2.27 70.00 粗略算一下,峰值io ,也就200r + 100w /s ,对于nginx 来说,这个应该算是中等,不算很高。但 %util 经常在 100.00 左右徘徊,这个就有点异常了。 看看配置吧,改改调调,发现引起问题的是以下这段配置 proxy_cache_path /data/cache/proxy_cache_dir levels=2:2:2 keys_zone=cache_one:500m inactive=5d max_size=200g; levels = 2:2:2 也就是nginx 那些缓存下来的文件,会存放到 $CACHE_PATH/[0-9a-f][0-9a-f]/[0-9a-f][0-9a-f]/[0-9a-f][0-9a-f]/xxxxxxxxxxxxxxxxxxxx 里 猜想,会不会是目录层次太多了呢? 改之,levels = 2:2 这里有个重点,改了nginx 配置还不能根治,还需要重建缓存目录。 改完,load 下来了,完成。
其实io 优化的最根本还是用内存分区,不会有io 阻塞。不过我没时间看他的架构,把问题解决了就算了,留个坑给后人吧。 |