cgroupを使用してホワイトリストを除くすべてのプロセスを単一のCPUに制限する方法は?

cgroupを使用してホワイトリストを除くすべてのプロセスを単一のCPUに制限する方法は?

一つあるRed Hat cgroup ガイドこれは少し役に立ちますが、質問に答えることはありません。

プロセスを開始するコマンド中に、特定のプロセスを特定のCPUに制限する方法を次のように知っています。

まず、次の* inを入力してください/etc/cgconfig.conf

mount {
  cpuset =  /cgroup/cpuset;
  cpu =     /cgroup/cpu;
  cpuacct = /cgroup/cpuacct;
  memory =  /cgroup/memory;
  devices = /cgroup/devices;
  freezer = /cgroup/freezer;
  net_cls = /cgroup/net_cls;
  blkio =   /cgroup/blkio;
}

group cpu0only {
  cpuset {
    cpuset.cpus = 0;
    cpuset.mems = 0;
  }
}

その後、プロセスを開始し、以下を使用してそのcgroupに具体的に割り当てます。

cgexec -g cpuset:cpu0only myprocessname

以下を実行して、特定のプロセス名のすべてのインスタンスを自動的に制限できます。考えるそうです)以下を入力してください/etc/cgrules.conf

# user:process  controller  destination
*:myprocessname cpuset      cpu0only

私の質問は:私が何をすべきかです。キャンセル

つまり、展開するにはどうすればよいですか?みんな特定のホワイトリストプロセスセット以外のプロセスそして彼らの子供たち限られたcgroupで?


私が調査したがまだテストしていない内容に基づいて信じる一つ部分の解決策は次のとおりです。

「制限されていない」cgroupを追加します。

group anycpu {
  cpuset {
    cpuset.cpus = 0-31;
    cpuset.mems = 0;  # Not sure about this param but it seems to be required
  }
}

私のプロセスを無制限のグループに明示的に割り当て、他のすべてを制限されたグループに割り当てます。

# user:process  controller  destination
*:myprocessname cpuset      anycpu
*               cpuset      cpu0only

しかし、これに対する注意点は、(テストではなく文書を読むことで)子がmyprocessname制限されたcpu0onlycgroupに再割り当てされることです。

可能な選択肢は、myprocessnameすべてを実行して所有するユーザーを作成することです。ユーザーのプロセスに制限はありませんが、他のすべてに制限はありません。ただし、実際のユースケースでは、プロセスをrootとして実行し、rootとして実行する必要がある他のプロセスもあります。しなければならない限られた。

これを達成するためにcgroupをどのように使用できますか?


cgroupがこれを行うことができない場合(私は今そう疑う)、解決策の一部について私の考えは正しいですか?私が想像したように動作しますか?

*免責事項:これは最小限のコード例ではないかもしれません。みんなそれで、どの部分が不要なのかわかりません。

答え1

アップデート:以下の回答はRHEL 6に適用されます。 RHEL 7では、ほとんどのcgroupはsystemdによって管理され、libcgroupは廃止されました。


この質問を投稿した後、上記のリンクガイド全体を研究しました。cgroups.txt文書化とcpusets.txt。今私は期待していたよりもcgroupについてもっと知っているので、ここで私の質問に答えます。

取ることができるアプローチにはいくつかあります。 Red Hatの企業担当者(技術設計者)は、すべてのプロセスに対する包括的な制限ではなく、特に制限したいプロセスのみを制限するより宣言的なアプローチを提案しました。トピックに関する彼の声明によると、その理由は、システムコールがユーザー空間コード(LVMプロセスなど)に依存する可能性があるためです。このコードが制限されると、システムの速度が遅くなる可能性があり、これは意図した効果とは反対です。だから、最終的に特定の名前にいくつかのプロセスを制限し、残りはすべてそのまま残しました。

それに加えて、いくつか言及したいと思います。cgroup 基本データ質問を投稿する際に欠落していた内容がありました。


Cgroupはいいえlibcgroupインストールするかどうかによって異なります。 ただし、これはcgroup構成とcgroupプロセス割り当てを自動化するためのツールセットであり、非常に便利です。

libcgroupパッケージがその上に構築されているので、libcgroupツールも誤解を招く可能性があることがわかりました。私自身cgroup の実際のカーネルレベル実装とは少し異なる cgroup の使用に関する一連の抽象化と仮定です。 (いくつかの例がありますが、少し作業が必要です。興味がある場合はコメントを残してください。)

したがって、libcgroupツール(たとえば/etc/cgconfig.conf、、、、、、など)を使用する前に/etc/cgrules.confcgexeccgcreatecgclassify高い仮想ファイルシステム自体に精通し、/cgroup手動でcgroup、cgroup階層(複数のサブシステムが接続されている階層を含む、libcgroupはこれらの階層を秘密かつリークするように抽象化します)を作成し、 を実行して他のcgroupにプロセスを再割り当てすることをお勧めしますecho $the_pid > /cgroup/some_cgroup_hierarchy/a_cgroup_within_that_hierarchy/tasks。フードの下で行われる魔法の仕事libcgroup


私が見逃しているもう1つの基本概念は、/cgroup仮想ファイルシステムがシステムに完全にマウントされている場合(より正確には「コントローラ」と呼ばれるcgroupサブシステムが完全にマウントされている場合)です。すべてシステム全体のプロセスにありますcグループ。 「一部のプロセスはcgroupにあり、一部はそうではありません」などはありません。

というものがあります。cgroup 特定の階層には次のものがあります。みんな追加サブシステムのシステムリソース。たとえば、cpuset サブシステムと blkio サブシステムが接続されている cgroup 階層には、以下を所有するルート cgroup があります。みんなシステムのCPUとシステム上のすべてのblkioと、これらのリソースのいくつかは、次のものと共有できます。子供cgroups。ルートcgroupは制限できません。みんなシステムリソースを制限することは意味がありません。


欠落しているlibcgroupの他の単純なデータ:

を使用している場合は、システム起動時にディスプレイを起動するように/etc/cgconfig.conf設定する必要があります。chkconfig --list cgconfigcgconfig

変更された場合、変更をロードするには/etc/cgconfig.conf実行する必要があります。service cgconfig restart(サービスの停止または実行に関する問題はテストするときに非常に一般的ですcgclear。デバッグのために、たとえばlsof /cgroup/cpusetifcpusetは使用しているcgroup階層の名前を使用することをお勧めします。)

を使用するには、「cgroupルールエンジンデーモン」()が実行されていることを/etc/cgrules.conf確認する必要があります。 (そしてこのサービスに関しては可能性がありますが、可能性は希薄な競争条件を知っている必要があります。cgrulesengdservice cgred startchkconfig cgred onRed Hat リソース管理ガイドページ下部のセクション2.8.1から。 )

仮想ファイルシステム(最初に使用する場合は推奨)を使用してcgroupを手動で設定したい場合は、それを実行してからさまざまなオプションを使用して設定をcgconfig.conf反映するファイルを作成できます。cgsnapshot


最後に、以下を作成する際に重要な情報を省略しました。

しかし、これに対する注意点は... myprocessnameのサブプロセスが制限されたcpu0only cgroupに再割り当てされることです。

私は正しいが、私は知らなかった代替案があった。

cgexecプロセスを開始/コマンドを実行し、それをcgroupに割り当てるコマンド。

cgclassifyすでに実行されているプロセスをcgroupに割り当てるコマンド。

どちらも、指定されたプロセスがに基づいて他のcgroupに再割り当てされるのをcgred防ぎます。cgrulesengd/etc/cgrules.conf

cgexeccgclassifyこの--stickyフラグは、またcgred再割り当て防止子供プロセスはに基づいています/etc/cgrules.conf


だから、私が書いた質問に対する答え(上記のRed Hat Technical Architectのアドバイスに従って最終的に実装した設定ではありませんが)

私の質問で説明されているようにMakeとcgroupを作成してくださいcpu0only。 (起動時に実行するように設定されていることをanycpu確認してください。)cgconfig

* cpuset cpu0only私の質問で説明されているようにルールを作成してください。 (そしてcgred起動時に実行するように設定されていることを確認してください。)

私が望むプロセスを始めましょう無制限そして: cgexec -g cpuset:anycpu --sticky myprocessname

これらのプロセスに制限はなく、すべてのサブプロセスも同様です。 システムの他のすべてCPU 0に制限されます(cgredEUIDを変更しない限り、cgruleはすでに実行されているプロセスには適用されないため、再起動するだけです)。これは完全に望ましくありませんが、これが私の最初の要求でしたできるcgroupを介して実行されます。

関連情報