--- id: 50730203-df5f-4604-8535-7e93ab6fb724 kind: QUESTION slug: host-thp-policy title: 이 호스트의 THP 정책과 huge page 상태는 무엇인가 topic: memory-virtualization topicName: 메모리 가상화 project: virtualization status: 초안 questionStatus: OPEN studio: "https://hyeonworks.com/studio/documents/50730203-df5f-4604-8535-7e93ab6fb724/edit" sourceRevision: no-commit · 밖에서 반입한 문서 한 편. 고정할 저장소 리비전이 없다 source: - 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 으로 넘긴다. 이 물음 자체는 정책 값을 확정하는 데서 끝난다.