목록으로
'언젠가 읽기' 컨텐츠는 논문이나 영문 컨텐츠 등 언젠가 읽으려고 즐겨찾기 하고선 읽지 않고 계속 미룰만한 컨텐츠를 읽고 요약하거나 소개합니다.

슈퍼블록 Percpu_rw_semaphore 교착 상태 디버깅

언젠가 읽기
2025. 2. 12. PM 8:00:46

문제 상황

최근 커널에서 특정 작업들이 122초 이상 멈추는 교착 상태(deadlock)가 발생했습니다. 로그에 따르면, PID가 2449인 "peer local sock"과 PID가 1914인 "mariadbd" 작업이 진행을 멈췄다고 보고되었습니다.

분석 방법

교착 상태를 분석하기 위해 커널 덤프 파일(kernel dump file)을 사용하는 방법을 선택했습니다. 이를 위해 kdump 를 트리거하고 crash 유틸리티를 사용하여 덤프 파일을 분석했습니다.

백트레이스 확인

crash 유틸리티를 사용해 백트레이스를 확인한 결과, veeamblksnap 커널 모듈에서 슈퍼블록(superblock)을 동결(freeze)하려던 중 교착 상태가 발생한 것으로 나타났습니다. 구체적으로, percpu_down_write() 함수가 세마포어(semaphore)를 획득하려고 시도했지만 다른 읽기 작업이 완료되기를 기다리고 있었습니다.

교착 상태 원인

교착 상태의 원인은 percpu_rw_semaphore 세마포어를 획득하려는 두 작업이 상호 대기 상태에 빠졌기 때문입니다. 이는 veeamblksnap 모듈이 스냅샷(snapshot)을 제거하는 과정에서 슈퍼블록을 동결하려 할 때 발생했습니다.

세마포어 상태 확인

세마포어의 주소를 찾아 해당 세마포어의 상태를 확인한 결과, 현재 writer 필드에 PID 2449인 작업이 존재하며, block 카운터는 1로 설정되어 있음을 확인했습니다. 이는 다른 작업들이 세마포어를 기다리고 있음을 의미합니다.

대기 중인 작업 찾기

세마포어를 기다리고 있는 다른 작업들을 찾기 위해 추가적인 분석을 수행했습니다. 이를 통해 어떤 작업들이 세마포어 획득을 기다리고 있는지 확인할 수 있었습니다.

결론

이번 교착 상태는 veeamblksnap 모듈이 슈퍼블록을 동결하려는 과정에서 percpu_rw_semaphore 세마포어를 제대로 획득하지 못해 발생했습니다. 추가적인 모니터링과 세마포어 사용 방식을 재검토함으로써 유사한 문제가 재발하지 않도록 예방할 필요가 있습니다.

함께 읽으면 좋은 자료

  • 리눅스 커널 교착 상태 분석
  • 세마포어와 뮤텍스의 이해
  • crash 유틸리티 사용법