GNU/Linux >> Linux の 問題 >  >> Linux

systemdのcgroupsを使用したリソースの管理

コンピューティングリソースが予期せず不足することほど、システム管理者としての私にとってイライラすることはほとんどありません。何度か、パーティション内の使用可能なすべてのディスクスペースをいっぱいにし、RAMを使い果たし、妥当な時間内にタスクを実行するのに十分なCPU時間がありませんでした。リソース管理は、システム管理者が行う最も重要なタスクの1つです。

リソース管理のポイントは、すべてのプロセスが必要なシステムリソースに比較的均等にアクセスできるようにすることです。リソース管理には、RAM、ハードドライブのスペース、およびCPU容量が必要に応じて追加されるか、それが不可能な場合に割り当てられるようにすることも含まれます。さらに、システムリソースを意図的または偶発的に占有するユーザーは、そうすることを防ぐ必要があります。

システム管理者がさまざまなシステムリソースを監視および管理できるようにするツールがあります。たとえば、上位のツールや同様のツールを使用すると、メモリ、I / O、ストレージ(ディスク、SSDなど)、ネットワーク、スワップスペース、CPU使用率などの使用状況を監視できます。これらのツール、特にCPU中心のツールは、ほとんどの場合、実行中のプロセスが制御の単位であるというパラダイムに基づいています。せいぜい、それらは適切な数を調整する方法、そしてそれを通して優先順位を調整する方法、または実行中のプロセスを強制終了する方法を提供します。 (適切な数値については、Glanceを使用したLinuxおよびWindowsホストの監視を参照してください。 。)

システム管理者の詳細

  • Sysadminブログを有効にする
  • 自動化されたエンタープライズ:自動化によってITを管理するためのガイド
  • eBook:システム管理者向けのAnsible自動化
  • 現場からの物語:IT自動化に関するシステム管理者ガイド
  • eBook:SREおよびシステム管理者向けのKubernetesのガイド
  • 最新のシステム管理者の記事

SystemV環境での従来のリソース管理に基づく他のツールは、/etc/security/limits.confによって管理されます。 /etc/security/limits.dにあるファイルとローカル構成ファイル ディレクトリ。リソースは、ユーザーまたはグループによってかなり大雑把ですが便利な方法で制限できます。管理できるリソースには、RAMのさまざまな側面、1日あたりの合計CPU時間、データの合計量、優先度、適切な数、同時ログイン数、プロセス数、最大ファイルサイズなどが含まれます。

プロセス管理にcgroupを使用する

systemdとSystemVの大きな違いの1つは、プロセスの処理方法です。 SystemVは、各プロセスをそれ自体のエンティティとして扱います。 systemdは、関連するプロセスをcgroups(コントロールグループの略)と呼ばれるコントロールグループに収集し、cgroup全体のシステムリソースを管理します。つまり、リソースは、アプリケーションを構成する個々のプロセスではなく、アプリケーションごとに管理できます。

cgroupの制御ユニットはスライスユニットと呼ばれます。スライスは、systemdが管理を容易にするためにプロセスをツリー形式で順序付けることを可能にする概念化です。

cgroupの表示

まず、cgroupに関するさまざまな種類の情報を表示できるコマンドから始めます。 systemctl status <service> コマンドは、スライスを含む、指定されたサービスに関するスライス情報を表示します。この例は、atを示しています デーモン:

 [root @ testvm1〜]#systemctl status atd.service 
●atd.service-遅延実行スケジューラ
ロード済み:ロード済み(/usr/lib/systemd/system/atd.service;有効;ベンダープリセット:有効)
アクティブ:水2020-09-23 12:18:24 EDT以降アクティブ(実行中)。 1日3時間前
ドキュメント:man:atd(8)
メインPID:1010(atd)
タスク:1(制限:14760)
メモリ:440.0K
CPU:5ms
CGroup:/system.slice/atd.service
└─1010/usr / sbin / atd -f

Sep 2312:18:24testvm1。 both.org systemd [1]:遅延実行スケジューラを開始しました。
[root @ testvm1〜]#

これは、systemdがSystemVや古いinitプログラムよりも使いやすいと思う1つの理由の優れた例です。ここには、SystemVが提供できるよりもはるかに多くの情報があります。 cgroupエントリには、system.sliceが存在する階層構造が含まれています。 はsystemd(PID 1)であり、atd.service は1レベル下で、system.sliceの一部です。 。 cgroupエントリの2行目には、プロセスID(PID)とデーモンの起動に使用されるコマンドも表示されます。

systemctl コマンドは複数のcgroupエントリを表示します。 --all オプションは、現在アクティブでないスライスを含むすべてのスライスを表示します:

 [ルート@ testvm1〜]#systemctl -tスライス--all 
ユニット負荷ACTIVE SUB説明
-.sliceアクティブアクティブルートスライス
システムgetty.sliceがアクティブアクティブロードをロードsystem-getty.slice
system-lvm2 \ x2dpvscan.slice load active active system-lvm2 \ x2dpvscan.slice
system-modprobe.slice active system-modprobe.slice \x2dkeygen.sliceロードされたアクティブアクティブなシステム-sshd\x2dkeygen.slice
system-systemd\x2dcoredump.sliceロードされた非アクティブなデッドsystem-systemd\x2dcoredump.slice
アクティブなsystem-systemd\x2dfsck.slice -systemd \ x2dfsck.slice
system.sliceロードされたアクティブアクティブなシステムスライス
user-1000.slice load active active active User Slice of UID 1000
user.slice loadactiveactiveユーザーとセッションスライス
ACTIVE =高レベルのユニットアクティベーション状態、つまりSUBの一般化。
SUB =低レベルのユニットアクティベーション状態、値はユニットタイプによって異なります。

11個のロードされたユニットリストされています。
インストールされているすべてのユニットファイルを表示するには、「systemctllist-unit-files」を使用します。
[root @ testvm1〜]#

このデータについて最初に気付くのは、UID 0(ルート)とユーザーログインである1000のユーザースライスが表示されていることです。これはスライスのみを表示し、各スライスの一部であるサービスは表示しません。このデータは、ユーザーがログインしたときにスライスが作成されることを示しています。これにより、ユーザーのすべてのタスクを単一のcgroupエンティティとして管理できます。

cgroup階層を探索する

これまでのところすべてが順調ですが、cgroupは階層的であり、すべてのサービスユニットはcgroupの1つのメンバーとして実行されます。その階層の表示は簡単で、systemdの一部である古いコマンドと新しいコマンドを1つずつ使用します。

ps コマンドを使用して、cgroup階層内のプロセスとその場所をマップできます。 psを使用する場合は、目的のデータ列を指定する必要があることに注意してください。 指図。以下のこのコマンドからの出力の量を大幅に減らしましたが、システムで何が見つかるかを感じることができるように、十分に残そうとしました:

<前> [ルート@ testvm1〜]#psのxawf -eo PID、ユーザー、cgroup内、引数
PID USER CGROUP COMMAND
2ルート - [kthreadd]
3ルート - \ _ [rcu_gp 】
4ルート - \ _ [rcu_par_gp]
6ルート - \ _ [kworker / 0:0H-kblockd]
9ルート - \ _ [mm_percpu_wq]
10ルート - \ _ [ksoftirqd / 0]
11ルート - \ _ [rcu_sched]
12ルート - \ _ [マイグレーション/ 0]
13ルート - \ _ [cpuhp / 0]
14ルート - \ _ [cpuhp / 1]

625406ルート - \ _ [kworker / 3:0-ata_sff]
625409ルート - \ _ [kworker / U8: 0-events_unbound]
1 root 0 ::/init.scope / usr / lib / systemd / systemd --switched-root --system --deserialize 30
588 root 0 ::/ system.slice / systemd-jo / usr / lib / systemd / systemd-journald
599 root 0 ::/ system.slice / systemd-ud / usr / lib / systemd / systemd-udevd
741 root 0 ::/ system.slice / auditd.ser /sbin/auditd
743 root 0 ::/ system.slice / auditd.ser \ _ /usr/sbin/sedispatch
764 root 0 ::/ system.slice / ModemManag / usr / sbin / ModemManager
765 root 0 ::/system.slice/NetworkMan / usr / sbin / NetworkManager --no-daemon
767 root 0 ::/ system.slice / irqbalance / usr / sbin / irqbalance --foreground
779 root 0 ::/system.slice/mcelog.ser / usr / sbin / mcelog --ignorenodev --daemon --foreground
781 root 0 ::/ system.slice / rngd.servi / sbin / rngd -f
782 root 0 ::/ system.slice / rsyslog.se / usr / sbin / rsyslogd -n

893 root 0 ::/ system.slice / sshd.servi sshd:/ usr / sbin / sshd -D[listener]0/10-100スタートアップ
1130root 0 ::/ user.slice / user-0.slice \ _ sshd:root [priv]
1147 root 0 ::/ user.slice / user-0.slice | \ _ sshd:root @ pts / 0
1148 root 0 ::/ user.slice / user-0.slice | \ _ -bash
1321 root 0 ::/ user.slice / user-0.slice | \ _ screen
1322 root 0 ::/ user.slice / user-0.slice | \ _ SCREEN
1323 root 0 ::/ user.slice / user-0.slice | \ _ / bin / bash
498801 root 0 ::/ user.slice / user-0.slice | | \ _ man systemd.resource-control
498813 root 0 ::/ user.slice / user-0.slice | | \ _ less
1351 root 0 ::/ user.slice / user-0.slice | \ _ / bin / bash
123293 root 0 ::/ user.slice / user-0.slice | | \ _ man systemd.slice
123305 root 0 ::/ user.slice / user-0.slice | | \ _ less
1380 root 0 ::/ user.slice / user-0.slice | \ _ / bin / bash
625412 root 0 ::/ user.slice / user-0.slice | | \ _ ps xawf -eo pid、user、cgroup、args
625413 root 0 ::/ user.slice / user-0.slice | | \ _ less
246795 root 0 ::/ user.slice / user-0.slice | \ _ / bin / bash
625338 root 0 ::/ user.slice / user-0.slice | \ _ / usr / bin / mc -P /var/tmp/mc-root/mc.pwd.246795
625340 root 0 ::/ user.slice / user-0.slice | \ _ bash -rcfile .bashrc
1218 root 0 ::/ user.slice / user-1000.sl \ _ sshd:dboth [priv]
1233 dboth 0 ::/ user.slice / user- 1000.sl \ _ sshd:dboth @ pts / 1
1235 dboth 0 ::/ user.slice / user-1000.sl \ _ -bash

1010 root 0: :/system.slice/atd.servic / usr / sbin / atd -f
1011 root 0 ::/ system.slice / crond.serv / usr / sbin / crond -n
1098 root 0: :/system.slice/lxdm.servi / usr / sbin / lxdm-binary
1106 root 0 ::/ system.slice / lxdm.servi \ _ / usr / libexec / Xorg -background none:0 vt01 -nolisten tcp -novtswitch -auth /var/run/lxdm/lxdm-:0.auth
370621 root 0 ::/ user.slice / user-1000.sl \ _ / usr / libexec / lxdm-session
370631 dboth 0 ::/ user.slice / user-1000.sl \ _ xfce4-session
370841 dboth 0 ::/ user.slice / user-1000.sl \ _ /usr/bin/ssh-agent / bin / sh -c exec -l bash -c "/usr/bin/startxfce4"
370911 dboth 0 ::/ user.slice / user-1000.sl \ _ xfwm4 --display:0.0 --sm -client-id 2de ad44ab-0b4d-4101-bca4-e6771f4a8ac2
370930 dboth 0 ::/ user.slice / user-1000.sl \ _ xfce4-panel --display:0.0 --sm-client-id 2ce38b8ef-86fd-4189 -ace5-deec1d0e0952
370942 dboth 0 ::/ user.slice / user-1000.sl | \ _ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libsystray.so 6 23068680 systr
ay通知エリア通知アイコンが表示されるエリア
370943dboth 0 ::/ user.slice / user-1000.sl | \ _ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libpulseaudio-plugin.so 8 2306
8681pulseaudioPulseAudioプラグインPulseAudioサウンドシステムの音量を調整する
370944 dboth 0 ::/ user.slice / user-1000.sl | \ _ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libxfce4powermanager.so 9 2306
8682 power-manager-pluginPowerManagerプラグインデバイスのバッテリーレベルを表示しますディスプレイの明るさを制御します
370945dboth 0 ::/ user.slice / user-1000.sl | \ _ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libnotification-plugin.so 10 2
3068683notification-plugin通知プラグインXfceパネル用の通知プラグイン
370948 dboth 0 ::/ user.slice / user-1000.sl | \ _ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libactions.so 14 23068684アクション
アクションボタンログアウト、ロック、またはその他のシステムアクション
370934 dboth 0 ::/ user.slice / user-1000.sl \ _ Thunar --sm-client-id 2cfc809d8-4e1d-497a-a5c5-6e4fa509c3fb --daemon
370939 dboth 0 ::/user。 /user-1000.sl \ _ xfdesktop --display:0.0 --sm-client-id 299be0608-4dca-4055-b4d6-55ec6e73a324
370962 dboth 0 ::/ user.slice / user-1000.sl \ _ nm-applet

systemd-cglsを使用して階層全体を表示できます コマンド。複雑なオプションを必要としないため、少し簡単です。

このツリービューを大幅に短縮しました。同様に、しかし、私はあなたにデータの量とあなたがあなたのシステムでこれをするときに見るべきエントリーのタイプのいくつかのアイデアをあなたに与えるのに十分なままにしました。これを仮想マシンの1つで実行しましたが、長さは約200行です。プライマリワークステーションからのデータ量は約250行です:

 [root @ testvm1〜]#systemd-cgls 
コントロールグループ/:
-.slice
├─user.slice
│├─user-0.slice
││├─session-1.scope
│││├─1130sshd:root [priv]
│││├─1147sshd:root @ pts / 0
│ ││├─1148-bash
│││├─1321画面
│││├─1322画面
││││├─1323/bin / bash
│││ ├─1351/bin / bash
│││├─1380/bin / bash
│││├─123293mansystemd.slice
│││├─123305less
│││├─246795/bin/ bash
│││├─371371mansystemd-cgls
│││├─371383less
│││├─371469systemd-cgls
│││└─371470less
││└─[email protected]
││├─dbus-broker.service
│││├─1170/usr/ bin / dbus-broker-launch --scope user
│││└─1171dbus-broker--log4 --controller 12 --machine-id 3bccd1140fca488187f8a1439c832f07 --max-bytes 100000000000000 --max-fds 25000000000000- -max->
││├─gvfs-daemon.service
│││└─1173/usr/ libexec / gvfsd
││└─init.scope
││ ├─11 37 / usr / lib / systemd / systemd --user
││└─1138(sd-pam)
│└─user-1000.slice
│├─[email protected]
││├─dbus\x2d:1.2 \ x2dorg.xfce.Xfconf.slice
│││└─dbus-:[email protected]
│ ││└─370748/usr/ lib64 / xfce4 / xfconf / xfconfd
││├─dbus\x2d:1.2 \ x2dca.desrt.dconf.slice
│││└─dbus-:1.2- [email protected]
│││└─371262/usr/ libexec / dconf-service
││├─dbus-broker.service
│││├─1260 / usr / bin / dbus-broker-launch --scope user
│││└─1261dbus-broker--log4 --controller 11 --machine-id

││└─gvfs-mtp-volume-monitor.service
││└─370987/usr/libexec/gvfs-mtp-volume-monitor
│├─session-3.scope
││├─1218sshd:dboth [priv]
││├─1233sshd:dboth @ pts / 1
││└─1235-bash
│└─session-7。スコープ
│├─370621/usr/ libexec / lxdm-session
│├─370631xfce4-session
│├─370805/usr/ bin / VBoxClient --clipboard
│├─370806/usr/ bin / VBoxClient --clipboard
│├─370817/usr/ bin / VBoxClient --seamless
│├─370818/usr/ bin / VBoxClient-シームレス
│├─370824/usr/ bin / VBoxClient --draganddrop
│├─370825/usr/ bin / VBoxClient --draganddrop
│├─370841/usr/ bin / ssh-エージェント/bin/ sh -c exec -l bash -c "/ usr / bin / startxfce4"
│├─370910/bin/ gpg-agent --sh --daemon --write-env-file / home /dboth/.cache/gpg-agent-info
│├─370911xfwm4--display:0.0 --sm-client-id 2dead44ab-0b4d-4101-bca4-e6771f4a8ac2
│├─370923xfsettingsd --display:0.0 --sm-client-id 261b4a437-3029-461c-9551-68c2c42f4fef
│├─370930xfce4-panel--display:0.0 --sm-client-id 2ce38b8ef-86fd-4189- ace5-deec1d0e0952
│├─370934Thunar--sm-client-id2cfc809d8-4e1d-497a-a5c5-6e4fa509c3fb --daemon
│├─370939xfdesktop--display:0.0 --sm -id 299be0608-4dca-4055-b4d6-55ec6e73a324

└─system.slice
├─rngd.service
│└─1 650 / sbin / rngd -f
├─irqbalance.service
│└─1631/usr/ sbin / irqbalance --foreground
├─fprintd.service
│└─303383 / usr / libexec /fprintd
├─systemd-udevd.service
│└─956/usr/ lib / systemd / systemd-udevd

├─systemd- journald.service
│└─588/usr/ lib / systemd /systemd-journald
├─atd.service
│└─1010/usr/ sbin / atd -f
├─system-dbus\x2d:1.10 \ x2dorg.freedesktop.problems.slice
│└─dbus-:[email protected]
│└─371197/usr/ sbin / abrt-dbus -t133
├─sshd.service
│└─893sshd:/ usr / sbin / sshd-D[リスナー]10-100のスタートアップの0
├─vboxservice。 service
│└─802/usr/ sbin / VBoxService-f
├─crond.service
│└─1011/usr/ sbin / crond -n
├─NetworkManager。サービス
│└─765/usr/ sbin / NetworkManager--no-daemon
├─switcheroo-control.service
│└─787/usr/ libexec / switcheroo-control

このツリービューには、すべてのユーザースライスとシステムスライス、および各cgroupで実行されているサービスとプログラムが表示されます。 user-1000.slice内で、関連するプログラムを管理ユニットにグループ化する「スコープ」と呼ばれるユニットに注目してください。 上記のリストで。 user-1000.slice/session-7.scope cgroupには、LXDMディスプレイマネージャーセッションと、BashシェルやThunarGUIファイルマネージャーなどのすべてのサブタスクから始まるGUIデスクトッププログラム階層が含まれています。

スコープ単位は構成ファイルで定義されていませんが、関連するプログラムのグループを開始した結果としてプログラムで生成されます。スコープユニットは、そのcgroupの一部として実行されているプロセスを作成または開始しません。スコープ内のすべてのプロセスは等しく、内部階層はありません。スコープの寿命は、最初のプロセスが作成されたときに始まり、最後のプロセスが破棄されたときに終わります。

ターミナルエミュレータ、LibreOfficeなど、デスクトップでいくつかのウィンドウを開き、使用可能な仮想コンソールに切り替えて、topのようなものを起動します。 またはミッドナイトコマンダー。 systemd-cglsを実行します ホストでコマンドを実行し、全体的な階層とスコープ単位に注意してください。

systemd-cgls コマンドは、私が見つけた他のどのコマンドよりも、cgroup階層(およびそれを構成するユニットの詳細)のより完全な表現を提供します。 psよりも、ツリーのよりクリーンな表現が好きです。 コマンドが提供します。

友達の助けを借りて

これらの基本をカバーした後、cgroupとその使用方法についてさらに詳しく説明する予定でしたが、Opensource.comの姉妹サイトであるEnableSysadminでRedHatのSteveOvensによる一連の4つの優れた記事を発見しました。基本的にスティーブの記事を書き直すのではなく、それらにリンクすることで彼のcgroupの専門知識を活用する方がはるかに良いと判断しました:

  1. Linuxsysadminによるcgroupの紹介
  2. CPUSharesを使用してcgroupを管理する方法
  3. cgroupsを手動で管理するのは難しい方法です
  4. systemdを使用したcgroupの管理

私と同じように、楽しんで、彼らから学びましょう。

その他のリソース

インターネット上にはsystemdに関する多くの情報がありますが、その多くは簡潔で、鈍感で、誤解を招くものですらあります。この記事に記載されているリソースに加えて、次のWebページでは、systemdの起動に関するより詳細で信頼性の高い情報を提供しています。このリストは、私が行った調査を反映するためにこのシリーズの記事を始めてから増えています。

  • Fedora Projectには、systemdに関する優れた実用的なガイドがあります。 systemdを使用してFedoraコンピューターを構成、管理、および保守するために知っておく必要のあるほとんどすべてが含まれています。
  • Fedora Projectには、古いSystemVコマンドを同等のsystemdコマンドと相互参照する優れたチートシートもあります。
  • systemd.unit(5)のマニュアルページには、ユニットファイルセクションとその構成オプションの一覧と、それぞれの簡潔な説明が含まれています。
  • Red Hatのドキュメントには、ユニットファイル構造の適切な説明とその他の重要な情報が含まれています。
  • systemdの詳細な技術情報とその作成理由については、Freedesktop.orgのsystemdの説明をご覧ください。このページは、他の重要で正確なドキュメントへのリンクが多数含まれているため、私が見つけた中で最高のページの1つです。
  • Linux.comの「Moresystemdfun」は、より高度なsystemd情報とヒントを提供します。
  • systemd.resource-control(5)のマニュアルページを参照してください。
  • Linuxカーネルユーザーおよび管理者ガイド 、コントロールグループv2エントリを参照してください。

また、systemdの設計者であり主要な開発者であるLennart Poetteringによる、Linuxシステム管理者向けの一連の詳細な技術記事もあります。これらの記事は2010年4月から2011年9月の間に書かれましたが、当時と同じように関連性があります。 systemdとそのエコシステムについて書かれた他のすべての優れた点の多くは、これらの論文に基づいています。

  • PID1を再考する
  • 管理者向けsystemd、パートI
  • 管理者向けsystemd、パートII
  • 管理者向けsystemd、パートIII
  • 管理者向けsystemd、パートIV
  • 管理者向けsystemd、パートV
  • 管理者向けsystemd、パートVI
  • 管理者向けsystemd、パートVII
  • 管理者向けsystemd、パートVIII
  • 管理者向けsystemd、パートIX
  • 管理者向けsystemd、パートX
  • 管理者向けsystemd、パートXI

Linux
  1. systemd-udevdを使用してLinuxで接続されたハードウェアを管理する

  2. LinuxでSystemctlを使用してSystemdサービスを管理する方法

  3. RedHat / CentOS :mdadm によるソフトウェア RAID の管理

  1. 複数のexecStartを持つSystemd

  2. lxc-execute でメモリと CPU を制限する

  3. systemd で USB ドライブを自動マウントする

  1. Linuxでfdiskを使用してパーティションを管理する

  2. Linuxでpartedを使用してパーティションを作成および管理する

  3. Runitを使用したUpstart/systemdに関するこのエラー?