ソフトウェアが必要とする共有ライブラリは、マシンのグローバル メモリに 1 回だけロードされます。
私が知っているように、これは Linux の現在の動作です。共有ライブラリは、1 セットの物理メモリにのみロードされ、単一のノードにのみロードされます。
そして、すべてのプロセスが単一ノードのメモリにアクセスするため、システムは通信のボトルネックに直面しています。
コメントで述べたように、ライブラリからの命令はすべてのプロセッサにキャッシュする必要があるため、ライブラリからのアクティブなコードがキャッシュから消去された場合にのみボトルネックが発生する可能性があります (たとえば、さまざまなコードが多数動作している場合)。
ハードウェア パフォーマンス カウンター (キャッシュからのミス、ノード間の NUMA メモリ アクセス カウント) を使用して、理論を検証する必要があります。
Linux では「レプリケーション」と呼ばれる NUMA 上の複数のコピーを使用してデータを保存するメカニズム。また、カーネル、実行可能ファイル、またはその共有ライブラリのコードはテキストと呼ばれます。だから、あなたが望むのは「共有ライブラリのテキスト複製」です。カーネル コードの場合は、テキストの複製の方が簡単だと思います。
このようなテキストの複製を行うための 2003 年からの実験的なパッチをいくつか見つけることが
できました。このパッチは拒否されたようです。
この手法の最新 (2007 年) の変種は、ページキャッシュの複製です: http://lwn.net/Articles/223056/ ( mm: 複製されたページキャッシュ) by Nick Piggin, SUSE. 彼の方法に関するプレゼンテーションもあります: http://ondioline.org/~paul/pagecachereplication.pdf。実行可能ファイルと共有ライブラリの両方のすべてのファイルがページキャッシュに保存されるため、これは機能します。しかし、このパッチでも、現在のカーネルでは見つかりません。
SGI では、レプリケーションの必要性がより多くあります (通常のカーネル開発者よりも多くの NUMA マシンを持っています)。そのため、いくつかの追加パッチが存在する可能性があります。NUMA 用の SGI のアプリケーション チューニング マニュアルがありますdplace
。セクション「dplace コマンドの使用」。テキスト複製のオプションがあります。
-r : アプリケーションが実行されているノードでテキストを複製する必要があることを指定します。場合によっては、コードのオフノード メモリ参照を作成する必要性を減らすことで、レプリケーションによってパフォーマンスが向上します。複製オプションは、dplace コマンドによって配置されたすべてのプログラムに適用されます。テキスト複製の詳細については、dplace(5) のマニュアル ページを参照してください。レプリケーション オプションは、次の文字の 1 つ以上の文字列です。
lライブラリ テキストの複製
b バイナリ (a.out) テキストを複製する
スレッド ラウンドロビンオプション
Man dplace(1): http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=linux&db=man&fname=/usr/share/catman/man1/dplace.1.html
Man dplace(5): http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=linux&db=man&fname=/usr/share/catman/man5/dplace.5.html