Proceedings of the 2020 USENIX Annual Technical Conference, ATC 2020
개요
Go언어를 통해서 마치 Volatile memory를 다루는 것처럼 Pmem을 다룰 수 있도록 User friendly한 API를 제공하는 것을 목표로 하는 연구이다. Single type system, No fat pointer, Seperate heap, Journaling, named-objects, txn (undo logging), Reuse function for volatile and persistent memory and new GC를 바탕으로 여러가지 새로운 실험과 구현을 하였다.
추가적으로 지표중에 Redis AOF라고 있는데, Redis는 AOF모드라고 해서, in memory data들이 사라지지 않도록 하는 Backup모델을 제공한다. AOF모드는 append-only-file의 약자로서 Redis가 마치 저널처럼 사용해서 매 write전에 AOF파일에 먼저 적도로 하여서 Data loss를 예방하는 역활을 한다. 이 모드로 Persistent-Redis와 비교하였다.
추가적인 Pmem의 이점/단점을 볼려면 NVM, PACTree참고.
Design
- Memory Allocation
- Go lang의 Memory Allocation과 비슷하게 Journaling을 통하여 transaction을 보장하는 API를 2개 제공하였다. pnew, pmake을 통해서 Type에 맞는 Static object를 Allocation하였다.
- Transactional using codeblock
- txn("undo")는 이 코드블락에 위치한 데이터들이 Transaction임을 제시하는 code block이다. 이 코드블락에 들어가는 PMem은 logging을 통하여 Atomic, Consistency를 보장한다.
- Runtime change
- Go에서 사용하는 Runtime structure들이 Atmoic하게 사용될 수 있도록, 추가적인 Logging을 통하여 관련 데이터를 transaction의 영역에 포함시켰다. 이때 전체적인 Data strcuture를 모두 logging하는 것이 아니라 Metadata만을 Logging하도록 하여서 추가적인 수정에 대한 effort를 줄였다.
- Pointer Swizzling
- Persistent memory는 File을 통하여 제시되기 때문에 Pmem에 의해서 Allocation된 메모리 오브젝트의 주소값은 계속 변경될 수 있다. 이러한 차이를 줄이기 위해서 go-pmem은 metadata에 저장된 Pointer siwzzling offset을 이용하여 이를 해결하였다. Application이 restart하는 시점에 이러한 Swizzling이 Consistency하게 이루어지도록 하였다.
- Named object
- 모든 pmem에 저장되는 object들은 String으로 구성된 이름을 가질 수 있도록 하였다. 이를 통해서 지정된 이름을 통해서 Initialization이 보다 효과적으로 이루어질 수 있도록 하였다.
- Transactions
- txn이라는 키워드를 통해서 명시적으로 Undo logging이 수행되도록 하였다. 이 작업은 User가 직접 txn("undo")를 일관성을 유지해야 하는 부분에 마킹하는 것으로 이루어진다. 또한 Isolation을 보장하기 위한 기법도 User에 의존하였다. 또한 Transaction의 Concurrent한 실행을 보장하지 않는다.