4部構成のcgroups記事シリーズのこの最終回では、cgroupとsystemdの統合について説明します。シリーズのパート1、2、3も必ずチェックしてください。
systemdを使用したCgroups
デフォルトでは、systemdはsystem.slice
の下に新しいcgroupを作成します 監視するサービスごとに。 OpenShift Control Planeホストに戻り、systemd-cgls
を実行します は、system.slice
の下にある次のサービスを示しています (簡潔にするために出力は切り捨てられます):
└─system.slice
├─sssd.service
├─lvm2-lvmetad.service
├─rsyslog.service
├─systemd-udevd.service
├─systemd-logind.service
├─systemd-journald.service
├─crond.service
├─origin-node.service
├─docker.service
├─dnsmasq.service
├─tuned.service
├─sshd.service
├─NetworkManager.service
├─dbus.service
├─polkit.service
├─chronyd.service
├─auditd.service
└─[email protected]
systemdサービスファイルを編集することで、この動作を変更できます。 systemdを使用したcgroup管理に関しては、次の3つのオプションがあります。
- サービスファイル自体の編集。
- ドロップインファイルの使用。
-
systemctl set-property
の使用 コマンド。ファイルを手動で編集するのと同じですが、systemctl
必要なエントリを作成します。
これらについては、以下で詳しく説明します。
サービスファイルの編集
ユニットファイル自体を編集してみましょう。これを行うために、スクリプトを実行する非常に単純なユニットファイルを作成しました:
[Service]
Type=oneshot
ExecStart=/root/generate_load.sh
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
bashスクリプトには2行しかありません:
#!/bin/bash
/usr/bin/cat /dev/urandom > /dev/null &
systemd-cgls
の出力を調べるとき 、新しいサービスがsystem.slice
の下にネストされていることがわかります (出力は切り捨てられます):
└─system.slice
├─cat.service
├─tuned.service
├─sshd.service
├─NetworkManager.service
├─sssd.service
├─dbus.service
│ └─[email protected]
└─systemd-logind.service
systemdサービスファイルに次の行を追加するとどうなりますか?
Slice=my-beautiful-slice.slice
systemd-cgls
の出力 何か不思議なことを示しています。 cat.service
ファイルが深くネストされました:
Control group /:
├─my.slice
│ └─my-beautiful.slice
│ └─my-beautiful-slice.slice
│ └─cat.service
│ └─4010 /usr/bin/cat /dev/urandom
どうしてこれなの?答えは、systemdがネストされたcgroupを解釈する方法と関係があります。子は次の方法で宣言されます:
。 systemdは役立つように努めているため、親が存在しない場合は、systemdが親を作成します。アンダースコアを使用した場合_
ダッシュの代わりに-
結果はあなたが期待したものだったでしょう:
Control group /:
├─my_beautiful_slice.slice
│ └─cat.service
│ └─4123 /usr/bin/cat /dev/urandom
ドロップインファイルの使用
systemdのドロップインファイルの設定は非常に簡単です。 /etc/systemd/system
にあるサービスの名前に基づいて適切なディレクトリを作成することから始めます。 。 cat
内 たとえば、次のコマンドを実行します。
# mkdir -p /etc/systemd/system/cat.service.d/
これらのファイルは、好きなように整理できます。これらは番号順に基づいて動作するため、構成ファイルには10-CPUSettings.conf
のような名前を付ける必要があります。 。このディレクトリ内のすべてのファイルのファイル拡張子は.conf
である必要があります systemctl daemon-reload
を実行する必要があります これらのファイルの1つを調整するたび。
異なる構成を分割する方法を示すために、2つのドロップインファイルを作成しました。 1つ目は00-slice.conf
です 。以下に示すように、cat
の個別のスライスのデフォルトオプションを設定します サービス:
[Service]
Slice=AWESOME.slice
MemoryAccounting=yes
CPUAccounting=yes
もう1つのファイルは、CPUSharesの数を設定し、10-CPUSettings.conf
と呼ばれます。 。
[Service]
CPUShares=256
この方法が機能することを示すために、同じスライスに2番目のサービスを作成します。プロセスを区別しやすくするために、2番目のスクリプトは少し異なります。
#!/bin/bash
/usr/bin/sha256sum /dev/urandom > /dev/null &
次に、cat
のコピーを作成しました。 ファイル、スクリプトの置き換え、CPUShares値の変更:
# sed 's/load\.sh/load2\.sh/g' cat.service > sha256sum.service
# cp -r cat.service.d sha256sum.service.d
# sed -i 's/256/2048/g' sha256sum.service.d/10-CPUSettings.conf
最後に、デーモンをリロードしてサービスを開始します:
# systemctl daemon-reload
# systemctl start cat.service
# systemctl start sha256sum.service
[読者も気に入りました:ルートレスのPodmanコンテナの舞台裏ではどうなりますか? ]
top
からの出力を表示する代わりに 、今がsystemd-cgtop
を紹介する良い機会です 。通常のtop
と同じように機能します ただし、スライスごとの内訳と、各スライスのサービスごとの内訳が表示されます。これは、システムでcgroupを一般的にうまく利用しているかどうかを判断するのに非常に役立ちます。以下に示すように、systemd-cgtop
は、システム全体の一部としての特定のスライス内のすべてのサービスの集計と、スライス内の各サービスのリソース使用率の両方を示しています。
systemctlset-propertyの使用
cgroupsの構成に使用できる最後の方法は、systemctl set-property
です。 指図。基本的なサービスファイルmd5sum.service
から始めます :
[Service]
Type=oneshot
ExecStart=/root/generate_load3.sh
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
Slice=AWESOME.slice
[Install]
WantedBy=multi-user.target
systemctl set-property
の使用 コマンドはファイルを/etc/systemd/system.control
に配置します 。これらのファイルは手動で編集しないでください。すべてのプロパティがset-property
によって認識されるわけではありません コマンドなので、Slice
定義はサービスファイル自体に入れられました。
ユニットファイルを設定してデーモンをリロードした後、systemctl
を使用します 次のようなコマンド:
# systemctl set-property md5sum.service CPUShares=1024
これにより、/etc/systemd/system.control/md5sum.service.d/50-CPUShares.conf
にドロップインファイルが作成されます。 。内容について知りたい場合は、お気軽にファイルをご覧ください。これらのファイルは手動で編集するためのものではないので、私はそれらに時間を費やすことはありません。
次のコマンドを実行して、変更が有効になっているかどうかをテストできます。
systemctl start md5sum.service cat.service sha256sum.service
下のスクリーンショットにあるように、変更は成功したように見えます。 sha256sum.service
md5sum.service
が2048CPUSharesに設定されている間、 1024です。最後に、cat.service
256があります。
[セキュリティについて考えていますか?ハイブリッドクラウドのセキュリティを強化し、ビジネスを保護するためのこの無料ガイドをご覧ください。 ]
まとめ
うまくいけば、あなたは私たちの旅を通して一緒に何か新しいことを学びました。取り組むべきことがたくさんあり、cgroupsで可能なことの表面をかろうじてかじっただけでした。 cgroupsは、システムを正常に保つために果たす役割の他に、「多層防御」戦略にも関与します。さらに、cgroupは、コンテナ化されたプロセスの適切な実行を支援する、最新のKubernetesワークロードにとって重要なコンポーネントです。 Cgroupsは、次のような多くのことに責任があります。
- プロセスのリソースを制限します。
- 競合が発生した場合の優先順位の決定。
- 読み取り/書き込みおよびmknodデバイスへのアクセスを制御します。
- システムで実行されているプロセスに高レベルのアカウンティングを提供します。
コンテナ化、Kubernetes、およびその他のビジネスクリティカルな実装のホストは、cgroupを活用しないと不可能であると主張する人もいるかもしれません。
ご質問やご意見、その他の記事のアイデアがございましたら、Twitterでお気軽にご連絡ください。皆様からのフィードバックをお待ちしております。
ソース
https://0xax.gitbooks.io/linux-insides/content/Cgroups/linux-cgroups-1.html
https://sysadmincasts.com/episodes/14-introduction-to-linux-control-groups -cgroups
https://itnext.io/chroot-cgroups-and-namespaces-an-overview-37124d995e3d
https://www.certdepot.net/rhel7-get-started-cgroups/
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/chap-introduction_to_control_groups
https://oakbytes.wordpress.com/2012/09/02/ cgroup-cpu-allocation-cpu-shares-examples /
https://www.redhat.com/en/blog/world-domination-cgroups-part-1-cgroup-basics
https:/ /www.redhat.com/en/blog/world-domination-cgroups-rhel-8-welcome-cgroups-v2
https://youtu.be/z7mgaWqiV90
https://youtu.be /el7768BNUPw
https://youtu.be/sK5i-N34im8
https://youtu.be/_AODvcO5Q_8
https://youtu.be/x1npPrzyKfs
https:/ /youtu.be/yZpNsDe4Qzg
https://access.redhat.com/solutions/4489171