CentOS 6でcgroupを使用してリソースを制限する方法

前書き

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

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

前提条件

このチュートリアルを始める前に、CentOS 6 Dropletでsudoをセットアップした非rootユーザーが必要です。 このタイプのユーザーをセットアップするには、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-6 [CentOS 6での初期サーバーセットアップ]チュートリアルに従ってください。 すべてのコマンドはこのユーザーとして実行されます。

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

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

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

sudo yum install libcgroup

ステップ2-サービスの開始

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

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 *-このサブシステムは、cgroup内のタスクに個々のCPU(マルチコアシステム)とメモリノードを割り当てます

  • * 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のセットであり、システム内のすべてのタスクは、階層内のcgroupの1つに含まれます。 デフォルトのCentOS 6構成では、各サブシステムは独自の階層に配置されます。

最初に、limitcpu、limitmem、limitio、およびbrowsersという名前のいくつかのcgroupを作成します。 + / etc / cgconfig.conf`ファイルには、2つの主要なタイプのエントリ- + mount`と `+ group `が含まれています。 ` 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

or

user:command subsystems control_group

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

  • + @ +-個々のユーザーではなくグループを示します。 たとえば、 `+ @ admin +`は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サブシステムで制限されます。

  • `+ admin `グループのすべてのユーザーが実行する* memhog *プロセスは、cgroup ` limitmem +`に追加され、メモリサブシステムで制限されます。

  • 任意のユーザーが実行する* cpuhog *プロセスはcgroup `+ limitcpu +`に追加され、cpuサブシステムで制限されます。

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

sudo service cgred start

また、システムのブート時に `+ cgred +`サービスが有効になり、再起動後もルールが維持されるようにする必要があります。

sudo chkconfig cgred on

ステップ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 / sのディスク読み取りスループットを示しています。 `+ cgconfig `サービスと ` cgred `サービスの両方を停止し、上記の ` hdparm +`コマンドをもう一度実行すると、cgroupルールが実装されなかったときの元の/デフォルトの読み取り速度を確認できます。

結論

このチュートリアルでは、cgroupで実行できる基本的なことの一部のみを紹介します。 サブcgroupの作成、cgroupが消費するリソースの数のカウントとレポート、* freezer *サブシステムを使用したプロセスのグループの一時停止なども可能です。

詳細については、次のリソースをご覧ください。