대형 페이지의 동기 할당을 강제하는 방법은 무엇입니까?

대형 페이지의 동기 할당을 강제하는 방법은 무엇입니까?

vm.nr_hugepagesLinux에서는 sysctl 또는 /sys/kernel/mm/hugepages/hugepages-<SIZE>kB/nr_hugepagessysfs 파일에 작성하여 (투명하지 않은) hugepage를 할당할 수 있습니다 .

# to allocate 2 GiB worth of huge pages, assuming a huge page size of 2 MiB (default on x86)
$ sysctl vm.nr_hugepages=1024

# likewise, but explicitly
$ echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages; grep . /sys/kernel/mm/hugepages/hugepages-2048kB/*
/sys/kernel/mm/hugepages/hugepages-2048kB/free_hugepages:1024
/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages:1024
/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages_mempolicy:1024
/sys/kernel/mm/hugepages/hugepages-2048kB/nr_overcommit_hugepages:0
/sys/kernel/mm/hugepages/hugepages-2048kB/resv_hugepages:0
/sys/kernel/mm/hugepages/hugepages-2048kB/surplus_hugepages:0

그러나 Linux가 필요한 거대한 페이지 수를 할당할 수 없는 경우 나머지는 자동으로 건너뜁니다.

$ sysctl vm.nr_hugepages=1024
vm.nr_hugepages = 1024

$ sysctl vm.nr_hugepages
vm.nr_hugepages = 640

장기 실행 시스템에서 요청된 대용량 페이지 수를 할당할 가능성은 페이지 캐시 재설정 요청 및 메모리 압축 요청과 혼합된 루프에 할당함으로써 다소 향상될 수 있습니다.

while :; do
    sysctl vm.drop_caches=3
    sysctl vm.compact_memory=1
    sysctl vm.nr_hugepages=1024

    nr=$(sysctl -n vm.nr_hugepages)
    echo "vm.nr_hugepages = $nr"
    if (( nr >= 1024 )); then
        break
    fi
done

그러나 이것은 기껏해야 더러운 해킹이며 전체 페이지 캐시의 불필요한 무효화 및 스래싱을 ​​유발할 수 있습니다.


N개의 거대한 페이지 할당을 요청하고 할당을 완료하는 데 필요한 모든 작업(예: 메모리 압축, 페이지 캐시 제거 등)을 자동으로 트리거하고 완료될 때까지 동기적으로 기다리는 덜 구식적인 방법이 있습니까?

즉, 커널에 "N개의 거대한 페이지를 얻기 위해 모든 노력을 기울이고, N개의 거대한 페이지가 할당되지 않거나 그러한 할당이 절대 불가능하다고 결정되지 않는 한 반환하지 않도록" 요청하려면 어떻게 해야 합니까?

관련 정보