序文: 私は systemd とユニット ファイルの概念を 100% 理解しているわけではありませんが、いくつかの資料を読みました。
コンテキスト: systemd と (systemd 以外では upstart とします) を実行しているディストリビューション上で、プロセスを 1 つの cgroup ツリーから別の cgroup ツリーに移動したいと考えています。具体的には、cgroup ツリーは次のようになります。
基本的に階層はmy_rootを基準として次のようになります
my_root
|
______ ___________
| |
d11 d12
(P lives here) |
___________
| |
d21 d22
Pはd21の下に移動します。
my_root
|
______ ___________
| |
d11 d12
|
___________
| |
d21 d22
(P lives here now)
完全を期すために
my_root = /sys/fs/cgroups/cpu,cpuacct/my_root
非 systemd バケットについてお話ししましょう。systemd を実行していないディストリビューションで実行している場合は、 pid of をofP1
にエコーするだけで、その cgroup にプロセスが移動されます。cgroups.procs
d21
さて、systemd
ユースケースですが、これは私が確信が持てないことですが、上記と同じことを実行すると、2 つのことが起こる可能性があります。
- プロセスはそこに移動し、そこに留まります。
- プロセスは最初はそこに移動しますが、しばらくすると、その特定のコントローラーのルート cgroup に戻るか、ルート cgroup に移動します。
私は後者を避けたいと思っています。基本的に、アプリケーションのユニット ファイルを指定するときに、アプリケーションが起動される cgroup の所有権を取得したいと考えています。たとえば、アプリケーションがmy_root
cgroup の所有権を取得し、systemd がプロセスの移動に干渉しないようにします。
さて、複数の質問に移ります。
- systemd は、プロセスを移動した cgroup から本当に移動するのでしょうか?
- はいの場合、ユニット ファイル内の cgroup の所有権を取得するには何をする必要がありますか。ユニット ファイルの具体的な例を探しています。
リソース :https://www.freedesktop.org/wiki/Software/systemd/ControlGroupInterface/