2012-01-30 8 views
27

可能性の重複:
how to set CPU affinity of a particular pthread?私のプロセスのための専用の一つのコア

1つのプロセスを除くすべてのプロセスに対して1つのコアを無効にするLinuxでの方法はありますか? 1つのコアを予約しておきたいだけです。私の工程の後に生み出される

  1. プロセスは、このコアを参照し、他の人は使用しないでください。次のように

    期待される動作です。

  2. 私のプロセスが生成されると、このコアを利用しているすべてのプロセスを他のコアに切り替える必要があります。
+0

あなたが探している用語はスレッドアフィニティです。スケジューラが把握できるようにするよりも、全体的なパフォーマンスの点では可能ですが、しばしば悪化します。 – Flexo

+4

@awoodland:戻る。彼は他のコアを使わないというプロセスを求めなかったので、コアを使わないように他のプロセスに頼んだ。 –

+0

@Benvoight - おっと、私の間違い。それは答えをかなり "ノー"にしてくれます:) – Flexo

答えて

6

この問題をカーネルで解決する方法については、lwn articleをご覧ください。

38

はい、あります。 2つのcpusetを作成したいとします.1つは独立したCPUで、もう1つは残りのすべてのCPUで作成します。分離されたcpusetと他のすべてのプロセスに特別なプロセスを割り当て、他のcpusetに割り当てます。ここで

はそれを行います簡単なスクリプトの例です:

mkdir /cpuset 
mount -t cpuset none /cpuset/ 
cd /cpuset 

mkdir sys         # create sub-cpuset for system processes 
/bin/echo 0-2 > sys/cpuset.cpus    # assign cpus (cores) 0-2 to this set 
              # adjust if you have more/less cores 
/bin/echo 1 > sys/cpuset.cpu_exclusive 
/bin/echo 0 > sys/cpuset.mems  

mkdir rt         # create sub-cpuset for my process 
/bin/echo 3 > rt/cpuset.cpus    # assign cpu (core) 3 to this cpuset 
              # adjust this to number of cores-1 
/bin/echo 1 > rt/cpuset.cpu_exclusive 
/bin/echo 0 > rt/cpuset.mems 
/bin/echo 0 > rt/cpuset.sched_load_balance 
/bin/echo 1 > rt/cpuset.mem_hardwall 

# move all processes from the default cpuset to the sys-cpuset 
for T in `cat tasks`; do echo "Moving " $T; /bin/echo $T > sys/tasks; done 

今、あなたのプロセスを開始し、そのPIDを見つけて行く:

/bin/echo $PID > /cpuset/rt/tasks 

これらの変更を元に戻したい場合は、単にお使いのシステムを再起動するか、実行します。ここでは

# move tasks back from sys-cpuset to root cpuset 
for T in `cat /cpuset/sys/tasks`; do echo "Moving " $T; /bin/echo $T > /cpuset/tasks; done 
# remove sys-cpuset 
rmdir /cpuset/sys 
# move tasks back from rt-cpuset to root cpuset 
for T in `cat /cpuset/rt/tasks`; do echo "Moving " $T; /bin/echo $T > /cpuset/tasks; done 
# remove rt-cpuset 
rmdir /cpuset/rt 
# unmount and remove /cpuset 
umount /cpuset 
rmdir /cpuset 

はmanページです:http://www.kernel.org/doc/man-pages/online/pages/man7/cpuset.7.html

csetなど、これを自動化するのに役立つより複雑なシェルラッパーもあります。参照:http://web.archive.org/web/20120428093126/http://www.suse.com/documentation/slerte_11/slerte_tutorial/data/slerte_tutorial.html

+1

このような詳細な説明をいただきありがとうございます:)私はあなたの解決策を試してみます。 –

+0

これらの変更を取り消したい場合は、どうすればよいですか? –

+1

SUSEチュートリアルへのリンクはありません。[here](http://web.archive.org/web/20120428093126/http://www.suse.com/documentation/slerte_11/slerte_tutorial/data/slerte_tutorial.html)アーカイブされたバージョンです。 'cset shield'は私のニーズに完全に合っています。 – sjakobi

関連する問題