2015年11月22日日曜日

CPU資源を特定のプロセスに使わせない方法

HandBrakeって、昔はできたような気がするんですが、CPU資源を制限するオプションが消えてますね。記憶違いかなあ、ず~っと以前に使ってみてすぐだめだと思って採用を断念したときにはあった気がするんですが。

まあ、わざわざCPU資源を制限する場合というのもあまりないのですが、プロセスの優先度だけだと、結局全部の資源を持っていかれるので、高TDPを誇るCPUさんが搭載されているシステムで急がないけどほっとくと長時間高負荷になることが事前にわかっているプロセスさんにちょっと遠慮をしていただきたい時や、マルチスレッドだとかえって性能が落ちてしまうプロセスさんに指定するときに有効です。

で、コマンドラインでお手軽に特定のプロセスのCPU資源を制限する方法って意外に知られていないので、とりあえずご紹介します。

*Windowsの場合
Vista以後はアカウントごと制限をしてしまう方法と、プロセスごとに制限する方法があります。
前者の機能は当時Windows2000からのNT5.0系(XP含む)からVistaになってNT6.0に確かに進化した、と思った機能の一つです(Windows10はいきなりNT10.0になりましたが、機能より政治的理由がvernoのインフレを招いているように見えますが・・・ま、命名者の勝手ですからね)。確かにちゃんとOSに近づいたぞ、的な。

アカウントさえこしらえてしまえば、レジストリにちょこっと制限帯域を登録するだけなので、お手軽です。
しかし、アカウントごとまとめて制限してしまう方法は本当にすっっっっばラシイのですが、アカウントを作成したりする手間があるので、今回は臨時に指定する方法をご紹介します(意外に知られていないらしいのですよね。処理を早くするほうはみんな関心がありますがわざと遅らせるという方面の情報があんまり知られていないようです)。

起動後で制限するならタスクマネージャで可能です。詳細画面で対象のプロセス名を右クリックメニューから「関係の設定(F)」を選択するだけです。

コマンドラインから起動時に制限してしまう場合はstartコマンドを使います。
start /affinity オプションで指定しますと、使用するCPU(但し、HTT、ハイパースレッディングが有効なCPUは実コア数ではなくて仮想コア数で指定します)を制限できます。
バッチファイルなどで活躍してくれますのでこっちのほうの需要が多いでしょう。

ただ、ちと指定方法が特殊です。数を指定するのではなく、使いたいCPU(またはHTTによる仮想コア)をビットフィールドで指定します。

例えば、CoreI7機であれば実コア4,HTTのため8コアに見えてしまいます。
ここで、コア番号01234567があったとして、使いたいコアを1、使いたくないコアを0として2進数を16進数に変換した値を指定する必要があります。

例1: コア番号0と7だけ使わせたい
 -> 2進数で 1000 0001 なので 16進数に直すと81
     start /affinity 81 notepad.exe
例2: コア番号0から5まで使って2ツ開けておきたい
 -> 2進数で 0011 1111 なので3F 
     start /affinity 3f notepad.exe

といった具合です。

*linuxの場合
確かカーネル2.6からでしたか、こちらも実装されています。
taskset というコマンド名で、windowsと同じようにマスクを16進数で指定します。
tasksetはタスクマネージャとstartコマンドの機能を同時に実現できます。
つまり、pid指定で後追いでCPU資源を制限することも、起動前に制限しておくこともできます。
まあ、windowsとちがってmanページもありますから、コマンド名さえわかればもうどうにでもなるでしょう。

以上、HandBrakeがらみで思い出したので、記録しておくことといたしました。

0 件のコメント:

コメントを投稿