CentOS7のコントロールグループ(CGROUP)とリソース管理

CentOS7のコントロールグループ(CGROUP)の概要、systemdユニットタイプ、リソース管理などについてまとめました。

※目次をクリックすると目次の下部にコンテンツが表示されます。

コントロールグループの概要
・コントロールグループとは、リソース管理(CPU時間、システムメモリー、ネットワーク帯域幅など)の目的で、プロセスを名前付きグループのツリーに編成するための概念。
 
・システムリソースの割り当て、優先制御、アクセス制限、モニターなどの管理ができる。
 
・ハードウェアリソースを複数のアプリやユーザーにスマートに割り当てることができ、効率性が向上する。
 
・これらのグループは、プロセスを階層的にグループ化し、ラベル付けを行う方法や、(その)リソース制限をこれらのグループに適用する方法を提供する。
 
・これまでは、管理者がプロセスのnice値で調節できる同様の量のシステムリソースがすべてのプロセスに割り当てられていた。このアプローチでは、アプリケーションの相対的な重要度を問わず、数多くのプロセスが使用されるアプリケーションに対して、多くのリソースが割り当てられていた。
 
・CentOS7では、cpgroup階層のシステムをsystemdユニットツリーにバインドすることにより、リソース管理設定をプロセスレベルからアプリケーションレベルに移行している。
 
・CentOS7では、コントロールグループはsystemdで排他的に管理される。
 
・cgroupsは、systemdユニットファイルで設定され、systemdのコマンドラインインターフェース(CLI)ツールで管理できる。
 
・前のバージョンでは、システム管理者はlibcgroupパッケージのcgconfigコマンドを使用してカスタムcgroup階層を作成する。
 
このパッケージを使用するとデフォルトのcgroup階層との競合が容易に生じるため、現在非推奨になっている。
 
ただし、libcgroupはとくにnet-prioサブシステムを使用する場合などsystemdがまだ適用されない特定のケースに対応するために依然として使用することができる。

systemdユニットタイプ
・システム上で実行されるすべてのプロセスはsystemd initプロセスの子プロセス。
 
・リソース制御用に3つのユニットタイプを提供。
 
①サービス
 
・ユニット設定ファイルに基づいてsystemdが起動したプロセスまたはプロセスのグループ。
 
・サービスは指定されたプロセスをカプセル化し、これらのプロセスが1つのセットとして起動したり、停止したりできるようにする。
 
・サービスの名前は以下のように指定される。
name.service
 
②スコープ
 
・外部で作成されたプロセスのグループ。
 
・スコープはfork()により任意のプロセスで起動し、停止された後に、ランタイム時にsystemdによって登録されたプロセスをカプセル化する。たとえば、ユーザーセッション、コンテナーおよび仮想マシンはスコープとして処理される。
 
・スコープの名前は以下のように指定される。
name.scope
 
③スライス
 
・階層的に編成されたユニットのグループ。
 
・スライスにはプロセスが含まれず、スコープやサービスが置かれる階層を編成する。実際のプロセスはスコープやサービスに含まれる。
 
この階層ツリーでは、スライスユニットのすべての名前は階層内の場所へのパスに対応する。
 
・ダッシュ(“-“)文字はパスコンポーネントの区切り文字として機能する。
たとえばスライスの名前は以下のようになる。
parent-name.slice
これは、parent-name.sliceというスライスはparent.sliceのサブスライスであることを意味する。
 
このスライスにはparent-name-name2.sliceなどの独自のサブスライスを持たせることができる。
 
・rootスライスは以下のように表示される。
-.slice

cgroupサブシステム、リソースコントローラー
●リソースコントローラーの概要
 
・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
サイズの大きい仮想メモリーページの使用を許可し、これらのページへのリソース制限を施行する。

デフォルトのcgroup階層、cgroupツリーの表示例
●デフォルトのcgroup階層
 
・デフォルトで、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

関連記事の目次

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です