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
[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
[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를 분할하여 이전하였다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제5편: Ceph 클러스터 운영/var/lib/ceph/mds/ceph-{$id}, id 메타데이터 서버의 이름을 표시하고 수요에 따라 스스로 정의할 수 있습니다.예: osd를 만듭니다.3 디렉터리, 디렉터리 이름 형식 {cluster-name}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.