ラージページの同期割り当てを強制する方法は?

ラージページの同期割り当てを強制する方法は?

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個の巨大なページが割り当てられていないか、そのような割り当てが絶対不可能であると決まらない限り返さないように」要求するにはどうすればよいですか?

関連情報