2011-01-12 18 views
3

文脈:2つのプロセスを同じCPU上で実行するにはどうすればいいですか?

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

通常、ソフトウェア開発では、パフォーマンスの最適化が行われる最終段階にあります。ここで私は大きな問題に遭遇しました。このソフトウェアは高い性能要件を備えていますが、4または8個のCPUコア(通常は1個以上のCPU)を搭載したマシンでは、3つのコアしか使用できないため、最初のCPUコアの25%を消費します。 2番目のものでは60%。 mutexとロックの競合を捨てて、多くの研究をした結果、shmdt/shmatコール(共有メモリセグメントのデタッチとアタッチ)で時間が無駄になっていることが分かりました。さらに研究を重ねた結果、通常はAMD OpteronとIntel XeonであるこれらのCPUがNUMAというメモリシステムを使用していることがわかりました。これは基本的に各プロセッサに高速の「ローカルメモリ」があり、高価な。

いくつかのテストを行った後、問題は、基本的にどのプロセスも共有メモリセグメントを他のプロセスやスレッド内のどのスレッドにも渡せるように設計されていることが原因と考えられます。これは、プロセスが他のプロセスからのメモリに常にアクセスしているため、パフォーマンスを低下させるようです。

質問:今

、質問があり、同じCPUで実行するプロセスのペアを強制的にどのような方法があります?。私は、同じプロセッサで常に実行するように強制するわけではありません。実行するのはどちらかというと気にしません。理想的には、カーネルに通知する方法があります。このプロセスを1つのプロセッサでスケジュールする場合は、同じプロセッサ内でこの "兄弟"プロセス(共有メモリを介して通信するプロセス)もスケジューリングする必要があります。パフォーマンスには不利益はありません。

答えて

2

Cでは、おそらくsched_setaffinity()システムコールがあります。

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

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ライブラリにもいくつかの機能があります。

1

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

libnuma

関連する問題