Ocata版本Cinder-Volume服务高负载问题
2018-01-03 本文已影响49人
魔哈Moha
现象
最近在Ocata版本的OpenStack上遇到一个奇怪的现象。
- 控制节点的CPU使用率和Load值周期性的飚高
- Ceph集群内部op/s周期性飚高
情况就像下面这个样子:
1. 系统整体负载情况,CPU利用率在25%左右,cinder-volume进程占用接近500%
2. Ceph集群的每秒op数在3000+
3. 从Ceph监控看,每个时间点吞吐量很低,反而IOPS数很高。
原因
在社区里面看了下,Ocata版的Cinder-volume服务在计算存储使用量的时候用diff_iterate()函数计算每个Volume的真实使用量,由于调用了librbd diff模块,会造成这段时间类集群的op数增高。
方案
社区提供解决方案: Correct RBD Provision stats&fix a perf problem
替换计算真实使用量的diff_iterate()函数。
+++ /usr/lib/python2.7/site-packages/cinder/volume/drivers/rbd.py
+0200
@@ -367,7 +367,8 @@
# non-default volume_name_template settings. Template
# must start with "volume".
with RBDVolumeProxy(self, t, read_only=True) as v:
- v.diff_iterate(0, v.size(), None, self._iterate_cb)
+ self._total_usage += v.size()
原因有几点
- cinder-scheduler希望得到每个Volume的初始分配容量,并不需要每个Volume的实际使用容量
- 通过diff_iterate()函数遍历所有volume会给cinder-volume和ceph带来更大的压力,主要体现在:
- 遍历时间会随着集群Volume数增加,同时遍历过程中给Ceph带来负载
- 遍历过程中请求可能会被blocked,最后造成一些服务卡顿或者宕机。
改后的现象
1. 从监控可以看到控制节点的idle在改了代码之后,从75%升到90%左右,这个挺明显的
2. Ceph集群的监控IOPS基本也回归正常