5

透明な hugepageがどのように機能するか、およびによって実行される割り当てなどの割り当てmallocが huge page によって満たされる可能性があることをよく理解しています。

私が知りたいのは、メモリが巨大なページに支えられているかどうかを判断するために、割り当て後に(おそらくヒューリスティックに)できるチェックがあるかどうかです。

4

2 に答える 2

4

ファイル内の「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 はマスクされています (常にゼロとして表示されます)。

于 2017-12-14T22:42:43.110 に答える
-1

従来の hugepage と Transparent huge page (THP) には違いがあります。THP の場合、アプリケーションは開発者のサポート (mmap、shmget など) やシステム管理者の介入なしにヒュージ ページを使用できます。

コードでは、これを確認する簡単な方法がないのではないかと心配しています。ただし、sizeof() で割り当てられたデータ構造またはバッファーがわかっている場合は、次のコマンドを使用して、システムでの THP の使用状況を gr​​ep して確認する価値があります。この使用量は、アプリケーションの実行中に増加するはずです:

# grep AnonHugePages /proc/meminfo
AnonHugePages:   2648064 kB
于 2014-08-26T07:27:21.643 に答える