透明なhugepageを持つバッファに割り当てられたメモリは使用できません(プロセス終了)。

透明なhugepageを持つバッファに割り当てられたメモリは使用できません(プロセス終了)。

私は1TBのRAMを持っており、そのうち900GBをプロセス内で割り当てて使用する必要があります(私はハードウェアに対するフルアクセス権を持ち、ベアメタルで作業しています)。 (個人、匿名)を使用して900 GBのメモリを割り当て、mmap()それを使用してmadvise()Fedora 37で透明なhugepageを設定しました。これにより、この900 GBはデータで直線的に入力されます。

これは実際のプログラムではありませんが、メモリアクセスの種類に関するアイデアを提供します。

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <sys/mman.h>

int main() {
    const uint64_t n = 900000000000ULL;
    char *p = (char *)mmap(NULL, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    madvise(p, n, MADV_HUGEPAGE);
    for(uint64_t i = 0; i < n; i++) p[i] = i; // Which data is immaterial
}

より多くのメモリにアクセスするほど、システムは透明な巨大ページを割り当てるのを見ることができます。ただし、現在使用されているバフ/キャッシュメモリ(300 GBなど)を割り当てるとすぐに、プロセスはシェルも終了せずに強制終了され、信号は報告されません。/var/log/messagesまたはメッセージがありませんdmesg(例:OOMキラーは問題がないようです)。

乱用の問題ではありません。それはそれに関連していますvm.overcommit_memory = 1。私もvm.vfs_cache_pressure = 1000Linuxがバッファ/キャッシュページを空にしようとしました。結果がない

さらに、mmap()コールを標準に変更すると、malloc()すべてがスムーズに動作します。プロセスがますます多くのメモリを使用するにつれて、バッファ/キャッシュメモリは徐々に解放されます。これは特に透明なhugepages(カーネルバグ?)関連の問題です。

現在プログラムを開始する前にこれを行っていますが、echo 3 > /proc/sys/vm/drop_cachesこの方法では透明なhugepagesでほぼすべてのメモリを割り当てて使用できますが、これは正しい方法ではありません。

どんな提案がありますか?

関連情報