1

私は cgroup の新人で、Linux サーバーで 2 つの C++ プロセスを制御するために使用しようとしています。

各プロセスの mem_limit を 1G に設定しました。これは、最大で 1GB のメモリを消費できるということですよね?

しかし、cgroup は VM のような実際の分離を保証しないと思います。たとえば、あるプロセスは別のプロセスのメモリを読み書きできます。また、cgroup は何も割り当てないため、空きメモリ ブロックを取得するために 2 つのプロセス間で競合が発生します。

  • 私は正しいですか?
  • cpu_set のケースはどうですか?
  • 分離を考慮した cgroup と VM の違いは何ですか?

私はそれをグーグルで検索しましたが、多くの「docker vs vm」しか得られませんでした。これは本当に私が望んでいるものではありません。

cgroups の実装からのヒントは本当に役に立ちます。

4

1 に答える 1

3

まず第一に、あなたはcgroupsとは何かを誤解しています。これは分離ツールではなく、mem_limit のようにメモリ、CPU、I/O 消費を制限できるリソース制限ツールです。

ただし、各プロセスには独自の一意のアドレス空間があるため、プロセス 1が CPU 上で実行されている場合、プロセス 2のページ テーブルは使用されないため、プロセス 1はポインターを逆参照するだけではプロセス 2の変数を取得できません。仮想メモリはすでに分離技術です。

Linux で他のプロセス メモリにアクセスするには、いくつかの方法があります (通常はデバッガで使用されます)。

  • /proc/PID/mem. そのファイルのアクセス許可を確認すると、同じユーザーまたはルートのみがアクセスできることがわかります。
  • process_vm_{readv,writev}システムコール。ユーザーがCAP_SYS_PTRACE機能を持っているかどうかを確認します。

したがって、他のプロセスが他のメモリにアクセスすることを禁止するオプションがいくつかあります。

  1. CAP_SYS_PTRACE を持たない別のユーザーからプロセスを実行します。Androidはそれを行います。
  2. カーネル名前空間を使用します - プロセスは他に存在するかどうかを認識しません - 保護はpidレベルで実行されます。LXC はこれを使用し、おそらく Docker も使用します。
  3. ベアメタル仮想化: Xen、KVM など。プロセス ページ テーブルが分離されるだけでなく、カーネルも分離されます。

IMHO (1) で十分で、(3) はパラノイア用です ;)

于 2015-02-28T10:01:16.570 に答える