Ocata版本Cinder-Volume服务高负载问题

现象

最近在Ocata版本的OpenStack上遇到一个奇怪的现象。

  1. 控制节点的CPU使用率和Load值周期性的飚高
  2. Ceph集群内部op/s周期性飚高

情况就像下面这个样子:

1. 系统整体负载情况,CPU利用率在25%左右,cinder-volume进程占用接近500%

2. Ceph集群的每秒op数在3000+

Ocata版本Cinder-Volume服务高负载问题_第1张图片

3. 从Ceph监控看,每个时间点吞吐量很低,反而IOPS数很高。

Ocata版本Cinder-Volume服务高负载问题_第2张图片

原因

在社区里面看了下,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()

原因有几点

  1. cinder-scheduler希望得到每个Volume的初始分配容量,并不需要每个Volume的实际使用容量
  2. 通过diff_iterate()函数遍历所有volume会给cinder-volume和ceph带来更大的压力,主要体现在:
    • 遍历时间会随着集群Volume数增加,同时遍历过程中给Ceph带来负载
    • 遍历过程中请求可能会被blocked,最后造成一些服务卡顿或者宕机。

改后的现象

1. 从监控可以看到控制节点的idle在改了代码之后,从75%升到90%左右,这个挺明显的

Ocata版本Cinder-Volume服务高负载问题_第3张图片

2. Ceph集群的监控IOPS基本也回归正常

Ocata版本Cinder-Volume服务高负载问题_第4张图片

你可能感兴趣的:(Ocata版本Cinder-Volume服务高负载问题)