CentOS6でcgroupsを使用してリソースを制限する方法

提供:Dev Guides
移動先:案内検索

ステータス:非推奨

この記事では、サポートされなくなったバージョンのCentOSについて説明します。 現在CentOS6を実行しているサーバーを運用している場合は、サポートされているバージョンのCentOSにアップグレードまたは移行することを強くお勧めします。

理由: CentOS 6は2020年11月30日に保守終了(EOL)に達し、セキュリティパッチまたはアップデートを受信しなくなりました。 このため、このガイドは維持されなくなりました。

代わりに参照:このガイドは参照として役立つ場合がありますが、他のCentOSリリースでは機能しない場合があります。 可能な場合は、使用しているCentOSのバージョン用に作成されたガイドを使用することを強くお勧めします。


序章

コントロールグループ(cgroups)は、CentOS 6で導入されたカーネル機能であり、プロセスのシステムリソースへのアクセスを制限する新しい方法を提供します。 独自のcgroupを作成したり、構成したcgroupを監視したり、特定のリソースへのcgroupのアクセスを拒否したり、実行中のシステムでcgroupを動的に再構成したりすることもできます。

このチュートリアルでは、プロセスのCPU、メモリ、およびディスクI/Oを制限する方法を説明します。 これを実現するために、最初にいくつかのコントロールグループを作成し、それらにプロセスを追加して、それらがどのように実行されるかを確認します。

前提条件

このチュートリアルを開始する前に、CentOS6ドロップレットでsudoを設定したroot以外のユーザーが必要です。 このタイプのユーザーをセットアップするには、 CentOS6を使用したサーバーの初期セットアップチュートリアルに従ってください。 すべてのコマンドはこのユーザーとして実行されます。

ステップ1—インストール

このセクションでは、cgroupsが機能するために必要なパッケージをインストールします。

コントロールグループとそれらが関連するサブシステムは、シェルコマンドとユーティリティを使用して操作できます。 ただし、cgroupsを操作する最も簡単な方法は、libcgroupパッケージをインストールすることです。 libcgroupパッケージは、cgroups関連のコマンドラインユーティリティ、構成ファイル、およびマニュアルページを提供します。 このパッケージは、デフォルトではCentOS6サーバーにインストールされていません。 これをインストールするには、次のコマンドを実行します。

sudo yum install libcgroup

ステップ2—サービスを開始する

cgconfig(control group config)サービスは、cgroupの作成とサブシステムの管理に使用されます。 起動時に起動し、事前定義されたcgroupを再確立するように構成できるため、再起動後も永続的になります。 cgconfigサービスは、CentOS 6ではデフォルトで開始されないため、次のように開始します。

sudo service cgconfig start

cgconfigサービスを開始すると、すべてのサブシステムで/cgroupにマウントされた仮想ファイルシステムが作成されます。 これを確認しましょう:

sudo ls /cgroup

このコマンドは、次のサブシステムを表示する必要があります。

blkio  cpu  cpuacct  cpuset  devices  freezer  memory  net_cls

`lscgroup'コマンドを実行して以下を確認することもできます。

sudo lscgroup

サブシステムは少し異なるレイアウトで表示されます。

cpuset:/
cpu:/
cpuacct:/
memory:/
devices:/
freezer:/
net_cls:/
blkio:/

システムリソース

システムリソースはサブシステムと呼ばれ、各サブシステムには、値を割り当てることができるいくつかのパラメーターがあります。 CentOS 6は、10個のcgroupサブシステムを提供します。

  • blkio —このサブシステムは、物理ドライブ(ディスク、ソリッドステート、USBなど)などのブロックデバイスとの間の入出力アクセスに制限を設定します。
  • cpu —このサブシステムは使用可能なCPU時間に制限を設定します
  • cpuacct —このサブシステムは、cgroup内のタスクによって使用されるCPUリソースに関する自動レポートを生成します
  • cpuset —このサブシステムは、個々のCPU(マルチコアシステム上)とメモリノードをcgroup内のタスクに割り当てます
  • devices —このサブシステムは、cgroup内のタスクによるデバイスへのアクセスを許可または拒否します
  • freezer —このサブシステムはcgroup内のタスクを一時停止または再開します
  • memory —このサブシステムは、cgroup内のタスクによるメモリ使用の制限を設定し、それらのタスクによって使用されるメモリリソースに関する自動レポートを生成します
  • net_cls —このサブシステムは、Linuxトラフィックコントローラー(tc)が特定のcgroupタスクから発信されたパケットを識別できるようにするクラス識別子(classid)でネットワークパケットにタグを付けます
  • net_prio —このサブシステムは、ネットワークインターフェイスごとにネットワークトラフィックの優先度を動的に設定する方法を提供します
  • ns —これは名前空間サブシステムです

ステップ3—構成

このセクションでは、サンプルcgroupを作成し、それらのcgroupにいくつかのリソース制限を設定します。 cgroup構成ファイルは/etc/cgconfig.confです。 構成ファイルの内容に応じて、cgconfigは階層の作成、必要なファイルシステムのマウント、cgroupの作成、および各cgroupのサブシステムパラメーター(リソース制限)の設定を行うことができます。

階層は、システム内のすべてのタスクが階層内のcgroupの1つに正確に含まれるように、ツリーに配置されたcgroupのセットです。 デフォルトのCentOS6構成では、各サブシステムは独自の階層に配置されます。

まず、limitcpu、limitmem、limitio、browserという名前のcgroupをいくつか作成しましょう。 /etc/cgconfig.confファイルには、mountgroupの2つの主要なタイプのエントリが含まれています。 groupで始まる行は、cgroupを作成し、サブシステムパラメーターを設定します。 ファイル/etc/cgconfig.confを編集し、下部に次のcgroupエントリを追加します。

/etc/cgconfig.conf

group limitcpu{
        cpu {
                cpu.shares = 400;
        }
}

group limitmem{
        memory {
                memory.limit_in_bytes = 512m;
        }
}

group limitio{
        blkio {
                blkio.throttle.read_bps_device = "252:0         2097152";
        }
}

group browsers{
        cpu {
                cpu.shares = 200;
        }
        memory {
                memory.limit_in_bytes = 128m;
        }
}
  • limitcpu cgroupでは、このcgroup内のプロセスで使用可能なcpu共有を400に制限しています。 cpu.sharesは、cgroup内のタスクで使用可能なCPU時間の相対的なシェアを指定します。
  • limitmem cgroupでは、cgroupプロセスで使用可能なメモリを512MBに制限しています。
  • limitio cgroupでは、ディスクの読み取りスループットを2MiB/sに制限しています。 ここでは、読み取りI/Oをプライマリディスク/dev/ vdaに制限しています。メジャー:マイナー番号は252:0で、2MiB / sは1秒あたりのバイト数に変換されます(2x1024x1024 = 2097152)。
  • browsers cgroupでは、CPU共有を200に制限し、使用可能なメモリを128MBに制限しています。

/etc/cgconfig.confファイルの変更を有効にするには、cgconfigサービスを再起動する必要があります。

sudo service cgconfig restart

cgconfigを有効にしてシステムの起動時に開始しましょう。 chkconfigを使用してサービスを有効にすると、起動時にcgroup構成ファイル/etc/cgconfig.confが読み取られます。 cgroupはセッションごとに再作成され、永続性を維持します。

sudo chkconfig cgconfig on

次に、構成したcgroupが正しく表示されていることを確認します。

lscgroup 

すべてがうまくいった場合は、次のように表示されます。

cpuset:/
cpu:/
cpu:/browsers
cpu:/limitcpu
cpuacct:/
memory:/
memory:/browsers
memory:/limitmem
devices:/
freezer:/
net_cls:/
blkio:/
blkio:/limitio

次の目標は、以前に作成したcgroupにリソースを制限するプロセス(タスク)を追加することです。

Cgred(コントロールグループルールエンジンデーモン)は、/etc/cgrules.confファイルで設定されたパラメーターに従ってタスクをcgroupに移動するサービスです。 /etc/cgrules.confファイルのエントリは、次の2つの形式のいずれかを取ることができます。

user subsystems control_group

また

user:command subsystems control_group

userは、「@」文字が前に付いたユーザー名またはグループ名を指します。 subsystemsは、サブシステム名のコンマ区切りのリストを参照します。 control_groupはcgroupへのパスを表し、commandはプロセス名またはプロセスの完全なコマンドパスを表します。 /etc/cgrules.confファイルのエントリには、次の追加の表記を含めることができます。

  • @ —個々のユーザーではなくグループを示します。 たとえば、@adminは、管理者グループのすべてのユーザーを示します。
  • * —「すべて」を表します。 たとえば、ユーザーフィールドの*は、すべてのユーザーを表します。
  • % —上の行のアイテムと同じアイテムを表します。

次に、制限したいプログラム/プロセスを追加しましょう。 /etc/cgrules.confを編集し、下部に以下を追加します。

/etc/cgrules.conf

*:firefox       cpu,memory      browsers/
*:hdparm        blkio   limitio/
sammy   blkio   limitio/
@admin:memhog  memory  limitmem/
*:cpuhog        cpu     limitcpu/

上記の行では、次のルールを設定しています。

  • すべてのユーザーが実行するfirefoxプロセスは、browsers cgroupに自動的に追加され、CPUおよびメモリサブシステムに制限されます。
  • 任意のユーザーによって実行されるhdparmプロセスは、limitio cgroupに追加され、そのcgroupで指定されたパラメーター値に従ってblkioサブシステムで制限されます。
  • ユーザーsammyによって実行されるすべてのプロセスは、limitio cgroupに追加され、blkioサブシステムに制限されます。
  • memhogプロセスはadminグループの誰かによって実行され、cgroup limitmemに追加され、メモリサブシステムに制限されます。
  • 任意のユーザーによって実行されるcpuhogプロセスは、cgroup limitcpuに追加され、cpuサブシステムに制限されます。

cgrules構成の変更を有効にするには、cgredサービスを開始する必要があります。これを行うには、次のコマンドを使用します。

sudo service cgred start

また、cgredサービスがシステムの起動時に開始できるようになっていることを確認して、再起動後もルールが保持されるようにする必要があります。

sudo chkconfig cgred on

注: sysconfigをサポートするサービスの場合、cgrules.confファイルを編集する代わりに、/etc/sysconfig/servicenameに変数CGROUP_DAEMON="subsystem:control_group"を追加できます。 たとえば、httpdのようなサービスの場合、CGROUP_DAEMON="blkio:/limitio"をファイル/etc/sysconfig/httpd.confに追加して、httpdプロセスをlimitiocgroupに追加できます。


ステップ4—テスト

このステップでは、cgrules.confで追加したルールに従って、2MiB/sのディスク読み取りスループット制限が正しく適用されていることを確認します。 これを行うには、hdparmツールをインストールして実行します。 hdparmツールは、ハードディスクドライブのハードウェアパラメータの設定と表示、読み取りと書き込みの速度の測定などを行うことができます。 以下を使用してhdparmをインストールしましょう:

sudo yum install hdparm

次に、ハードディスク/ dev/vdaの読み取り速度を測定するコマンドを実行してみましょう。

sudo hdparm --direct -t /dev/vda

次の出力が表示されます。

/dev/vda:
 Timing O_DIRECT disk reads:   6 MB in  3.00 seconds =   2.00 MB/sec

出力は、2MB/秒のディスク読み取りスループットを示しています。 cgconfigサービスとcgredサービスの両方を停止し、上記のhdparmコマンドをもう一度実行すると、cgroupルールが実装されていないときの元の/デフォルトの読み取り速度を確認できます。

結論

このチュートリアルでは、cgroupで実行できる基本的なことの一部のみを紹介します。 サブcgroupを作成したり、cgroupによって消費されたリソースの量をカウントして報告したり、freezerサブシステムを使用してプロセスのグループを一時停止したりすることもできます。

詳細については、次のリソースを確認してください。