私は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 = 1000
Linuxがバッファ/キャッシュページを空にしようとしました。結果がない
さらに、mmap()
コールを標準に変更すると、malloc()
すべてがスムーズに動作します。プロセスがますます多くのメモリを使用するにつれて、バッファ/キャッシュメモリは徐々に解放されます。これは特に透明なhugepages(カーネルバグ?)関連の問題です。
現在プログラムを開始する前にこれを行っていますが、echo 3 > /proc/sys/vm/drop_caches
この方法では透明なhugepagesでほぼすべてのメモリを割り当てて使用できますが、これは正しい方法ではありません。
どんな提案がありますか?