透明な hugepageがどのように機能するか、およびによって実行される割り当てなどの割り当てmalloc
が huge page によって満たされる可能性があることをよく理解しています。
私が知りたいのは、メモリが巨大なページに支えられているかどうかを判断するために、割り当て後に(おそらくヒューリスティックに)できるチェックがあるかどうかです。
透明な hugepageがどのように機能するか、およびによって実行される割り当てなどの割り当てmalloc
が huge page によって満たされる可能性があることをよく理解しています。
私が知りたいのは、メモリが巨大なページに支えられているかどうかを判断するために、割り当て後に(おそらくヒューリスティックに)できるチェックがあるかどうかです。
ファイル内の「pfn」(ページ フレーム番号) を検索することで、透明な (または非透明な) hugepage によってサポートされているかどうかなど、ページの正確なステータスを判断でき/proc/kpageflags
ます。/proc/$PID/pagemap
仮想アドレスによってインデックス付けされたプロセスのファイルから読み取ることにより、ページの pfn を取得します。
残念ながら、1pfn
の値とファイル全体の両方にアクセスできるのは root ユーザーのみです。それでも、少なくとも関心のあるテストまたはベンチマークのシナリオでプロセスをルートとして実行できる場合、これはうまく機能します。pagemap
/proc/kpageflags
関連する解析を行うpage-infoという小さなライブラリを作成しました。メモリの範囲を指定すると、メモリ内に存在するかどうか、ヒュージページに支えられているかどうかなど、各ページに関する情報が返されます。
たとえば、含まれているテスト プロセスを as として実行するとsudo ./page-info-test THP
、次の出力が得られます。
PAGE_SIZE = 4096, PID = 18868
size memset FLAG SET UNSET UNAVAIL
0.25 MiB BEFORE THP 0 1 64
0.25 MiB AFTER THP 0 65 0
0.50 MiB BEFORE THP 0 1 128
0.50 MiB AFTER THP 0 129 0
1.00 MiB BEFORE THP 0 1 256
1.00 MiB AFTER THP 0 257 0
2.00 MiB BEFORE THP 0 1 512
2.00 MiB AFTER THP 0 513 0
4.00 MiB BEFORE THP 0 1 1024
4.00 MiB AFTER THP 512 513 0
8.00 MiB BEFORE THP 0 1 2048
8.00 MiB AFTER THP 1536 513 0
16.00 MiB BEFORE THP 0 1 4096
16.00 MiB AFTER THP 3584 513 0
32.00 MiB BEFORE THP 0 1 8192
32.00 MiB AFTER THP 7680 513 0
64.00 MiB BEFORE THP 0 1 16384
64.00 MiB AFTER THP 15872 513 0
128.00 MiB BEFORE THP 0 1 32768
128.00 MiB AFTER THP 32256 513 0
256.00 MiB BEFORE THP 0 1 65536
256.00 MiB AFTER THP 65024 513 0
512.00 MiB BEFORE THP 0 1 131072
512.00 MiB AFTER THP 124416 6657 0
1024.00 MiB BEFORE THP 0 1 262144
1024.00 MiB AFTER THP 0 262145 0
DONE
このUNAVAIL
列は、マッピングに関する情報が利用できなかったことを意味します。これは通常、ページがアクセスされたことがないため、まだページによってまったくサポートされていないためです。これらの「大規模な」割り当てでは、メモリに触れていないため、割り当てに続いて単一のページのみがマップされていることがわかります。
AFTER
割り当て全体を呼び出した後、行は同じ情報になるmemset()
ため、すべてのページが物理的に割り当てられます。ここで、4 MiB の割り当てに到達するまで、Transparent hugepage によって割り当てがサポートされていないことがわかります。この時点で、513 ページを除いて、各割り当ての大部分が THP によってサポートされています (割り当てられた領域の端にあることが判明しました)。 )。512 MiB では、システムは利用可能な hugepage を使い果たし始めますが、それでもほとんどの割り当てを満たしますが、1024 MiB では割り当て全体が小さなページで満たされます。
このライブラリは本番環境に対応していないため、重要な用途には使用しないでください (たとえば、いくつかの障害は単純に を呼び出しますexit()
)。貢献を歓迎します。
1およそカーネル 4.0 以降、それ以前は pfn は root 以外のユーザー プロセスからアクセス可能でした。4.0 から 4.1 かpagemap
そこらまでは、root 以外のプロセスに対して全体が立ち入り禁止でしたが、それ以降、ファイルは再び使用可能になりましたが、pfn はマスクされています (常にゼロとして表示されます)。
従来の hugepage と Transparent huge page (THP) には違いがあります。THP の場合、アプリケーションは開発者のサポート (mmap、shmget など) やシステム管理者の介入なしにヒュージ ページを使用できます。
コードでは、これを確認する簡単な方法がないのではないかと心配しています。ただし、sizeof() で割り当てられたデータ構造またはバッファーがわかっている場合は、次のコマンドを使用して、システムでの THP の使用状況を grep して確認する価値があります。この使用量は、アプリケーションの実行中に増加するはずです:
# grep AnonHugePages /proc/meminfo
AnonHugePages: 2648064 kB