Linux 7.2, 컨테이너 종료/언마운트 지연 시간 대폭 감소 가능
요약
Linux 7.2 커널 패치를 통해 컨테이너 종료 및 언마운트 시 발생하는 지연 시간을 획기적으로 단축합니다. 경쟁 상태(race condition)를 해결하고 전역 직렬화 페널티를 제거하여 I/O 부하가 높은 환경에서의 성능을 최적화했습니다.
핵심 포인트
- 컨테이너 종료 시 발생하는 use-after-free 및 VFS 오류 해결
- 전역 직렬화 페널티 제거로 언마운트 지연 시간 대폭 감소
- 16 vCPU 환경에서 p50 지연 시간을 약 92~138ms에서 5~8ms로 단축
- per-sb 카운터 도입을 통한 슈퍼블록 간 간섭 최소화
Linux 7.2, 컨테이너 종료/언마운트 지연 시간 대폭 감소 가능

"VFS: Busy inodes after unmount" 메시지와 발생 가능한 use-after-free (사용 후 해제) 조건이 있습니다. 하지만 이번 패치 시리즈는 더 나아가 무거운 I/O 부하가 있는 환경에서 컨테이너 언마운트 (unmounting) 지연 시간을 낮추는 매우 훌륭한 최적화를 제공합니다.
Alibaba의 엔지니어 Baokun Li는 컨테이너가 종료될 때 발생할 수 있는 race condition (경쟁 상태)을 추적하여 현재 병합된 패치로 해결했습니다. 해당 작업의 일부는 가까운 시일 내에 현재 Linux stable 커널 시리즈에도 백포트 (back-ported)될 예정입니다. 하지만 가장 흥미로운 점은 전역 직렬화 페널티 (global serialization penalty)를 제거하여 컨테이너 종료/언마운트 지연 시간을 훨씬 더 낮출 수 있는 추가 작업입니다.
Christian Brauner는 현재 Linux 7.2에 병합된 이 pull request (풀 리퀘스트)에서 상황을 다음과 같이 요약했습니다:
"cgroup_writeback_umount()와 inode_switch_wbs() 사이의 race condition (경쟁 상태) 수정
컨테이너가 종료될 때, cgroup_writeback_umount()와 inode_switch_wbs()/cleanup_offline_cgwb() 사이의 race condition (경쟁 상태)이 발생하면 "VFS: Busy inodes after unmount" 메시지가 발생한 후 percpu 카운터에서 use-after-free (사용 후 해제)가 발생할 수 있습니다. inode_prepare_wbs_switch()가 true를 반환하고 (SB_ACTIVE 체크를 통과하고 inode를 확보한 후) 이어지는 wb_queue_isw() 호출 사이에는 시간적 간격이 존재합니다. 만약 cgroup_writeback_umount()가 전역 isw_nr_in_flight 카운터를 0이 아닌 것으로 관찰했지만 flush_workqueue()가 아직 큐에 쌓인 것이 없다고 판단하면, 함수는 조기에 반환됩니다. 이로 인해 점유된 inode 참조가 남게 되어 evict_inodes()를 차단하고, 이후의 iput() 호출 시 해제된 percpu 카운터에 접근하게 됩니다."
이 경합(race)은 inode_prepare_wbs_switch()부터 wb_queue_isw()까지의 구간을 RCU read-side 임계 구역(critical section)으로 덮어씌우고, umount 경로에서 동기화함으로써 해결됩니다. 이에 더해, queue_rcu_work() 시대의 유물이었던 이제는 불필요해진 rcu_barrier()가 제거되었으며, 전역 synchronize_rcu()/flush_workqueue() 쌍은 per-sb (super-block당) 인플라이트(in-flight) 카운터와 pin/unpin/drain 헬퍼로 대체되었습니다. 이를 통해 umount가 관련 없는 슈퍼블록(superblocks)의 스위치 활동에 대해 더 이상 직렬화(serialize)되지 않게 됩니다.
16 vCPU 게스트 환경의 cgroup writeback 혼잡(churn) 상황에서, 이를 통해 umount 지연 시간(latency)의 p50 값이 약 92138ms에서 약 58ms로 감소하며, cgroup_writeback_umount()의 누적 비용은 호출당 약 62ms에서 약 4us로 줄어듭니다. 초기 경합 수정 사항은 별도로 최소한으로 유지되어, 여전히 queue_rcu_work()를 통해 스위치를 큐에 넣는 안정화 트리(stable trees)에도 깔끔하게 백포트(backport)될 수 있습니다.
언마운트 지연 시간에 있어 상당히 훌륭한 개선입니다.
이 패치에는 추가적인 벤치마크 수치들도 포함되어 있습니다.
이와 별개로, Linux 7.2를 위한 동일한 VFS 풀 리퀘스트(pull request)는 RWF_DONTCACHE 플래그를 사용할 때의 쓰기 성능도 향상시킵니다. 해당 벤치마크 수치와 더 자세한 내용은 이 패치 내에 포함되어 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Phoronix의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기