스케일러블 메모리 주소공간 기법 연구
연구 배경
TLB(Translation lookaside buffers)는 가상주소와 물리주소 간의 매핑 정보를 가지고 있는 캐쉬로, 애플리케이션의 성능에 중요한 역할을 한다. TLB 엔트리는 관련된 페이지 테이블 엔트리에 대한 일관성을 유지해야 하며, 이를 위해서 운영체제가 TLB shootdown 수행하여 코어간의 일관성을 유지한다. 다른 코어들의 불필요한 TLB 엔트리를 무효화하기 위해서, 다른 코어들에 IPI(Inter-processor interrupt)를 보내고, 인터럽트를 받은 코어에서는 TLB 엔트리를 무효화 한 후에, 응답을 하고, IPI 보낸 코어에서는 모든 코어들로부터 해당 작업이 끝났음을 알리는 응답을 모두 받는 동기화 과정을 거친다. 하지만 이런 동기화 방법은 세 가지 관점에서 오버헤드를 발생시킨다. 첫째, IPI는 자체로도 비용이 비싼 연산으로, 코어수가 많아 짐에 따라, 소켓을 넘어가는 다수의 코어로 IPI를 발생시킬때의 오버헤드는 점점 커진다. 둘째로, IPI를 받은 코어는 TLB 무효화를 처리하기 위하여, 유저에서 커널모드로 전환해야 하기 때문에 성능상의 저하를 발생시킨다. 그리고 마지막으로, IPI를 보낸 코어에서는 모든 코어들에서 완료되었다는 응답을 기다리기 때문에 발생하는 오버헤드가 존재하게 된다. 따라서 이러한 문제점을 해결하기 위하여, 비동기적으로 TLB shootdown을 처리하기 위한 Lazy Translation Coherence 기법을 제안한다.
연구 내용
Lazy Translation Coherence 기법에서는 기존 리눅스에서 동기화를 필요로 하는 IPI를 이용한 TLB shootdown 대신에 공유메모리를 이용한 Lazy TLB shootdown 방법을 적용하여 비동기적으로 TLB 엔트리에 대하여 무효화를 수행한다. 특정 코어에서 munmap과 같이 page를 free 시키는 시스템콜이 호출되었을 경우, IPI를 발생시키는 대신에 LATR states라는 per-core 메모리 공간에 가상 주소가 free 되었음을 알리는 엔트리를 저장한다. TLB 엔트리에 대해 무효화를 필요로 하는 다른 코어에서는 컨텍스트 스위치나 또는 OS 가 time tick을 처리하는 과정에서 LATR states를 확인한 후에, 해당 코어에서 처리해야할 엔트리가 존재하면 TLB 엔트리 무효화를 처리하도록 한다. 그리고 더 이상 가상주소를 사용하는 코어가 존재하지 않을 경우, LATR states의 엔트리는 재사용 된다. LATR state에는 가상 주소의 시작과 끝 주소, 현재 실행중인 프로세스를 식별할 수 있는 mm_struct 포인터 정보, 해당 주소를 사용하고 있는 코어를 나타내는 bitmask 정보, 그리고 free와 migration을 식별하기위한 flag 정보를 포함한다. Lazy TLB shootdown은 IPI와 같이 인터럽트를 처리하는 방식으로 다른 코어가 TLB 엔트리를 무효화시키지 않고, 커널이 time tick을 처리하거나 컨텍스트 스위치 하는 동안에 처리하게 됨으로써 지연이 발생할 수 있는데, 최대 2ms의 지연 메모리 반환이 발생할 수 있다. 하지만 메모리 반환(memory reclamination) 역시 그만큼 늦춤으로써 물리/가상 메모리 재사용 문제를 해결한다.
성능 실험
좌측 그림은 120코어에서 munmap을 수행할때의 지연시간과 TLB shootdown의 지연시간을 측정한 결과이다. LATR은 기존 리눅스보다 TLB shootdown 지연 측면에서 70% 개선되었으며, munmap의 경우 66% 까지 성능이 향상되었음을 알 수 있다. 아파치 웹서버 성능 측정에서는 적은수의 코어에서는 LATR이 리눅스와 비슷한 성능을 보여주지만 12코어에서는 리눅스 대비 59.9%, ABIS 대비 37.9% 의 성능향상을 보인다.
연구 결과물
- 논문
- 공개소프트웨어
- Github : Latr