본문 바로가기
Kernel/Memory Management

Virtual Memory: Memory Compaction

by hyeyoo 2022. 1. 10.
※ 이 블로그의 글은 글쓴이가 공부하면서 정리하여 쓴 글입니다.
※ 최대한 내용을 검토하면서 글을 쓰지만 틀린 내용이 있을 수 있습니다.
※ 만약 틀린 부분이 있다면 댓글로 알려주세요.

이전 글

 

Virtual Memory: Zone의 종류

노드(Node)는 용도에 따라서 메모리 영역을 한 개 이상의 영역으로 분리해서 관리한다. 이 때 각 영역을 존(Zone)이라고 한다. 이 글에선 존의 종류에 어떤 것이 있는지 알아본다. 존과 노드, NUMA에

hyeyoo.com

 

Virtual Memory: Grouping pages by mobility

2000년대에는 가상 메모리에서 단편화를 줄이려는 노력이 꾸준히 있었다. 그 중 하나가 이 글에서 분석할, Mel Gorman의 패치 시리즈이다. 이 패치 시리즈는 특성이 서로 다른 페이지를 묶어서 관리

hyeyoo.com

Memory Compaction

Virtual Memory: Grouping pages by mobility에서 알아봤듯 커널은 존 내에서 Movable, Reclaimable, Unmovable 등등 비슷한 특성의 페이지끼리 따로 분리해서 할당하기 때문에 단편화를 줄여준다. list-based grouping 방식이 수동적인 방식이라면, Memory Compaction은 Movable한 페이지를 실제로 옮겨서 좀더 능동적으로 메모리 단편화를 줄인다. 패치 시리즈는 여기에 있다.

앞선 글에서 말했듯, 커널이 포인터로 직접 접근하지 않는 메모리는 Movable하다. 예를 들어서 사용자 공간에서 할당한 메모리는 사용자 프로세스에서 가상 주소로 접근하기 때문에, 페이지 테이블을 수정하고 페이지의 내용을 다른 페이지로 복사하면 페이지를 옮길 수 있다. ㅡ 다시말해 가상 주소에 대해 매핑되어있는 물리적인 페이지를 다른 곳으로 복사하고, 매핑을 수정하면 페이지를 옮길 수 있다.

 

단편화된 메모리

예를 들어서 위 사진처럼 단편화된 메모리가 있다고 해보자. compaction 알고리즘에선 메모리를 존 내에서 (ZONE_MOVABLE은 상관이 없다.) 동시에 두 방향으로 스캔한다. 이 때 하나를 migration scanner, 나머지 하나를 free scanner라고 하자.

migration scanner는 존 내에서 할당된 페이지 중 Movable한 페이지의 목록을 수집한다.

free scanner는 migration scanner의 반대편에서 free page의 목록을 수집한다. 그러다보면 중간에서 두 스캐너가 만나는 지점이 생기는데, 이때 migration scanner가 수집한 movable한 페이지를 free page에 복사하고 페이지 테이블을 수정해서 페이지를 "옮기면" 물리적으로 연속적인 페이지가 생긴다.

이렇게 하면 물리적으로 연속적인 페이지를 만들어낼 수 있다. 패치를 만들 시점에서는 direct reclaim을 할 때나, 아니면 procfs로 지정해줄 때만 compaction을 실행했는데, commit 698b1b30642f ("mm, compaction: introduce kcompactd") 이후로는 백그라운드에서 compaction을 수행하는 스레드도 생긴 것으로 보인다. 실제로 direct reclaim을 할 때만 compaction을 하면 reclaim하는 latency가 너무 늘어난다. kcompactd도 그래서 생긴 것 같다.

이쯤 되니까 mm 서브시스템 코드를 아직 해석하지 못해서 너무 불편하다. 필요한 개념들 좀만 더 정리하고 코드에 좀 익숙해져야겠다. 

참고 문서

 

[RFC v2 0/4] Outsourcing compaction for THP allocations to kcompactd — Linux Kernel

 

www.spinics.net

 

Memory compaction [LWN.net]

Please consider subscribing to LWNSubscriptions are the lifeblood of LWN.net. If you appreciate this content and would like to see more of it, your subscription will help to ensure that LWN continues to thrive. Please visit this page to join up and keep LW

lwn.net

 

'Kernel > Memory Management' 카테고리의 다른 글

KASAN: Kernel Address SANitizer  (0) 2022.04.09
Virtual Memory: Transparent Huge Pages  (0) 2022.03.23
Virtual Memory: Zone의 종류  (0) 2022.01.03
Virtual Memory: Grouping pages by mobility  (0) 2022.01.02
Virtual Memory: Node and Zone  (5) 2022.01.02

댓글