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

[persistence] sync logging에서 log buffer flush 재검토: 직접 수행 vs. 요청 방식 #512

Closed
jhpark816 opened this issue Sep 19, 2020 · 4 comments
Assignees

Comments

@jhpark816
Copy link
Collaborator

jhpark816 commented Sep 19, 2020

현재 log buffer flush 수행 경우는 3가지이다.

  • log flush thread가 주기적으로 flush한다.
  • log writing하는 work thread가 log buffer에 빈 공간이 부족한 경우, 직접 flush 한다.
    • log flush thread가 정상 동작 중이라면, log buffer에 빈 공간이 부족한 경우가 없을 것이다.
    • write 작업이 flush 작업보다 빠르다면, log buffer 공간에 부족할 수 있지만 이러한 경우는 거의 없다고 본다.
    • 이러한 비정상적인 경우를 대비하여, worker thread가 직접 flush 작업하게 한 것이다.
  • sync logging 모드에서 각 worker thread가 자신의 write 연산 처리를 마친 후
    자신의 마지막 log record가 아직 flush된 상태가 아니면 직접 flush 작업을 수행한다.

위의 3가지 경우 중, 마지막 경우는 제외시키는 것이 나을 것 같다.
근거는

  • 정상적인 경우, log flush thread에 의해 flsuh 작업이 빠르게 진행되고 있다.
  • 자신의 log record가 flush되지 않았다고 자신이 직접 flush 작업을 수행하는 방안은
    여러 thread가 flush 작업을 서로 경쟁하여 수행하게 하므로,
    불필요한 system resource만 사용할 뿐 flush 수행 속도 개선에 도움이 되지 않는다.
  • 오히려, log flush thread에 의해 빠르게 진행되기를 기다리는 것이
    system resource를 절약하면서 처리 속도에도 개선이 된다.
@jhpark816
Copy link
Collaborator Author

@SuhwanJang
검토하고 의견 주세요.

@jhpark816 jhpark816 changed the title [persistence] log buffer flush 주체의 재검토와 수정 [persistence] log buffer flush 경우의 재검토 Sep 19, 2020
@SuhwanJang
Copy link
Contributor

SuhwanJang commented Sep 21, 2020

@jhpark816
flush thread 는 flush chunk(32KB) 만큼 쌓여야 flush 를 진행합니다. 즉, 마지막 update operation 이 요청되고, 추가 operation 요청이 들어오지 않으면, 해당 operation 은 write 되지 않으므로, sync logging 이 보장되지 않습니다.
이것을 지키기 위해서는

  • worker thread 는 flush 알림만 주고, flush thread 가 flush 하도록 변경.
  • flush thread 가 sync_logging 일 때 flush size > 0 이면, flush 하도록 변경. 이 방식은 multi operation 의 경우 operation 하나에서 flush 를 여러번 수행하는 단점이 수반될 수 있음.
  • 기존 방식 유지. flush 작업은 cache lock 을 잡지 않고, thread 수가 그렇게 많지 않기 때문에

@jhpark816
Copy link
Collaborator Author

@SuhwanJang

제안한 방법 중 첫째 방안을 구현해 봅니다. 이를 위해, 아래 함수를 구현하여 추가합시다.

  • upto_lsn까지 flush하도록 flush_thread에게 요청하는 함수입니다.
  • 이러한 요청이 여러 worker threads에 의해 꾸준히 들어올 수 있습니다.
    • 별도의 lock을 두어도 되지만,
    • flush_lsn_lock을 이용하는 것이 나을 것 같습니다.
void cmdlog_buff_flush_request(LogSN *upto_lsn)

@jhpark816 jhpark816 changed the title [persistence] log buffer flush 경우의 재검토 [persistence] sync logging에서 log buffer flush 재검토: 직접 수행 vs. 요청 방식 Oct 2, 2020
@SuhwanJang
Copy link
Contributor

merged commit : 3ad982a

sync logging 모드에서 각 worker thread가 자신의 write 연산 처리를 마친 후 자신의 마지막 log record가 아직 flush된 상태가 아니면 flush 작업 수행을 flush thread 가 하도록 변경하였습니다.

  • cmdlog_buff_flush_request(waiter->lsn) 함수 추가
    • upto_lsn까지 flush하도록 flush_thread에게 요청하는 함수
    • waiter-> lsn 까지 flush 되지 않았다면, logbuff.upt_flush_lsn = waiter->lsn 으로 설정
  • flush thread 는 nxt_flush_lsn 과 upt_flush_lsn 비교 후 flush
  • upt_flush_lsn 등록과 확인은 flush_lsn_lock 으로 제어

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

No branches or pull requests

2 participants