CentOS7のコントロールグループ(CGROUP)の概要、systemdユニットタイプ、リソース管理などについてまとめました。
※目次をクリックすると目次の下部にコンテンツが表示されます。
・システムリソースの割り当て、優先制御、アクセス制限、モニターなどの管理ができる。
・ハードウェアリソースを複数のアプリやユーザーにスマートに割り当てることができ、効率性が向上する。
・これらのグループは、プロセスを階層的にグループ化し、ラベル付けを行う方法や、(その)リソース制限をこれらのグループに適用する方法を提供する。
・これまでは、管理者がプロセスのnice値で調節できる同様の量のシステムリソースがすべてのプロセスに割り当てられていた。このアプローチでは、アプリケーションの相対的な重要度を問わず、数多くのプロセスが使用されるアプリケーションに対して、多くのリソースが割り当てられていた。
・CentOS7では、cpgroup階層のシステムをsystemdユニットツリーにバインドすることにより、リソース管理設定をプロセスレベルからアプリケーションレベルに移行している。
・CentOS7では、コントロールグループはsystemdで排他的に管理される。
・cgroupsは、systemdユニットファイルで設定され、systemdのコマンドラインインターフェース(CLI)ツールで管理できる。
・前のバージョンでは、システム管理者はlibcgroupパッケージのcgconfigコマンドを使用してカスタムcgroup階層を作成する。
このパッケージを使用するとデフォルトのcgroup階層との競合が容易に生じるため、現在非推奨になっている。
ただし、libcgroupはとくにnet-prioサブシステムを使用する場合などsystemdがまだ適用されない特定のケースに対応するために依然として使用することができる。
・リソース制御用に3つのユニットタイプを提供。
①サービス
・ユニット設定ファイルに基づいてsystemdが起動したプロセスまたはプロセスのグループ。
・サービスは指定されたプロセスをカプセル化し、これらのプロセスが1つのセットとして起動したり、停止したりできるようにする。
・サービスの名前は以下のように指定される。
name.service
②スコープ
・外部で作成されたプロセスのグループ。
・スコープはfork()により任意のプロセスで起動し、停止された後に、ランタイム時にsystemdによって登録されたプロセスをカプセル化する。たとえば、ユーザーセッション、コンテナーおよび仮想マシンはスコープとして処理される。
・スコープの名前は以下のように指定される。
name.scope
③スライス
・階層的に編成されたユニットのグループ。
・スライスにはプロセスが含まれず、スコープやサービスが置かれる階層を編成する。実際のプロセスはスコープやサービスに含まれる。
この階層ツリーでは、スライスユニットのすべての名前は階層内の場所へのパスに対応する。
・ダッシュ(“-“)文字はパスコンポーネントの区切り文字として機能する。
たとえばスライスの名前は以下のようになる。
parent-name.slice
これは、parent-name.sliceというスライスはparent.sliceのサブスライスであることを意味する。
このスライスにはparent-name-name2.sliceなどの独自のサブスライスを持たせることができる。
・rootスライスは以下のように表示される。
-.slice
・cgroupサブシステムとも呼ばれる。
・CPU時間やメモリーなどの単一リソースを表す。
・Linuxカーネルは、systemdによって自動的にマウントされる一定範囲のリソースコントローラーを提供する。
●現在マウントされているリソースコントローラーの一覧を確認
①/proc/cgroups
# more /proc/cgroups #subsys_name hierarchy num_cgroups enabled cpuset 2 1 1 cpu 3 1 1 cpuacct 3 1 1 memory 4 1 1 devices 5 1 1 freezer 6 1 1 net_cls 7 1 1 blkio 8 1 1 perf_event 9 1 1 hugetlb 10 1 1
②lssubsysモニタリングツール
以下に示すようにlibcgroup-toolsパッケージに含まれている。
# yum provides lssubsys ・・・ libcgroup-tools-0.41-8.el7.i686 : Command-line utility programs, services and : daemons for libcgroup リポジトリー : base 一致 : ファイル名 : /usr/bin/lssubsys
●CentOS7で利用可能なコントローラー
・blkio
ブロックデバイスへの入力アクセスまたはブロックデバイスからの出力アクセスの制限を設定する。
・cpu
cgroupタスクにCPUへのアクセスを提供するためにCPUスケジューラーを使用する。
・cpuacct
cgroup内のタスクで使用されるCPUリソースについての自動レポートを作成する。
・cpuset
個別のCPU(マルチコアシステム上)およびメモリーノードをcgroup 内のタスクに割り当てる。
・devices
cgroup内のタスクについてデバイスへのアクセスを許可または拒否する。
・freezer
cgroup内のタスクを一時停止または再開する。
・memory
cgroup内のタスクによって使用されるメモリーに対する制限を設定し、それらのタスクによって使用されるメモリーリソースについての自動レポートを生成する。
・net_cls
Linuxトラフィックコントローラー(tcコマンド)が特定のcgroupタスクから発信されるパケットを識別することを可能にするクラス識別子(classid)を使用して、ネットワークパケットにタグを付ける。
・perf_event
perfツールを使用したcgroupのモニタリングを可能にする。
・hugetlb
サイズの大きい仮想メモリーページの使用を許可し、これらのページへのリソース制限を施行する。
・デフォルトで、systemdはスライス、スコープ、サービスの階層を自動作成し、cgroupツリーの統一された構造を提供する。
・systemctlコマンドを使用すると、カスタムスライスを作成してこの構造をさらに変更することができる。
・systemdは重要なカーネルリソースコントローラーの階層を/sys/fs/cgroup/ディレクトリーに自動マウントする。
●サービス、スコープ、スライスのcgroupツリーへのマップ
・サービス、スコープ、スライスはcgroupツリー内のオブジェクトに直接マップされる。
・これらのユニットがアクティブになると、それぞれがユニット名から作成されるcgroupパスに直接マップされる。
例)test-waldo.sliceにあるex.service
cgroupのtest.slice/test-waldo.slice/ex.service/にマップされる。
●デフォルトで作成されるスライス
・-.slice
root スライス
・system.slice
すべてのシステムサービスのデフォルトの場所
・user.slice
すべてのユーザーセッションのデフォルトの場所
・machine.slice
すべての仮想マシンおよびLinuxコンテナーのデフォルトの場所
※すべてのユーザーセッションは、仮想マシンやコンテナープロセスと共に分離したスコープユニットに自動的に置かれる事に注意。
●systemd-cglsコマンドでCGROUP階層の表示
・systemd-cglsコマンドによって、cgroupのコンテンツを再帰的に表示できる。
・プロセスはサービス、スコープに含まれ、サービス、スコープはスライスに置かれている。
・-.sliceはツリー全体のrootで暗黙的に識別されるため表示されていない。
# systemd-cgls |-1 /usr/lib/systemd/systemd --switched-root --system --deserialize 24user.slice |-user-0.slice | -session-1.scope | -2343 sshd: root@pts/0 | -2347 -bash |-system.slice -postfix.service -1878 /usr/libexec/postfix/master -w -1903 pickup -l -t unix -u -1904 qmgr -l -t unix -u -NetworkManager.service -720 /usr/sbin/NetworkManager --no-daemon -1577 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhc
●psコマンドでCGROUP階層の表示
# ps xawf -eo pid,user,cgroup,args PID USER CGROUP COMMAND ・・・ 1 root - /usr/lib/systemd/systemd --switched-root --system --deserialize 24 ・・・ 720 root 1:name=systemd:/system.slic /usr/sbin/NetworkManager --no-daemon 1577 root 1:name=systemd:/system.slic \_ /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-enp0s29f7u 759 polkitd 1:name=systemd:/system.slic /usr/lib/polkit-1/polkitd --no-debug 1088 root 1:name=systemd:/system.slic /usr/sbin/sshd -D 2343 root 1:name=systemd:/user.slice/ \_ sshd: root@pts/0 2347 root 1:name=systemd:/user.slice/ \_ -bash 2366 root 1:name=systemd:/user.slice/ \_ ps xawf -eo pid,user,cgroup,args 1878 root 1:name=systemd:/system.slic /usr/libexec/postfix/master -w 1903 postfix 1:name=systemd:/system.slic \_ pickup -l -t unix -u 1904 postfix 1:name=systemd:/system.slic \_ qmgr -l -t unix -u