web-dev-qa-db-ja.com

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

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

18
Reza

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

17
terdon

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

cgroups

Linuxにはcgroupsがあり、これは、プロセスで使用可能なリソースを制限する目的で頻繁に使用されます。非常に短い研究から、Matlab(科学的ソフトウェア)構成が/etc/cgconfig.confに設定された Arch Wikiの例 を見つけることができます。

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

タスクセット

関連質問 Ask Ubuntuで Linuxでプロセスを1つのCPUコアに制限する方法?[重複] Unix&Linuxサイトで、tasksetを使用してCPUを制限する例を示しますプロセス。最初の質問では、特定のユーザーのすべてのプロセスを解析することで達成されます

$ ps aux | awk '/^housezet/{print $2}' | xargs -l taskset -p 0x00000001

他の質問では、taskset自体を介してプロセスが開始されます。

$ taskset -c 0 mycommand --option  # start a command with the given affinity

結論

プロセスを制限することは確かに可能ですが、特定のユーザーに対してそれを達成することはそれほど簡単ではないようです。リンクされたAsk Ubuntu投稿の例では、各ユーザーに属し、新しいユーザーごとにtasksetを使用するプロセスを一貫してスキャンする必要があります。はるかに合理的なアプローチは、cgexecまたはtasksetを介して、CPU集中型アプリケーションを選択的に実行することです。また、すべてのプロセスを特定の数のCPUに制限しても意味がありません。特に、実際に並列処理と同時実行性を利用してタスクをより速く実行するプロセスでは、プロセスを特定の数のCPUに制限すると、処理速度が低下する可能性があります。さらに、 terdon's answer が言及したように、それはリソースの浪費です

tasksetまたはcgexec経由で選択したアプリケーションを実行するには、ユーザーと通信して、実行できるアプリケーションをユーザーに通知するか、taskselまたはcgexec経由で選択したアプリケーションを起動するラッパースクリプトを作成する必要があります。

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

こちらもご覧ください

13