Files
document-haness/docs/virtualization/tech-log-studio/memory-virtualization/question/question-host-thp-policy.md
T

6.9 KiB

id, kind, slug, title, topic, topicName, project, status, questionStatus, studio, sourceRevision, source
id kind slug title topic topicName project status questionStatus studio sourceRevision source
50730203-df5f-4604-8535-7e93ab6fb724 QUESTION host-thp-policy 이 호스트의 THP 정책과 huge page 상태는 무엇인가 memory-virtualization 메모리 가상화 virtualization 초안 OPEN https://hyeonworks.com/studio/documents/50730203-df5f-4604-8535-7e93ab6fb724/edit no-commit · 밖에서 반입한 문서 한 편. 고정할 저장소 리비전이 없다
final/document.md#83-실제-환경에서-확인할-open-question-oq-4
final/document.md#53-thp-transparent-huge-pages
final/document.md#56-thp와-hugetlb-비교

이 호스트의 THP 정책과 huge page 상태는 무엇인가

THP(Transparent Huge Pages, 투명한 대형 페이지)는 커널이 조건이 맞는 메모리 영역에 Huge Page 를 알아서 활용하려는 기능이다. 그 활용 범위를 정하는 정책 값이 커널과 배포판, 호스트 설정에 따라 다르다 보니, 개념 문서는 값을 적지 않고 실제 시스템에서 읽으라고만 했다.

이 물음은 그 값을 읽는 데서 끝난다. 정책이 always 인지 madvise 인지 never 인지, 그리고 huge page 항목 넷의 값이 호스트와 두 게스트에 대해 적히면 닫힌다.

§83 이 적은 열린 물음 열넷 가운데 확인 명령이 함께 적힌 것은 아홉이고 OQ-4 가 그 아홉에 든다. 명령이 없는 다섯은 전부 구간을 나눠 견주는 실험이고, 이 물음은 명령 두 줄의 출력으로 닫힌다.

관계

  • Huge Page 를 VM 에서 볼 때 갈라지는 세 자리 게스트 단계와 호스트 backing 을 따로 읽어야 한다는 설명이 이 물음을 호스트와 게스트로 나눠 찍는 이유다.
  • 가상 머신 RAM 이 HugeTLB 로 명시적으로 backing 되어 있는가 여기서 읽은 HugePages_Total 이 그 물음의 입력이 된다.
  • 메모리 실험 결과에는 Host · VM · Workload 조건을 함께 남긴다 THP policy 가 그 기준이 요구하는 호스트 조건 목록에 들어 있다.

사실

  • §53 은 THP 를 Linux 가 가능한 메모리 영역에 Huge Page 를 투명하게 활용하려는 기능으로 적었다. 애플리케이션이 일반 malloc()/mmap() 을 부르면 커널이 조건이 맞을 때 Huge Page 활용을 시도하는 경로다.
  • §53 은 상태 확인 명령으로 cat /sys/kernel/mm/transparent_hugepage/enabled 를 들고 출력 예로 always [madvise] never 를 적었다. 대괄호가 붙은 값이 지금 정책이다.
  • §53 은 현재 정책이 커널과 배포판, 호스트 설정에 따라 다르므로 실제 시스템에서 확인한다고 밝혔다. 값을 문서에서 옮겨 올 수 없다는 뜻이고, 이 물음이 있는 이유다.
  • §56 은 호스트 확인 명령으로 두 줄을 들었다. grep -i huge /proc/meminfo cat /sys/kernel/mm/transparent_hugepage/enabled
  • §56 은 AnonHugePages 와 HugePages_Total 이 같은 뜻이 아니라고 못 박았다. 같은 표에서 THP 는 커널이 알아서 하는 활용, HugeTLB 는 명시적으로 잡아 두는 풀로 갈라 적었다.
  • §83 OQ-4 는 확인할 것으로 다섯을 적었다. THP policy AnonHugePages HugePages_Total HugePages_Free Hugepagesize
  • 이 호스트에서 그 다섯을 읽은 기록이 개념 문서에 없다. 게스트 쪽 값도 없다.

가정

  • 호스트에 붙어 sysfs 파일과 /proc/meminfo 를 읽을 수 있다고 본다.
  • 두 명령의 출력이 읽는 시점의 상태라고 본다. 그 뒤에 값이 바뀌지 않는다는 근거는 개념 문서에 없으므로 읽은 시각을 함께 남긴다.
  • 게스트 커널도 같은 두 파일을 제공한다고 보고 같은 명령을 게스트에서도 찍는다. 게스트 배포판에 그 파일이 실제로 있는지는 확인하지 않았다.

미지수

  • 이 호스트의 THP 정책이 always 인지 madvise 인지 never 인지.
  • AnonHugePages · HugePages_Total · HugePages_Free · Hugepagesize 의 실제 값.
  • HugeTLB 풀이 잡혀 있는지. HugePages_Total 이 0 이면 없는 것이고, 0 이 아니면 그 풀을 누가 쓰는지는 이 물음이 답하지 않는다.
  • 두 가상 머신 안에서 같은 다섯 항목이 어떻게 보이는지, 그리고 호스트 값과 다른지.

제약

  • 값을 읽는 데서 끝낸다. 정책을 바꾸거나 풀을 새로 잡는 일은 이 물음에 들어 있지 않다.
  • 호스트와 게스트 값을 한 줄에 합쳐 적지 않는다. §52 가 게스트의 page-size 선택과 호스트 backing 을 하나의 동일한 설정으로 취급하지 말라고 적었다.
  • AnonHugePages 와 HugePages_Total 을 같은 값으로 읽지 않는다. §56 이 둘을 구분했다.
  • 이 호스트에서 잰 값이 없어 다른 장비의 기본 정책을 이 호스트의 값으로 삼지 않는다.

선택지

1. 호스트 다섯 항목만 먼저 읽는다

명령 두 줄이면 끝나고, 그 다섯 값이 §85 가 요구하는 호스트 조건 가운데 THP policy 칸을 바로 채운다. 실험을 시작하기 전에 한 번 찍어 두는 용도로 충분하다.

게스트 쪽 정책은 남는다. HugeTLB 쪽으로 넘어갈 때 게스트 값을 다시 받으러 붙어야 한다.

2. 호스트와 두 게스트를 한 번에 읽는다

같은 두 명령을 호스트에서 한 번, 각 게스트에서 한 번씩 찍어 세 벌을 만든다. §52 가 요구한 구분이 값으로 남고, 게스트가 madvise 인데 호스트가 always 인 것 같은 차이도 세 벌을 나란히 놓으면 바로 보인다.

게스트에 접속해야 하고, 두 가상 머신이 같은 시각에 켜져 있어야 한다.

3. 배포판 기본값을 적어 두고 넘어간다 — 제외

정책 값을 조사하는 대신 배포판이 보통 쓰는 기본값을 적는 방법이다. §53 이 정책은 커널과 배포판, 호스트 설정에 따라 다르니 실제 시스템에서 확인하라고 적었으므로, 이 방법으로는 이 물음이 닫히지 않는다.

다음 검증

  1. 호스트에서 cat /sys/kernel/mm/transparent_hugepage/enabled 를 찍고 대괄호가 붙은 값을 정책으로 적는다.
  2. 같은 시각에 호스트에서 grep -i huge /proc/meminfo 를 찍어 AnonHugePages · HugePages_Total · HugePages_Free · Hugepagesize 를 그대로 옮긴다.
  3. 같은 두 명령을 가상 머신마다 따로 찍고 호스트 값과 나란히 적는다.
  4. 실행한 명령과 출력, 찍은 시각을 함께 증거로 남긴다.

닫는 조건 : 다섯 항목의 값이 호스트와 각 게스트에 대해 적히면 닫는다. HugePages_Total 이 0 이 아니면 그 풀을 가상 머신이 쓰고 있는지는 「가상 머신 RAM 이 HugeTLB 로 명시적으로 backing 되어 있는가」가 받는다. 정책이 always 로 나오고 지연에 민감한 워크로드를 돌리고 있으면 §54 가 든 compaction 영향을 측정할지는 Decision 으로 넘긴다. 이 물음 자체는 정책 값을 확정하는 데서 끝난다.