cgroups:cgroupからプロセスを分離する方法

cgroups:cgroupからプロセスを分離する方法

mygroupシステムにcgroupを作成し、その下でプロセスを実行しました。

cgexec -g memory,cpu:groupname/mygroup someprocess

しばらくすると、CPUとメモリについて心配する必要がないと感じたときに、私のアプリのcgroupからプロセスをどのように分離できますか?

ベストアンサー1

一度グループサブシステムをインストールして使用でき、プロセスは常にサブシステムの一部です。グループそのサブシステムの階層には、最初はルートがあります。グループ、他の場所に移動しない限りグループ、その子孫もそこに表示されます。プロセスを「分離」とは、通常、プロセスをルートに移動(戻る)することを意味します。グループ特定のサブシステムの

/sys/fs/cgroupサブシステムが十分にインストールされていると仮定すると、通常、以下のように、疑似ディレクトリを作成/削除したり、そのディレクトリにある疑似ファイルに十分な値を読み書きすることですべてを使用できます。man cgroups.7それ以外の場合は、提供された専用コマンドcgexecは次のようになります。cgclassify

以下は例です(使用cgroupv1)bashシェルの指示:

# ls /sys/fs/cgroup/{memory,cpu}/groupname/mygroup
ls: cannot access '/sys/fs/cgroup/memory/groupname/mygroup': No such file or directory
ls: cannot access '/sys/fs/cgroup/cpu/groupname/mygroup': No such file or directory

# cgcreate -g memory,cpu:groupname/mygroup

# ls -d /sys/fs/cgroup/{memory,cpu}/groupname/mygroup
/sys/fs/cgroup/cpu/groupname/mygroup  /sys/fs/cgroup/memory/groupname/mygroup

もちろん、上記のcgroupを作成した後にいくつかの特別な設定を適用することも可能です。

# cgexec -g memory,cpu:groupname/mygroup sh -c 'echo $$; exec sleep 999'
14682

その他の端末:

# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/groupname/mygroup/cgroup.procs 
/sys/fs/cgroup/memory/groupname/mygroup/cgroup.procs:14682
/sys/fs/cgroup/cpu/groupname/mygroup/cgroup.procs:14682
# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/cgroup.procs
#

# cgclassify -g memory,cpu:/ 14682

# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/groupname/mygroup/cgroup.procs
# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/cgroup.procs
/sys/fs/cgroup/memory/cgroup.procs:14682
/sys/fs/cgroup/cpu/cgroup.procs:14682

上記の3つの特殊コマンドは、次の単純なシェルコマンドで置き換えることができます。

# mkdir -p /sys/fs/cgroup/{memory,cpu}/groupname/mygroup
# bash -c 'echo $$ | tee /sys/fs/cgroup/{memory,cpu}/groupname/mygroup/cgroup.procs; exec sleep 999'
15533

そして(「分離」):

# echo 15533 | tee /sys/fs/cgroup/{memory,cpu}/cgroup.procs
15533

実際には専用コマンドに注意してくださいcgclassify。少なくともcgroup.../tasksv1は、プロセス自体(使用)ではなくプロセススレッド(使用)で動作します.../cgroup.procs。単純なプロセスでは、pid(プロセスID)は唯一のスレッドであるため、ワークグループID(tgid = pid)は両方の擬似ファイルで同じであり、違いはありません。マルチスレッドプロセスの場合、プロセス全体を移動するには、.../tasks使用中または単に使用中にすべてのスレッドを認識する必要があります.../cgroup.procs。男性の場合:

PID が記録されると、cgroup.procsプロセス内のすべてのスレッドが直ちに新しい cgroup に移動されます。

taskscgroups v1では、スレッドID(つまり、clone(2)とgettid(2)から返されたカーネルスレッドID)をcgroupディレクトリのファイルに書き込むことで、個々のスレッドを別のcgroupに移動できました。このファイルを読み取って、cgroupのメンバーであるスレッドセットを検索できます。

だから.../cgroup.procs後で見せて使用することにしました。これは、Firefox、Javaアプリケーションなど、このような状況に対するすべての作業を提供するpgrep --lightweightために使用できるマルチスレッドプロセスを移動するcgclassifyときに重要です(ただし、競争に注意してください)。

おすすめ記事