ceph 디테일의chooseleafstable--pg 마이그레이션 감소

4805 단어 ceph

전언


코드를 보다가 무심결에 이 파라미터를 보고 공식 문서를 찾았는데 설명이 이렇습니다:chooseleafstable: Whether a recursive chooseleaf attempt will use a better value for an inner loop that greatly reduces the number of mapping changes when an OSD is marked out. The legacy value is 0, while the new value of 1 uses the new approach. 번역해 보면 osd가out로 표시된 후에 맵의 변화를 줄일 수 있는 방법을 시도해 보십시오.osd가out로 표시된 후에 pg의 맵을 최대한 적게 수정하여 최소한의 이동을 할 수 있다는 뜻이다.

실험


chooseleaf 수정stable의 값, out 하나의osd, pgmap 이동 변화를 비교합니다.환경 3 던전, 3 노드, 각 노드 3개의osd 실험 스크립트는 단일pool의 pg에 대응하는 osd up set을 획득한 다음에out osd를 획득한 다음에osd up set을 획득한다. 같은 pg에서osd의 변화 수량을 비교하면 osd의 변화 수량이 많을수록 이전이 많아진다.환경 내에 데이터가 없기 때문에peering 프로세스는 10s를 기다려서 충분합니다.
import os
import sys
import commands
import time




def getPgUpSet():
    #pool id = 8
    cmd = "ceph pg dump |grep '^8\.' | awk '{print $1}'"
    (status,output) = commands.getstatusoutput(cmd)
    output = output.split('
') #skip "dumped all in format plain" pglist = output[1:] cmd = "ceph pg dump |grep '^8\.' | awk '{print $15}'" (status,output) = commands.getstatusoutput(cmd) output = output.split('
') osdsets = output[1:] pgosdset = {} for i in range(0,len(pglist)): pgosdset[pglist[i]] = osdsets[i] return pgosdset #compare before after pgosdupset def compBASet(bpgosdset,apgosdset): change0 = 0 change1 = 0 change2 = 0 change3 = 0 for key in bpgosdset.keys(): change = 0 for osd in bpgosdset[key]: if osd not in apgosdset[key]: change += 1 if change == 0: change0 += 1 elif change == 1: change1 += 1 elif change == 2: change2 += 1 print "change 2 osd in pg ",str(key) print "before out up set ",bpgosdset[key] print "after out up set ",apgosdset[key] elif change == 3: change3 += 1 print "change 3 osd in pg ",str(key) print "before out up set ",bpgosdset[key] print "after out up set ",apgosdset[key] print "change0 = ",change0 print "change1 = ",change1 print "change2 = ",change2 print "change3 = ",change3 def test(): bpgosdset = getPgUpSet() os.system("systemctl stop ceph-osd@0") os.system("ceph osd out 0") #wait peering time.sleep(10) apgosdset = getPgUpSet() compBASet(bpgosdset,apgosdset) if __name__ == "__main__": test()

실험 절차
4
  • 초셀레프를stable를 0으로 설정한 다음 스크립트를 실행합니다
  • [root@host196 yg]# ceph osd crush dump | grep stable
            "chooseleaf_stable": 0,
    [root@host196 home]# python pgmapcompare.py 
    marked out osd.0. 
    change 2 osd in pg  8.14
    before out up set  [0,8,3]
    after out up set  [8,4,2]
    change 2 osd in pg  8.10
    before out up set  [0,4,7]
    after out up set  [4,6,1]
    change 2 osd in pg  8.1f
    before out up set  [0,7,4]
    after out up set  [6,1,4]
    change 2 osd in pg  8.64
    before out up set  [4,0,8]
    after out up set  [4,7,2]
    change 3 osd in pg  8.66
    before out up set  [0,4,8]
    after out up set  [5,6,2]
    change 2 osd in pg  8.4b
    before out up set  [0,5,8]
    after out up set  [4,1,8]
    change 2 osd in pg  8.71
    before out up set  [0,4,6]
    after out up set  [3,2,6]
    change 2 osd in pg  8.7e
    before out up set  [3,0,6]
    after out up set  [3,7,1]
    change 2 osd in pg  8.59
    before out up set  [0,3,7]
    after out up set  [4,1,7]
    change 2 osd in pg  8.78
    before out up set  [0,5,8]
    after out up set  [3,2,8]
    change 2 osd in pg  8.9
    before out up set  [0,8,4]
    after out up set  [8,3,2]
    change 2 osd in pg  8.23
    before out up set  [0,4,7]
    after out up set  [5,1,7]
    change 2 osd in pg  8.31
    before out up set  [5,0,7]
    after out up set  [5,6,2]
    change 3 osd in pg  8.39
    before out up set  [0,6,5]
    after out up set  [7,3,1]
    change 2 osd in pg  8.3d
    before out up set  [0,8,5]
    after out up set  [6,5,1]
    change 2 osd in pg  8.5a
    before out up set  [0,4,6]
    after out up set  [5,6,1]
    change0 =  86
    change1 =  26
    change2 =  14
    change3 =  2
    
    

    osd0out 이후 pg가 이전되었습니다. pg가 이전되지 않은 pg는 86개, 1개의 osd를 이전한 pg는 26개, 2개의 osd를 이전한 pg는 14개, osd가 모두 변화한 pg는 2개입니다.pool에 128개의 pg가 있습니다.
    4
  • osd를 다시 그룹에 가입한 다음chooseleaf 수정stable는 1입니다. 스크립트를 다시 실행합니다
  • [root@host196 yg]# ceph osd crush dump | grep stable
            "chooseleaf_stable": 1,
    [root@host196 home]# python pgmapcompare.py 
    marked out osd.0. 
    change0 =  88
    change1 =  40
    change2 =  0
    change3 =  0
    
    

    결론


    chooseleafstable가 0이면 마이그레이션은 26×1+14×2+2×3=60개의 pg를 분할하여 이전하였는데, 1로 수정한 후 40에 해당한다×1=40개의 pg를 분할하여 이전하였다.

    좋은 웹페이지 즐겨찾기