取締役のお知らせ
私はこの質問(少し修正済み)をStackOverflowの質問(クロスポストへの強力な反対のために削除しました)から移動しましたが、まだ回答が提供されておらず、ここでより適切かもしれません。
StackOverflowの質問には2つのコメント(答えはありません)があります。以下は、これらのコメントの簡単な要約です(これを理解するために実際の質問を読む必要があるかもしれません)。
- ファイルシステムアプローチを
libhugetlbfs
使用すると、さまざまなタスクを実行できます。- それは私にあまり説得力がありません。私がアプリケーションプログラマーとしてファイルシステムを介さずに巨大なページを割り当てることができれば大丈夫です。そうですか
libhugetlbfs
?
- それは私にあまり説得力がありません。私がアプリケーションプログラマーとしてファイルシステムを介さずに巨大なページを割り当てることができれば大丈夫です。そうですか
- ファイルシステムを使用すると、誰が大容量ページを割り当てることができるかを許可できます。
- もちろん可能ですが、ファイルシステムを通過する必要はありません。誰でもそうすることができれば
mmap(…, MAP_HUGETLB, …)
、ファイルシステムレベルでアクセスが拒否された人なら誰でもこの方法で巨大なページを使い果たすことができますmmap
。
- もちろん可能ですが、ファイルシステムを通過する必要はありません。誰でもそうすることができれば
実際の問題
私は現在、Linuxで巨大なページにメモリを割り当てるさまざまな方法を探しています。なぜかHugeTLB「ファイルシステム」の概念を理解できません。私は透明な巨大なページについて話すことではありません。これは全く違う獣です。
伝統的な方法
伝統的な見解(例:Debian Wikiまたはカーネル文書) 以下のようです。
- カーネル構成が正しく設定されていることを確認してください。
- さまざまなカーネルパラメータを正しく設定する
- たとえば、特別なファイルシステム(
hugetlbfs
)を任意のディレクトリにマウントする場合/dev/hugepages/
(Fedoraではデフォルトのようです...) mmap()
そのディレクトリにあるファイルをアドレス空間にコピーします。つまり、次のようになります。
int fd = open("/dev/hugepages/myfile, O_CREAT | O_RDWR, 0755);
void * addr = mmap(0, 10*1024*1024, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0);
addr
...これら2つの呼び出しが成功したら、5つの2 MBの大容量ページに割り当てられている10 MBのメモリを指す必要があります。いいね
簡単な方法
しかし、あまりにも複雑に見えますか?
少なくともLinux 5.15では、ファイルシステム全体が完全に不要に見えます。私はこれを試しました。
- HugeTLBfsで構成されたカーネル
- カーネルパラメータが正しく設定されました(例
vm.nr_hugepages > 0
:)。 hugetlbfs
どこにも設置されていない
その後、匿名の思い出を作りますmmap
。
void *addr = mmap(0, 10*1024*1024, (PROT_READ | PROT_WRITE),
(MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB), 0, 0);
これにより、巨大なページに10 MBのメモリが割り当てられます(少なくともページテーブルのフラグを解釈しても失敗しない場合)。
なぜファイルシステムなのか
だから私の質問は:なぜファイルシステムですか?さまざまなガイドで提案されているように、ファイルシステムを通過することは本当に「必要」ですか?上記の試みは幸運だっただけです。ファイルシステムアプローチには他の利点があります(巨大な銃のように見えるRAMの一部を表すファイルを持つことに加えて...)?それともMAP_ANONYMOUS | MAP_HUGETLB
以前に許されなかった時代の残骸でしょうか?