コンテクスト:
複数のプロセスで構成されるソフトウェアシステムをプログラミングしています。LinuxではC++でプログラムされています。Linux共有メモリを使用してそれらの間で通信します。
通常、ソフトウェア開発では、パフォーマンスの最適化が行われる最終段階にあります。ここで私は大きな問題に直面しました。このソフトウェアには高いパフォーマンス要件がありますが、4つまたは8つのCPUコア(通常は複数のCPU)を搭載したマシンでは、3つのコアしか使用できなかったため、最初のコアでCPUパワーの25%を浪費し、 2番目のものでは60%。多くの調査を行い、ミューテックスとロックの競合を破棄した結果、shmdt / shmat呼び出し(共有メモリセグメントのデタッチとアタッチ)に時間が浪費されていることがわかりました。さらに調査した結果、これらのCPU(通常はAMDPopteronとIntelXeon)がNUMAと呼ばれるメモリシステムを使用していることがわかりました。これは基本的に、各プロセッサに高速の「ローカルメモリ」があり、他のCPUからメモリにアクセスすることを意味します。高価な。
いくつかのテストを行った後、問題は、基本的に、すべてのプロセスが共有メモリセグメントを他のプロセスとその中のスレッドに渡すことができるようにソフトウェアが設計されていることであるようです。プロセスは常に他のプロセスからメモリにアクセスしているため、これはパフォーマンスを低下させるようです。
質問:
さて、問題は、プロセスのペアを同じCPUで強制的に実行する方法はありますか?どちらのプロセッサで実行されるかは気にしないので、常に同じプロセッサで実行するように強制するつもりはありませんが、それでうまくいきます。理想的には、カーネルに伝える方法があります。このプロセスを1つのプロセッサでスケジュールする場合は、この「兄弟」プロセス(共有メモリを介して通信するプロセス)も同じプロセッサでスケジュールする必要があります。パフォーマンスにペナルティはありません。