各ユーザーが使用できるCPUコアの数をどのように制限できますか?


17

CPUのコア数が32のコンピューターがあり、数人のユーザーがプログラムを実行するために使用されます。1人のユーザーがすべてのCPUパワーを独占しないように、各ユーザーがいつでも使用できるコアの数を制限する方法はありますか?


5
答えではなく、アイデアだけです。複数の仮想マシンのセットアップを検討することをお勧めします。それぞれのCPUの数は限られています。各ユーザーは仮想マシンの1つにしかアクセスできず、そのVMのユーザーはCPU使用率が制限されます。一部の仮想化ソフトウェアには、これをサポートするツールが含まれている可能性があります。
シェルキスト

1
@ghellquistあなたはそれを答えにする必要があります
-slebetman

@ghellquist:別のユーザーにCPUの一部のみを表示させたい場合は、おそらくLinuxコンテナーのような、できるだけ軽量なものが必要でしょう。(例えば、コアと同じ数のスレッドを開始するOpenMPまたは他のプログラムを開始すると、各ユーザーに実際に使用させるコアの量に応じた適切な数を開始します)。KVMなどの完全仮想化には、VT-XやAMD-Vなどのハードウェアサポートがある場合でも、VMの出口が回避されている場合でも、TLBミスが多くのメモリにアクセスするコードで、余分なレベルのページテーブルからパフォーマンスコストがかかります。
ピーター

申し訳ありませんが、これも必要ですか?マルチユーザーシステムとして、Linuxはデフォルトでプリエンプティブマルチタスクを既に実装しているので、1人の(悪意のない)ユーザーがシステム全体を独り占めするような状況は起こらないはずです。
キュービック

回答:


16

これは可能ですが、複雑であり、ほぼ間違いなく悪い考えです。現時点で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スケジューリングにのみ影響することに注意してください。したがって、複数のユーザーが複数のメモリ集約型プロセスを起動した場合でも、問題が発生します。それが問題になる場合は、トルクなどの適切なキューイングシステムを検討する必要があります。


ご回答有難うございます。SLURMなどの「ワークロードマネージャー」がいくつかありますが、それらは複数のノードを持つコンピューター用です。需要がそれほど多くないので、人々がシングルノードコンピュータ用の同様のアプリを開発していないことは理にかなっていると思います。
レザ

@Reza try nice、あなたが説明していることから、それはまさにあなたが必要とするものです。
テルドン

3
@Reza:OSがすでにそれを行っているからです。必要に応じて、使用可能なCPUを自動的にスレッド/プロセスにタイムシェアリングします。
BlueRaja-ダニーPflughoeft

13

TL; DR:簡単な調査から、コマンドを特定のコア数に制限することが可能であるように見えますが、すべての場合、実際に制限を強制するコマンドを使用する必要があります。

cgroups

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負荷の高いアプリケーションになりますcgexectaskset。また、すべてのプロセスを特定のCPU数に制限することは意味がありません。特に、実際に並列処理と同時実行を使用してタスクを高速に実行するプロセスでは、特定のCPU数に制限すると、処理が遅くなる可能性があります。さらに、terdonの答えが述べたように、それはリソースの無駄です

経由して選択したアプリケーションを実行するtasksetか、cgexec彼らが実行することができますどのようなアプリケーションを知らせるためにユーザーとの通信、または経由して選択したアプリケーションを起動するラッパースクリプトの作成が必要ですtaskselかをcgexec

さらに、CPUの数に制限を設定する代わりに、ユーザーまたはグループが生成できるプロセスの数を設定することを検討してください。これは/etc/security/limits.conffileで実現できます

こちらもご覧ください


1
まあ、cgexecでプロセスを実行しているユーザーに依存する代わりに、ユーザー/グループに基づいてプロセスを適切なcgroupに自動的に移動するcgrulesengdcgrules.confがあります。しかし、ubuntuでこれを設定するのはやや簡単ではないようです。
ハンス・ヤコブ

@ Hans-Jakob多少複雑に見えますが、GRUBにカーネルフラグを追加する必要があります。多くのユーザーがいて、システムをクラッシュさせたくないエンタープライズレベルのマシンの場合は、おそらく価値がありますが、デスクトップの場合は作業が多すぎます。リンクしていただきありがとうございます。
セルギーKolodyazhnyy

2
sched_setaffinity(2)アフィニティマスクを越えて保存されていると言いexecve(2)そして子供が上でそれを継承していますfork(2)。そのため、ユーザー用のシェル(またはXセッション用のグラフィカルシェル)をタスクセットする場合、そのシェルから起動するすべてのものは、デフォルトで同じアフィニティマスクを使用します。
ピーター

1
考えられる欠点の1つは、起動するスレッドの数を決定するときにマシンに搭載されているCPUの数をチェックするプログラムです。実際にスケジュールされるコアの数に対してスレッドが多すぎます。cgroupsがそれについて何かをするかもしれないかどうかを知りましたか?
ピーター

@PeterCordes Spawning shellのアイデアはおもしろそうです。それを調べる必要があります。ありがとう!2番目のコメントについては、いや、この時点ではcgroupについて十分に研究していません。
セルギーKolodyazhnyy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.