[v5.17] The kernel radar: folios, multi-generational LRU, and Rust
Kernel/lwn.net

[v5.17] The kernel radar: folios, multi-generational LRU, and Rust

반응형
혹시나 틀린 번역 혹은 틀린 내용이 있다면 언제든지 말씀해주세요.
또 알고 계신 자세한 내용이나 위 글과 관련된 좋은 정보가 있다면, 공유해주시면 감사하겠습니다!

Introduction

lwn.net에서 발간하는 기사 중 현재 개발 중인 커널에 관련된 여러 주제들 중 주목되고 있는 주제들에 대해 짤막하게 소개해주는 게 있어서 간단한 번역과 함께 살펴보려 한다. 이번 5.17 버전 개발 주기에서는 무엇이 화두가 되고 있는지 살펴보자. 

https://lwn.net/Articles/881675/  (2022.01.20 published by Jonathan Corbet)

 

The kernel radar: folios, multi-generational LRU, and Rust [LWN.net]

This article brought to you by LWN subscribersSubscribers to LWN.net made this article — and everything that surrounds it — possible. If you appreciate our content, please buy a subscription and make the next set of articles possible. By Jonathan Corbe

lwn.net


A folio update

folio는 [여기]에서 처음 활성화되었던 1년 좀 안된 주제다. folio는 간단히 말해 현재의 struct page가 tail page가 아님을 보장해주는 컨테이너다. 요약하자면, 지금까지와는 달리 큰 page 그룹을 다룰 때 일일이 tail page인지를 검사하고 아니라면 head page를 찾아가는 과정을 진행을 생략해줌으로써 코드를 간결하게 하고 성능상의 이점을 노린 것이다 [번역]. 광범위한 토론을 거친 후에 첫 folio 패치가 5.16에 머지되었다.

이번 5.17에서 보이는 또 다른 folio와 관련된 변화는 대부분 file data를 캐싱하는 page cache에 집중하고 있다. page cache를 이제는 작아 보이는 4K의 페이지보다는 large folios(=multi-page folios)를 사용할 수 있도록 5.17에서 변환하고 있다. large folios는 huge pages지만 이 크기가 CPU가 지원하는 크기로만 한정할 필요는 없다. 2의 거듭제곱(2^X 크기)인 한 어떠한 folio 크기도 지원하는 것이 계획이다.

5.17 작업으로 page cache의 large folios 사용 지원, 저수준의 filesystem 지원 코드, 그리고 XFS 파일 시스템을 추가하지만, 아직 실제로 사용하지는 않는다. Matthew Wilcox는 "page cache for 5.17" pull request에서 "자신이 간과한 page 크기 추정하는 부분이 있을지도 모른다."라고 하면서 large folios를 위한 여러 패치를 작성 중이다. 앞으로의 개발 주기에서는 그런 부분들을 찾고 아마 5.18에서 적용할 것이다. [관련 pull request]

 

The multi-generational LRU

이번 주제도 memory-management와 관련된 또 다른 중요한 변화에 대한 얘기다. LRU(Least-Recently-Used)란 가장 오랫동안 참조되지 않은 페이지를 교체하는 알고리즘이다 [LRU에 대해]. 리눅스 커널에서는 메모리가 부족한 상황이 올 때 memory reclaim에 LRU 정책을 활용한다 [기존의 LRU에 대해].

현재 커널은 "active", "inactive" 두 상태의 페이지를 각각 가지는 두 개의 큐 시스템을 사용하고 있다. 메모리가 필요할 때 inactive queue의 끝에서부터 페이지들이 reclaim 된다. 여기서 multi-generational 작업은 두 개의 큐를 많은 수의 큐로 일반화하는 것이다. 이러한 변화는 겉보기에는 근미래에 사용되지 않을 것 같은 페이지들을 판별하는 커널의 능력을 향상하는 것처럼 보인다.

하지만 multi-generational LRU의 적용에 대해서는 긴 토론이 벌어졌다. 점진적 접근을 통해 개선해나가자는 Michal Hocko, 이에 대해 다소 부정적인 반응을 보였던 Jesse Barnes 등 여러 의견이 오갔다. 그래도 개중에서는 성능 향상을 느낀 사람들도 있었다. 그렇지만 여전히 5.17에는 머지되지 않을 것 같고 5.18에서는 낙관적일지도 모르지만 2022년의 언젠가 실현될 수도 있다.

* 추가로 MGLRU에 대해 알고 싶다면 이 글이 투고된 당시 기준으로 최신 MGLRU의 패치된 내용 + 바로 그 전 관련 글에 대한 링크를 참고하길 바란다.

https://lwn.net/Articles/851184/

 

The multi-generational LRU [LWN.net]

LWN.net needs you!Without subscribers, LWN would simply not exist. Please consider signing up for a subscription and helping to keep LWN publishing By Jonathan Corbet April 2, 2021 One of the key tasks assigned to the memory-management subsystem is to opti

lwn.net

https://lwn.net/Articles/856931/

 

Multi-generational LRU: the next generation [LWN.net]

This article brought to you by LWN subscribersSubscribers to LWN.net made this article — and everything that surrounds it — possible. If you appreciate our content, please buy a subscription and make the next set of articles possible. By Jonathan Corbe

lwn.net

 

Rust for Linux

커널 모듈을 러스트 프로그래밍 언어로 개발할 수 있게 만드는 프로젝트는 계속 진행되고 있다. 1월 17에 세 번째 버전의 Rust-support 패치 셋이 나왔다. 이 패치 셋은 최신의 1.58 release 러스트 컴파일러를 지원한다. 빌드 시스템에서는 빌드에 필요한 적당한 러스트 툴체인을 자동으로 결정해준다든지, 없는 게 있다면 개발자에게 무엇이 필요한지 말해준다든지, 커널 작업에 필요한 features가 곧 stable 될 것을 공지해준다든지 등의 내용이 포함되어 있다. 하지만, 여전히 필요한 수많은 unstable features가 존재한다.

이 시리즈는 그 자체로 kallsyms 메커니즘에서 다룰 수 있는 심볼의 최대 길이를 늘리는 것에서 시작한다. 러스트에서 사용하는 name-mangling은 name을 상당히 늘릴 수 있어서 255개의 문자로는 몇몇 name을 담기에 충분하지 않아 보인다. 또 다른 예비 단계는 메크로나 인라인 된 함수들, 즉 함수처럼 보이는 그런 많은 것들에 대해서 도와줄 C helper 함수를 추가하는 일이다. 그것들은 러스트에서는 직접적으로 call 될 수 없기 때문에 적절한 함수로 먼저 변환될 필요가 있다.

대부분의 러스트 코드는 그 자체로 2가지 crate 안에 있다. 하나는 alloc인데 메모리 할당에 대해 다룬다. 러스트에서는 메모리 할당이 실패할 때 보통 즉시 crash를 일으킨다. 하지만 이는 커널 코드에서는 impolite 하므로 그런 실패에 대해 다룰 수 있는 수정된 allocator가 필요하다. 이 allocator는 Result 오브젝트를 반환할 것이라 개발자들은 예측한다. 결국 이러한 할당 실패를 지원하는 작업은 upstream 러스트 라이브러리로 간다는 뜻이기 때문에 이 alloc crate는 삭제될 수 있다.

또 다른 큰 crate는 kernel이다. 이 crate는 커널 API들을 적절한 러스트 인터페이스로 만들어주는 임피던스-매칭 코드(정확한 뜻은 모르겠지만 대충 정의상 왜곡을 줄이는 코드라는 뜻인 것 같다)의 나머지를 다룬다. 캐릭터 디바이스, clock 프레임워크, file 구조체, file_operations 벡터, memory-mapped I/O 함수들, mutexes, spinlocks 등등을 위한 인터페이스를 제공한다. 그리고 엄청난 양의 코드가 제네릭 링크드 리스트 구현에 집중하고 있다.

하지만 아직 mainline kernel을 지원하려면 멀었다. 많은 개발자들이 보고 작업을 해야 도움이 될 것이다.


My Opinion

형곤 님 블로그에서 처음 folio에 대해 접하고 나서 자세히 안 살펴봤었는데 이번 기회를 통해 본 struct page가 엄청 복잡하다는 것을 알았다. struct slab과 struct page를 분리하려는 시도는 예전부터 있었는데 struct page는 #ifdef ~ #else 구문과 union 등으로 인해 각 환경에 따라 구성되는 오프셋이 다양하다. 그래서 환경에 따라 만들어지는 페이지가 다르다 보니 개발자들도 mm을 할 때 굉장한 불편을 겪었다. 이걸 해결하기 위해 등장한 개념이 folio인 만큼 앞으로 지켜보야 할 것 같다는 생각이 들었다.

커널에서의 memory reclaim은 굉장히 복잡한 루틴을 가지고 있어서 분석이 쉽지 않다. 이해하기 위해 기본적으로 알아야 할 개념도 많고 로직도 복잡해서 나는 아직 손도 못 대보고 있다. 하지만 운영체제를 배울 때 이론으로만 접했던 것을 이번 기사를 통해 커널에서 기존에 사용하고 있는 LRU 정책에 대해서도 알아보고 앞으로 적용될 MGLRU에 대해서도 간단하게나마 접하는 기회가 되어 좋았다. 그리고 아직 적용될 시기는 미지수지만 MGLRU가 완성되는 시기에 다시 한번 관련 글을 작성하는 기회가 있으면 적고 싶다.

마지막으로 러스트에 대한 얘기인데 이건 내가 흥미로 시작한 러스트라는 언어가 또 다른 관심사인 커널과 결부되어 어떤 식으로 만들어지고 있는지 대략적인 그림을 살펴볼 수 있었다. 러스트를 사용해본 사람이면 공감할만한 일인데 기사에서도 언급했던 것처럼 러스트가 정말 미완성이다. standard library에서 지원하는 여러 기능들이 사실은 다른 언어들보다는 적은 게 사실이다. 역사가 상대적으로 짧으니만큼 당연한 얘기지만 내가 생각해도 여러 수준에서 봤을 때 러스트가 커널의 mainline에 포함되기에는 많은 개발진들의 노력이 필요하지 않을까 싶다. 그리고 러스트 스터디의 최종 프로젝트로 러스트 커널 프로젝트에 기여해볼까도 생각 중이긴 하다.


References

 

페이지 교체 알고리즘 - LRU

페이지 교체 알고리즘 사회의 자원은 한정되어 있고 그 한정된 자원을 효율적으로 사용하기 위해 각종 법과 규칙이 존재합니다. 눈에 확연히 보이지 않아 무한할 것만 같은 컴퓨터 자원도 사실

gomguard.tistory.com

 

메모리 재할당과 커널 파라미터

Linux Kernel Internal | 오늘은 리눅스 커널이 어떤 방식으로 메모리를 재할당 하는지 간단하게  살펴보겠습니다. 그리고 더불어 어떤 경우에 스왑을 사용하게 되고 이에 관련해 어떤 식으로 튜닝을

brunch.co.kr

 

[Linux Kernel 5] LRU (Memory Reclaim)

리눅스 커널은 메모리 부족시 reclaim에 LRU(Least Recently Used) 정책을 사용한다. 1. Basis 커널은 리스트를 이용하여 LRU를 구현한다. 커널 2.4엔 하나의 리스트를, 커널 2.6.28 이전엔 active_list와 inactiv..

pr0gr4m.tistory.com

 

Virtual Memory: Folio in 5.16

Introduction 저번 개발 주기때 간간이 보이길래 공부했었는데, 5.16에서 folio 패치셋이 드디어 머지되었다. 간단하게 요약해보자면 커널에서 메모리는 페이지 단위로 관리된다. 종종 여러 페이지를

hyeyoo.com

 

Multigenerational LRU Code Updated For Enhancing Linux Kernel Performance - Phoronix

Michael Larabel is the principal author of Phoronix.com and founded the site in 2004 with a focus on enriching the Linux hardware experience. Michael has written more than 20,000 articles covering the state of Linux hardware support, Linux performance, gra

www.phoronix.com

 

GitHub - Rust-for-Linux/linux: Adding support for the Rust language to the Linux kernel.

Adding support for the Rust language to the Linux kernel. - GitHub - Rust-for-Linux/linux: Adding support for the Rust language to the Linux kernel.

github.com

반응형