Ocata版本Cinder-Volume服務高負載問題

現(xiàn)象

最近在Ocata版本的OpenStack上遇到一個奇怪的現(xiàn)象。

  1. 控制節(jié)點的CPU使用率和Load值周期性的飚高
  2. 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()

原因有幾點

  1. cinder-scheduler希望得到每個Volume的初始分配容量,并不需要每個Volume的實際使用容量
  2. 通過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基本也回歸正常

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容