現(xiàn)象
最近在Ocata版本的OpenStack上遇到一個奇怪的現(xiàn)象。
- 控制節(jié)點的CPU使用率和Load值周期性的飚高
- Ceph集群內部op/s周期性飚高
情況就像下面這個樣子:
1. 系統(tǒng)整體負載情況,CPU利用率在25%左右,cinder-volume進程占用接近500%

2. Ceph集群的每秒op數(shù)在3000+

3. 從Ceph監(jiān)控看,每個時間點吞吐量很低,反而IOPS數(shù)很高。

原因
在社區(qū)里面看了下,Ocata版的Cinder-volume服務在計算存儲使用量的時候用diff_iterate()函數(shù)計算每個Volume的真實使用量,由于調用了librbd diff模塊,會造成這段時間類集群的op數(shù)增高。
方案
社區(qū)提供解決方案: Correct RBD Provision stats&fix a perf problem
替換計算真實使用量的diff_iterate()函數(shù)。
+++ /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()函數(shù)遍歷所有volume會給cinder-volume和ceph帶來更大的壓力,主要體現(xiàn)在:
- 遍歷時間會隨著集群Volume數(shù)增加,同時遍歷過程中給Ceph帶來負載
- 遍歷過程中請求可能會被blocked,最后造成一些服務卡頓或者宕機。
改后的現(xiàn)象
1. 從監(jiān)控可以看到控制節(jié)點的idle在改了代碼之后,從75%升到90%左右,這個挺明顯的

2. Ceph集群的監(jiān)控IOPS基本也回歸正常
