4

コンテクスト:

複数のプロセスで構成されるソフトウェアシステムをプログラミングしています。LinuxではC++でプログラムされています。Linux共有メモリを使用してそれらの間で通信します。

通常、ソフトウェア開発では、パフォーマンスの最適化が行われる最終段階にあります。ここで私は大きな問題に直面しました。このソフトウェアには高いパフォーマンス要件がありますが、4つまたは8つのCPUコア(通常は複数のCPU)を搭載したマシンでは、3つのコアしか使用できなかったため、最初のコアでCPUパワーの25%を浪費し、 2番目のものでは60%。多くの調査を行い、ミューテックスとロックの競合を破棄した結果、shmdt / shmat呼び出し(共有メモリセグメントのデタッチとアタッチ)に時間が浪費されていることがわかりました。さらに調査した結果、これらのCPU(通常はAMDPopteronとIntelXeon)がNUMAと呼ばれるメモリシステムを使用していることがわかりました。これは基本的に、各プロセッサに高速の「ローカルメモリ」があり、他のCPUからメモリにアクセスすることを意味します。高価な。

いくつかのテストを行った後、問題は、基本的に、すべてのプロセスが共有メモリセグメントを他のプロセスとその中のスレッドに渡すことができるようにソフトウェアが設計されていることであるようです。プロセスは常に他のプロセスからメモリにアクセスしているため、これはパフォーマンスを低下させるようです。

質問:

さて、問題は、プロセスのペアを同じCPUで強制的に実行する方法はありますか?どちらのプロセッサで実行されるかは気にしないので、常に同じプロセッサで実行するように強制するつもりはありませんが、それでうまくいきます。理想的には、カーネルに伝える方法があります。このプロセスを1つのプロセッサでスケジュールする場合は、この「兄弟」プロセス(共有メモリを介して通信するプロセス)も同じプロセッサでスケジュールする必要があります。パフォーマンスにペナルティはありません。

4

3 に答える 3

4

私はあなたがこれらのマニュアルページから始めることができるかもしれないと思います:

$ apropos affinity
sched_getaffinity (2) - set and get a process's CPU affinity mask
sched_setaffinity (2) - set and get a process's CPU affinity mask
taskset (1)          - retrieve or set a process's CPU affinity
$

ソースコードとシェルのどちらから実行するかによって異なります。pthreadライブラリにもいくつかの機能があります。

于 2011-01-12T01:58:03.737 に答える
2

C で探しているのは、おそらくsched_setaffinity()システム コールです。

コードを変更したくない (または変更できない) 場合は、schedtoolコマンドライン ユーティリティもあります。

于 2011-01-12T01:56:59.160 に答える
1

NUMA対応アプリの作成は、「2つのプロセスが同じCPUで実行される」だけではありません。NUMA認識は、メモリ割り当て、IO完了、スレッドスケジューリングなど、すべてに浸透します。

見てlibnuma

于 2011-01-12T02:07:54.537 に答える