LinuxのNUMA対応キャッシュ

LinuxのNUMA対応キャッシュ

フォローアップの質問ですマルチCPUシステムのdentry/inodeキャッシュ/メモリアロケータの設定しかし、ここでは別の方法で質問を提起したいと思います。

私の問題は、デュアルソケットシステムがあり、カーネルキャッシュ(dentry / inode /バッファ)用のメモリがbank0(cpu0のメモリバンク)から割り当てられ、最終的に消費されることです。ただし、Bank1はキャッシュに使用されないため、システム全体で使用可能なメモリがたくさんあります。したがって、この状態では、メモリアロケータは、自分のプロセスが実行されている場所に関係なく(メモリアフィニティを設定した場合でも)、Bank1からメモリを取得します。別のバンクでメモリにアクセスするときのメモリ待ち時間が異なるため、これは私のプロセス(メモリアクセス制限が少なく、キャッシュヒット率が低い)がCPU1のスケジューリング実行よりもCPU0のコアで予約されることを意味します。 (各CPUごとに1つずつ2つのプロセスをスケジュールし、1つのプロセスはCPUのすべてのコアを使用する必要があります。コアの半分を無駄にしたくありません。)

どのCPUに予約されていても、自分のプロセスがローカル銀行からメモリを取得できるようにするにはどうすればよいですか?

カーネルvmパラメータを試しましたが、実際には何もしません。結局のところ、メモリの半分は無料です!カーネルのこれらのキャッシュはNUMAをまったく考慮しないようです。私はcgroupを調べましたが、私が知っている限り、実際にはこのようにカーネルを制御することはできません。私は私の問題を解決するものが見つかりませんでした:-(。

もちろん、プロセスを開始する前にすべてのキャッシュを削除することもできますが、これはやや厳しい方法です。たとえば、よりきれいな解決策は、合計キャッシュサイズ(8 GBなど)を制限することです。 cpu0がまだcpu1よりわずかに少ないメモリを持っているのは事実ですが(両方のバンクは64GBを持っています)、それでも耐えられます。

どんな提案でもいただければ幸いです...ありがとう!

答え1

「NUMAアーキテクチャのカーネルキャッシュに何が起こりましたか?」 linux-3.10からによって支配されるzone_reclaim_modeシステム制御領域にメモリが不足しているときに取る適切なアクションを選択できます。
つまり、ページアロケータがノードページを割り当てる前に簡単に再利用できるページを回収するのか、それともその逆かを判断します。 (詳しくは上記の公式文書を参照してください)

linux-4時代にはデフォルト設定に複数のパッチがあり、linux-5時代にはグローバル(ノード全体)設定がノード固有の設定になりました。ノードリサイクルモード

関連情報