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-20] NES 오브젝트 스토어 오브젝트 삭제 성능 개선 #50

Merged
merged 5 commits into from
Feb 21, 2024

Conversation

bgy217
Copy link
Collaborator

@bgy217 bgy217 commented Feb 20, 2024

  • 오브젝트 스토어의 오브젝트가 많을 때 버켓이나 다중 오브젝트 삭제가 너무 오래 걸린다는 불만 사항이 있음
  • 삭제 성능을 개선할 수 있는 방안을 고안하여 적용한다.
  • 관련 Jira: http://jira.nexrcorp.com/projects/NES/issues/NES-20

@bgy217
Copy link
Collaborator Author

bgy217 commented Feb 20, 2024

실제 오브젝트 삭제에 드는 시간은 1ms가 안된다.
다음과 같이 로그를 찍어서 알아보았다.

2024-01-26T11:10:53.307+0900 7fb14d4aa700 20 <cls> /root/nes_build/ceph/src/cls/rgw/cls_rgw.cc:2232: rgw_obj_remove(): removing object
2024-01-26T11:10:53.307+0900 7fb14d4aa700 20 <cls> /root/nes_build/ceph/src/cls/rgw/cls_rgw.cc:2234: rgw_obj_remove(): object removed

@bgy217
Copy link
Collaborator Author

bgy217 commented Feb 20, 2024

오브젝트 삭제에 드는 오버헤드는 osd와 rgw가 통신하는 과정에서 발생하는 듯하다.
이 오버헤드를 줄이려면 대량 삭제 처리 부분을 osd로 내려야 하는데, 오브젝트가 여러 osd에 걸쳐서 저장되는 근본 구조 상 불가능하다.

@bgy217
Copy link
Collaborator Author

bgy217 commented Feb 20, 2024

다중 오브젝트 삭제 요청을 병렬화하여 보내면 어떻게 되는지 실험한다.
한 요청에 오브젝트는 1000개씩을 삭제한다.

  • 순차 다중 오브젝트 삭제 요청

    • 1024 오브젝트: 6.008s
    • 2048 오브젝트: 9.065s
    • 3072 오브젝트: 18.198s
    • 4096 오브젝트: 21.509s
    • 5120 오브젝트: 24.744s
  • 병렬 다중 오브젝트 삭제 요청

    • 1024 오브젝트: 4.104s
    • 2048 오브젝트: 5.061s
    • 3072 오브젝트: 6.126s
    • 4096 오브젝트: 6.790s
    • 5120 오브젝트: 5.655s
  • 오브젝트 삭제의 병렬 수행의 효과는 대단했다.

이렇게 삭제를 병렬 수행하는 삭제 도구가 있다면 충분히 빠르게 오브젝트를 비울 수 있을 것이다.

테스트에 썼던 스크립트는 다음과 같다.

#!/bin/bash
PROFILE="rgw0"
BUCKET="delete-test"

raw_objs=($(mc ls rgw0/delete-test | awk -e '{ print $6 }'))
num_objs=${#raw_objs[@]}

post_datas=()
tries=0
while true; do
  start_idx=$(( tries * 1000 ))
  last_idx=$(( num_objs > 1000 * (tries+1) ? 1000 * tries + 999 : num_objs - 1 ))

  if [ $start_idx -gt $num_objs ]; then break; fi
  if [ $last_idx -lt 0 ]; then break; fi

  post_data="<Delete>"

  for i in $( seq $start_idx $last_idx ); do
    post_data="$post_data<Object><Key>${raw_objs[$i]}</Key></Object>"
  done

  post_data="$post_data</Delete>"

  post_datas[${tries}]=$post_data

  tries=$((tries + 1))
done

time {
  pids=()

  proc_idx=0
  for data in ${post_datas[*]}; do
  #if sequential process
    bash -c "./s3_multobj_delete.sh $BUCKET \"$data\""
  #else if parallel process
    bash -c "./s3_multobj_delete.sh $BUCKET \"$data\"" &
  #endif
    pids[${proc_idx}]=$!
    proc_idx=$((proc_idx + 1))
  done

  for pid in ${pids[*]}; do wait $pid; done
}

@bgy217
Copy link
Collaborator Author

bgy217 commented Feb 20, 2024

다음의 과정에서 오브젝트 삭제 부분을 쓰레드화하여 준비가 되는 대로 병렬 수행하도록 루틴을 변경할 것

  • 버켓 삭제시 object purge
  • 다중 object 삭제

@bgy217
Copy link
Collaborator Author

bgy217 commented Feb 20, 2024

오브젝트 삭제의 쓰레드화 효과 (10240 개의 오브젝트를 가진 버켓을 대상으로 수행)

  • 버켓 삭제시 오브젝트 purge (radosgw-admin bucket rm --bucket delete-test --purge-objects)
    • 쓰레드화 적용 전: 34.858s (user: 18.237s)
    • 쓰레드화 적용 후: 17.713s (user: 17.091s)
  • 다중 object 삭제 (위 스크립트 중 순차 삭제 버전 사용)
    • 쓰레드화 적용 전: 1m26.500s (user: 0.942s)
    • 쓰레드화 적용 후: 17.757s (user: 0.860s)

@bgy217 bgy217 self-assigned this Feb 20, 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