다중 스왑 장치 처리를 개선하는 새로운 Linux 패치
요약
Tencent가 다중 스왑 장치 처리를 개선하기 위한 새로운 Linux 패치를 공개했습니다. 이 패치는 I/O를 공정하게 분배하고, 전역 클러스터 캐시와 plist 의존성을 제거하여 스왑 계층화(swap tiering) 및 레이어드 스왑 구현을 용이하게 합니다. 이는 시스템의 확장성과 유연성을 크게 향상시키는 것을 목표로 합니다.
핵심 포인트
- 다중 스왑 장치 I/O를 공정하게 분배하는 새로운 방법을 도입합니다.
- 전역 클러스터 캐시와 plist 의존성을 제거하여 설계 문제를 해결했습니다.
- 스왑 계층화(swap tiering) 및 레이어드 스왑 구현에 최적화되었습니다.
- 확장성과 미래 지향적인 설계를 위해 percpu rwsem을 사용합니다.
다중 스왑 장치 처리를 개선하는 새로운 Linux 패치

대부분의 Phoronix 독자들은 여러 개의 스왑 장치를 활용하지 않을 가능성이 높지만, 더 복잡한 Linux 서버 배포 환경을 가진 사용자들에게는 Tencent에서 새롭고 흥미로운 패치 시리즈가 공개되었습니다. Kairui Song이 리눅스 스왑 처리와 관련하여 다중 스왑 장치에 I/O를 더 잘 분배하고 여러 미해결 설계 문제를 해결하는 노력을 주도했습니다.
Song은 오늘 제출된 요청 의견(RFC) 패치 시리즈에서 다음과 같이 언급했습니다:
"이 시리즈는 다중 스왑 장치로의 I/O를 공정하게 분배하는 새로운 방법을 도입하며, 변경 가능한 plist와 전역 잠금(global lock)을 완전히 제거하여 전역 클러스터 캐시를 없애고 할당 및 회전을 더 자유롭게 만듭니다. 이는 특히 스왑 계층화(swap tiering) 또는 레이어드 스왑에 도움이 됩니다. 계층화가 먼저 적용되어야 하므로 RFC로 검토 요청하며, 이것은 나중에 최적화로 리베이스하고 합칠 수 있습니다. 또한 이 시리즈를 기반으로 개선할 수 있는 몇 가지 항목이 있습니다. 저는 특히 이러한 새로운 아이디어에 친화적이도록 계층화 및 레이어드 개념을 염두에 두고 여러 다른 접근 방식을 로컬에서 테스트했습니다.
종속성(dependency)으로서, 이는 스왑 장치 관리를 위한 잠금 패턴도 정리하고 재작업합니다. 모든 스왑 장치와 새로 도입된 percpu 리더 우선순위 큐는 더 나은 확장성과 더욱 미래 지향적인 설계를 위해 percpu rwsem에 의해 보호됩니다."
이전에는 각 스왑 장치마다 자체적인 percpu 클러스터 캐시가 있었습니다. 성능 향상을 위해 commit 1b7e90020eb7 ("mm, swap: use percpu cluster as allocation fast path")는 클러스터 캐시를 전역 범위(global scope)로 옮기고 모든 장치가 동일한 전역 캐시를 공유하도록 했습니다. 따라서 plist에 항상 접근할 필요가 없어졌고, 빠른 스왑 할당은 각 CPU의 클러스터 캐시만 사용하게 됩니다. 장치 회전(Device rotation)은 여전히 하나의 클러스터가 클러스터 캐시에서 비워질 때 plist를 통해 처리되는데, 이는 클러스터 할당과 회전을 묶어 놓은 것입니다. 작동은 하지만, 이 전체 설계는 여러 오랫동안 지속된 문제들을 야기했습니다:
-
장치 선택 위에 위치한 전역 percpu 클러스터 캐시는 스왑 티어링(swap tiering)이나 계층적 스왑 할당과 같은 개념과 근본적으로 충돌합니다. 특정 스왑 장치를 우회해야 하므로, 캐시 역시 우회해야 하는데, 캐시는 안정적인 소유권을 갖고 있지 않습니다. 이는 매우 낮은 성능을 초래할 수 있습니다. 또한 우선순위 역전(priority inversion)이나 장치 회전 같은 다른 문제들도 있습니다. 이들은 swap tier 시리즈에서 더 자세히 설명됩니다.
-
plist 자체는 라운드 로빈(round-robin)으로 장치를 회전시키기 위해 plist_requeue()를 필요로 하며, 이는 swap_avail_lock을 보유해야 합니다. 할당자는 다음 순서를 반복해야 합니다: 락 획득 -> 선택 -> 락 해제 -> 할당 -> 락 획득 -> 회전. 모든 CPU가 동일한 전역 리스트 헤드에 대해 경쟁하며, 이 설계는 유연하지도 견고하지도 않습니다.
-
회전은 느린 경로(slow path)로 간주됩니다. plist 접근을 피하기 위한 빠른/느린 경로 설계 때문에 commit 9fb749cd15078 ("mm, swap: do not perform synchronous discard during allocation")와 같은 임시 방편이 생겨났습니다. plist에 접근하기 전에 실제 장치를 안정적으로 확보할 수 없기 때문에, 이 설계는 최적이 아니며 많은 제약 사항을 가집니다.
-
회전이 어떻게 작동하는지에 대한 명확한 규칙이 없습니다. 라운드 로빈 회전은 클러스터 할당 알고리즘에 강하게 묶여 있으며, 클러스터 소진(drain)은 예측하기 어렵습니다. 우리는 대략 2M의 회전 블록 크기를 갖겠지만, 이는 시간이 지남에 따라 변동됩니다.
이 시리즈는 이러한 모든 문제들을 단계적으로 제거합니다.
Linux의 다중 SWAP 장치 처리를 개선하는 것에 대해 더 알고 싶은 분들은 이 유망한 작업을 위한 패치들을 참고할 수 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Phoronix의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기