
나는 만약 내가 그렇게 한다면cat /proc/meminfo
나는 다음을 얻습니다
…
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
DirectMap4k: 662864 kB
DirectMap2M: 7643136 kB
DirectMap1G: 1048576 kB
1G byte 페이지가 할당된 것을 볼 수 있다. 그런데 ksysguard를 살펴보니 메모리가 125M/213M(rss) 이상인 프로세스는 발견되지 않았습니다.
어떤 프로세스가 이를 사용하고 있는지 어떻게 알 수 있나요?
추가 정보
#> cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
답변1
이 DirectMap
항목은 메모리를 반영하지 않습니다.사용, 이는 물리적 메모리의 페이지 맵 또는 페이지 항목을 반영합니다. DirectMap1G
PUD 수준 페이지 테이블 매핑을 사용하여 매핑된 메모리 양을 계산합니다.
부팅 중에 매핑이 설정됩니다.arch/x86/mm/init_64.c
그리고 phys_pud_init
및 를 찾으세요 phys_p4d_init
. /proc/meminfo
개별 항목에 표시된 값의 합계는 DirectMap
시스템의 실제 RAM 총량과 유사해야 하며, 공유는 변경되더라도 총계는 절대 변경되지 않습니다(예: PUD 수준 맵은 다음과 같이 분할될 수 있음). PMD 수준 맵은 에 표시된 값을 줄이고 DirectMap1G
)에 표시된 값을 증가시킵니다 DirectMap2M
.
답변2
나는 이것이 질문에 완전히 대답한다고 생각하지 않지만 부분적으로 대답합니다.
조사하는 동안 실수로 재부팅했습니다. 재부팅 후 DirectMap1G
5GB가 아닌 것을 발견했습니다 . 나는 영구 구성으로 아무 것도 하지 않았다는 것을 깨닫고 난 후에. 나는 세 가지 페이지 크기의 합이 대략 내 RAM의 8GB 크기와 같다는 것을 알았습니다. 올바르게 추가했는데 8G9(8.9G)입니다. [아마도 다른 메모리 매핑 항목: vRAM 및 기타 하드웨어, MMU는 RAM만을 위한 것이 아닙니다]. 그런 다음 큰 프로세스를 시작하고 다시 측정했는데 총계는 여전히 약 8G9였습니다(약간 움직였습니다). 다른 프로세스를 열고, 측정하고, 다른 프로세스를 열면 항상 8G9가 됩니다.
답변3
DirectMap은 커널 공간과 관련된 측정항목입니다. 사용자 공간에서 사용할 수 있는 거대한 페이지처럼 생각하는 것 같습니다.
나는 인용한다:
DirectMap은 x86 전용이며 메모리 사용량보다는 TLB 로드(변환 참조 버퍼)를 표시합니다. 이는 4KB 페이지, 2MB/4MB 페이지 및 1GB 페이지(지원 및 사용되는 경우)로 매핑된 페이지 수를 계산합니다.