CPUのコア数が32のコンピューターがあり、数人のユーザーがプログラムを実行するために使用されます。1人のユーザーがすべてのCPUパワーを独占しないように、各ユーザーがいつでも使用できるコアの数を制限する方法はありますか?
CPUのコア数が32のコンピューターがあり、数人のユーザーがプログラムを実行するために使用されます。1人のユーザーがすべてのCPUパワーを独占しないように、各ユーザーがいつでも使用できるコアの数を制限する方法はありますか?
回答:
これは可能ですが、複雑であり、ほぼ間違いなく悪い考えです。現時点で1人のユーザーのみがマシンを使用している場合、それらをNコアに制限するとリソースが無駄になります。はるかに良いアプローチは、すべてを実行することnice
です:
NAME
nice - run a program with modified scheduling priority
SYNOPSIS
nice [OPTION] [COMMAND [ARG]...]
DESCRIPTION
Run COMMAND with an adjusted niceness, which affects process scheduling. With
no COMMAND, print the current niceness. Niceness values range from -20 (most
favorable to the process) to 19 (least favorable to the process).
これは、プロセスの優先順位を設定する優れたツールです。したがって、1人のユーザーだけが何かを実行している場合、必要なだけのCPU時間を取得できますが、他の誰かが自分の(また素敵な)ジョブを立ち上げると、彼らは素晴らしく、お互いに共有します。そうすれば、ユーザーがすべてのコマンドをnice 10 command
で起動した場合、誰もリソースを独占しません(そしてサーバーをひざまずかせる人はいません)。
nice値が高いと、優先順位が低くなることに注意してください。これは、私たちがどれだけすてきであるかを示す尺度であり、私たちがすばらしくなればなるほど、私たちはより多くを共有します。
また、これはメモリ割り当ての管理には役立ちませんが、CPUスケジューリングにのみ影響することに注意してください。したがって、複数のユーザーが複数のメモリ集約型プロセスを起動した場合でも、問題が発生します。それが問題になる場合は、トルクなどの適切なキューイングシステムを検討する必要があります。
nice
、あなたが説明していることから、それはまさにあなたが必要とするものです。
TL; DR:簡単な調査から、コマンドを特定のコア数に制限することが可能であるように見えますが、すべての場合、実際に制限を強制するコマンドを使用する必要があります。
Linuxにはcgroups
、プロセスで利用可能なリソースを制限する目的で頻繁に使用されるものがあります。非常に短い調査から、Matlab(科学ソフトウェア)の設定が設定されたArch Wikiの例を見つけることができます/etc/cgconfig.conf
:
group matlab {
perm {
admin {
uid = username;
}
task {
uid = username;
}
}
cpuset {
cpuset.mems="0";
cpuset.cpus="0-5";
}
memory {
memory.limit_in_bytes = 5000000000;
}
}
このような構成を有効にするには、cgexec
コマンドを使用して、たとえば同じWikiページからプロセスを実行する必要があります。
$ cgexec -g memory,cpuset:matlab /opt/MATLAB/2012b/bin/matlab -desktop
「Ubuntuに尋ねる」および「Linuxでプロセスを1つのCPUコアに制限する方法」に関する関連質問 Unix&Linuxサイトの[duplicate]taskset
は、プロセスのCPUを制限するための使用例を示しています。最初の質問では、特定のユーザーのすべてのプロセスを解析することで達成されました
$ ps aux | awk '/^housezet/{print $2}' | xargs -l taskset -p 0x00000001
もう1つの質問では、プロセスはtaskset
それ自体を介して開始されます。
$ taskset -c 0 mycommand --option # start a command with the given affinity
プロセスを制限することは確かに可能ですが、特定のユーザーに対してそれを達成することはそれほど簡単ではないようです。リンクされたAsk Ubuntu投稿の例では、各ユーザーに属し、taskset
新しいユーザーごとに使用するプロセスの一貫したスキャンが必要になります。はるかに合理的なアプローチは、いずれかを介して、選択的に実行するCPU負荷の高いアプリケーションになりますcgexec
かtaskset
。また、すべてのプロセスを特定のCPU数に制限することは意味がありません。特に、実際に並列処理と同時実行を使用してタスクを高速に実行するプロセスでは、特定のCPU数に制限すると、処理が遅くなる可能性があります。さらに、terdonの答えが述べたように、それはリソースの無駄です
経由して選択したアプリケーションを実行するtaskset
か、cgexec
彼らが実行することができますどのようなアプリケーションを知らせるためにユーザーとの通信、または経由して選択したアプリケーションを起動するラッパースクリプトの作成が必要ですtasksel
かをcgexec
。
さらに、CPUの数に制限を設定する代わりに、ユーザーまたはグループが生成できるプロセスの数を設定することを検討してください。これは/etc/security/limits.conf
fileで実現できます。
sched_setaffinity(2)
アフィニティマスクを越えて保存されていると言いexecve(2)
、そして子供が上でそれを継承していますfork(2)
。そのため、ユーザー用のシェル(またはXセッション用のグラフィカルシェル)をタスクセットする場合、そのシェルから起動するすべてのものは、デフォルトで同じアフィニティマスクを使用します。