第2章 コントロールグループの使用法

cgroup を使用して作業する最も簡単な方法は、libcgroup パッケージをインストールすることです。このパッケージには、数多くの cgroup 関連のコマンドラインユーティリティとそれらに関する man ページが含まれています。任意のシステム上で利用可能なシェルコマンドとユーティリティを使用して、階層をマウントし、cgroup のパラメーターを (非永続的に) 設定することも可能ですが、libcgroup の提供するユーティリティを使用すると、プロセスが簡素化され、機能性が拡張されます。このため、本ガイドでは全体を通して、libcgroup コマンドに重点を置いています。ほとんどの場合、相当するシェルコマンドを記載し、根本的な構造がわかりやすいようにしていますが、差し支えがなければ、libcgroup コマンドを使用することを推奨します。

注記

cgroup を使用するためには、まず最初に、root として以下のコマンドを実行し、libcgroup パッケージがインストールされているかどうかを確認します。
~]# yum install libcgroup

2.1. cgconfig サービス

libcgroup パッケージとともにインストールされる cgconfig サービスは、階層を作成して、サブシステムを階層に接続し、それらの階層内の cgroup を管理するのに便利な方法を提供します。システム上の階層と cgroup の管理には、cgconfig を使用することを推奨します。
Red Hat Enterprise Linux 6 では、cgconfig サービスはデフォルトで起動しません。chkconfig を使用してサービスを起動すると、システムは cgroup の設定ファイル /etc/cgconfig.conf を読み取ります。そのため、cgroup はセッションからセッションへと再作成されて永続化します。cgconfig は、設定ファイルの内容に応じて、階層の作成、必要なファイルシステムのマウント、cgroup の作成、各グループ用のサブシステムパラメーターの設定を行います。
libcgroup パッケージとともにインストールされるデフォルトの /etc/cgconfig.conf ファイルは、各サブシステム用の個別の階層を作成およびマウントし、それらの階層にサブシステムを接続します。
cgconfig サービスを停止 (service cgconfig stop コマンドを使用) すると、マウントされていたすべての階層がアンマウントされます。

2.1.1. /etc/cgconfig.conf ファイル

/etc/cgconfig.conf ファイルに含まれるエントリには、mountgroup の 2 つの主要なタイプがあります。mount エントリは、仮想ファイルシステムとして階層を作成してマウントし、サブシステムをそれらの階層に接続します。mount エントリは、以下のような構文を用いて定義します。
mount {
    <controller> = <path>;
    …
}
使用例については、例2.1「mount エントリの作成」 を参照してください。

例2.1 mount エントリの作成

以下の例では、cpuset サブシステム用の階層を作成します。
mount {
    cpuset = /cgroup/red;
}
これに相当するシェルコマンドは以下のとおりです。
~]# mkdir /cgroup/red
~]# mount -t cgroup -o cpuset red /cgroup/red
group エントリは cgroup を作成して、サブシステムパラメーターを設定します。group エントリは、以下のような構文を使用して定義します。
group <name> {
    [<permissions>]
    <controller> {
        <param name> = <param value>;
        …
    }
    …
}
permissions セクションはオプションである点に注意してください。グループエントリのパーミッションを定義するには、以下のような構文を使用します。
perm {
    task {
        uid = <task user>;
        gid = <task group>;
    }
    admin {
       uid = <admin name>;
       gid = <admin group>;
    }
}
使用例については、例2.2「group エントリの作成」 を参照してください。

例2.2 group エントリの作成

以下の例は、sqladmin グループ内のユーザーのパーミッションで SQL デーモン用の cgroup を作成し、タスクを cgroup と root ユーザーに追加してサブシステムのパラメーターを変更します。
group daemons/sql {
    perm {
        task {
            uid = root;
            gid = sqladmin;
        } admin {
            uid = root;
            gid = root;
        }
    } cpu {
        cpuset.mems = 0;
        cpuset.cpus = 0;
    }
}
例2.1「mount エントリの作成」 の mount エントリの例と組み合わせた場合に、相当するシェルコマンドは以下のとおりです。
~]# mkdir -p /cgroup/red/daemons/sql
~]# chown root:root /cgroup/red/daemons/sql/*
~]# chown root:sqladmin /cgroup/red/daemons/sql/tasks
~]# echo 0 > /cgroup/red/daemons/sql/cpuset.mems
~]# echo 0 > /cgroup/red/daemons/sql/cpuset.cpus

注記

/etc/cgconfig.conf への変更内容を有効にするには、cgconfig を再起動する必要があります。ただし、このサービスを再起動すると、全 cgroup 階層が再構築され、以前に存在していた cgroup (例: libvirtd によって使用される既存の cgroup) はいずれも削除される点に注意してください。cgconfig サービスを再起動するには、以下のコマンドを実行します。
~]# service cgconfig restart
libcgroup パッケージをインストールすると、サンプルの設定ファイルが /etc/cgconfig.conf に書き込まれます。行頭にハッシュ記号 ('#') が付いている場合、その行はコメントアウトされ、cgconfig サービスには不可視となります。