Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[NES-9] NES의 writeback 캐시 티어 쓰기 동작 조정 이후 rados 엔진 인덱싱 이슈 해결 #49

Merged
merged 4 commits into from
Jan 17, 2024

Conversation

bgy217
Copy link
Collaborator

@bgy217 bgy217 commented Jan 17, 2024

  • NES-8 에서 적용한 writeback 캐시 티어의 쓰기 동작 조정 이후에 rados로 쓰기 및 복사를 수행했을 때 인덱스가 보이지 않는 이슈를 발견
  • 예를 들면, rados put -p <base_pool> obj1 data 명령으로 obj1 쓰기 했을 때 rados ls -p <base_pool> | grep obj1 하면 아무 결과도 나오지 않는 문제
  • 이전에는 base_pool에 쓰고 cache_pool로 promote 했기 때문에 데이터를 쓰면 쓰는 대로 base_pool에 오브젝트가 있었는데, cache_pool에 처음 쓰도록 변경하여 cache_pool에만 오브젝트가 있는 경우 base_pool에서 해당 오브젝트를 조회할 수 없게 되는 것이 원인
  • 필요한 경우 쓰기 동작 이후 base_pool에도 오브젝트를 생성하도록 동작을 변경해야 한다.
  • 쓰기 직후 base_pool에 오브젝트를 넣는 동작이 쓰기 동작 조정으로 얻은 성능 이점을 낮출 수 있기 때문에 성능 저하도 최소화 할 필요가 있다.

@bgy217
Copy link
Collaborator Author

bgy217 commented Jan 17, 2024

  • 성능을 위해 다음과 같은 처리를 적용했다.
    • 자기 자신에 대한 proxy_write는 굳이 새로 메시지를 꾸미지 않고 내부 함수를 한번 더 호출함
      • 메시지를 생성 및 파싱하고 루프백 네트워크를 타는 오버 헤드를 낮춘다.
    • 캐시 풀의 오브젝트를 베이스 티어로 내릴 때, 빈 오브젝트를 생성하여 리스트에 인덱스만 보이게 처리
      • 캐시 티어에 써진 오브젝트 전체를 베이스티어에 내리는 플러시는 비용이 크다.
      • 오브젝트가 있기만 하면 rados 인덱스에서 확인되고 오브젝트의 정보는 캐시 티어에 있는 오브젝트에서 읽어 오기 때문에 빈 오브젝트를 베이스 티어에 생성하는 것만으로도 효과를 볼 수 있다.
  • 개발 이전과 이후의 성능 변화
    • 개발 이전
      • 4K 쓰기 / 읽기: 5105kB/s, 30.8MB/s
      • 4M 쓰기 / 읽기: 262MB/s, 1736MB/s
      • 8M 쓰기 / 읽기: 265MB/s, 1452MB/s
    • 개발 이후
      • 4K 쓰기 / 읽기: 5159kB/s, 31.4MB/s
      • 4M 쓰기 / 읽기: 281MB/s, 1876MB/s
      • 8M 쓰기 / 읽기: 281MB/s, 1543MB/s
  • 모든 성능 측정은 캐시를 비운 후에 수행했다.
  • 성능 측정 fio 프로파일

[global]
name=fio_rados_bench
ioengine=rados
clientname=admin
pool=base_pool
conf=/etc/ceph/ceph.conf
direct=1
invalidate=1
nr_files=1000
rw_sequencer=identical
stonewall

[rados_4k]
rw=write
size=400M
bs=4K
iodepth=32

[rados_4k]
rw=randread
size=400M
bs=4K
time_based=1
runtime=40
ramp_time=20
iodepth=32

[rados_4m]
rw=write
size=4G
bs=4M
iodepth=32

[rados_4m]
rw=randread
size=4G
bs=4M
time_based=1
runtime=40
ramp_time=20
iodepth=32

[rados_8m]
rw=write
size=8G
bs=8M
iodepth=32

[rados_8m]
rw=randread
size=8G
bs=8M
time_based=1
runtime=40
ramp_time=20
iodepth=32

  • 개발 이후 속도가 더 빠르다.
    • 베이스 티어에 오브젝트 생성을 요청하는 오버헤드 < 자기 자신에게 보내는 porxy write을 함수 호출로 변경하여 얻은 성능 이점

@bgy217 bgy217 merged commit 9daf9f4 into ne-storage-master Jan 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant