CentOS6でcgroupsを使用してリソースを制限する方法
ステータス:非推奨
この記事では、サポートされなくなったバージョンのCentOSについて説明します。 現在CentOS6を実行しているサーバーを運用している場合は、サポートされているバージョンのCentOSにアップグレードまたは移行することを強くお勧めします。
理由:
代わりに参照:このガイドは参照として役立つ場合がありますが、他のCentOSリリースでは機能しない場合があります。 可能な場合は、使用しているCentOSのバージョン用に作成されたガイドを使用することを強くお勧めします。
序章
コントロールグループ(cgroups)は、CentOS 6で導入されたカーネル機能であり、プロセスのシステムリソースへのアクセスを制限する新しい方法を提供します。 独自のcgroupを作成したり、構成したcgroupを監視したり、特定のリソースへのcgroupのアクセスを拒否したり、実行中のシステムでcgroupを動的に再構成したりすることもできます。
このチュートリアルでは、プロセスのCPU、メモリ、およびディスクI/Oを制限する方法を説明します。 これを実現するために、最初にいくつかのコントロールグループを作成し、それらにプロセスを追加して、それらがどのように実行されるかを確認します。
前提条件
このチュートリアルを開始する前に、CentOS6ドロップレットでsudoを設定したroot以外のユーザーが必要です。 このタイプのユーザーをセットアップするには、 CentOS6を使用したサーバーの初期セットアップチュートリアルに従ってください。 すべてのコマンドはこのユーザーとして実行されます。
ステップ1—インストール
このセクションでは、cgroupsが機能するために必要なパッケージをインストールします。
コントロールグループとそれらが関連するサブシステムは、シェルコマンドとユーティリティを使用して操作できます。 ただし、cgroupsを操作する最も簡単な方法は、 libcgroup
パッケージ。 The libcgroup
パッケージは、cgroups関連のコマンドラインユーティリティ、設定ファイル、およびマニュアルページを提供します。 このパッケージは、デフォルトではCentOS6サーバーにインストールされていません。 これをインストールするには、次のコマンドを実行します。
- sudo yum install libcgroup
ステップ2—サービスを開始する
The cgconfig
(コントロールグループ構成)サービスは、cgroupの作成とサブシステムの管理に使用されます。 起動時に起動し、事前定義されたcgroupを再確立するように構成できるため、再起動後も永続的になります。 The 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をいくつか作成しましょう。 The /etc/cgconfig.conf
ファイルには、2つの主要なタイプのエントリが含まれています— mount
と group
. で始まる行 group
cgroupsを作成し、サブシステムパラメーターを設定します。 ファイルを編集する /etc/cgconfig.conf
下部に次のcgroupエントリを追加します。
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に制限しています。
再起動する必要があります cgconfig
の変更のためのサービス /etc/cgconfig.conf
有効にするファイル:
- 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
(コントロールグループルールエンジンデーモン)は、で設定されたパラメータに従ってタスクをcgroupに移動するサービスです。 /etc/cgrules.conf
ファイル。 のエントリ /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
下部に以下を追加します。
*: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サブシステムで制限されています。
開始する必要があります cgred
cgrules構成変更のサービスを有効にするには、次のコマンドを使用してこれを実行します。
- sudo service cgred start
また、 cgred
サービスはシステムの起動時に開始できるようになっているため、再起動後もルールは保持されます。
- sudo chkconfig cgred on
注: sysconfigをサポートするサービスの場合、変数を追加できます CGROUP_DAEMON="subsystem:control_group"
の /etc/sysconfig/servicename
編集する代わりに cgrules.conf
ファイル。 たとえば、httpdのようなサービスの場合、次のように追加できます。 CGROUP_DAEMON="blkio:/limitio"
ファイルに /etc/sysconfig/httpd.conf
httpdプロセスをに追加するには limitio
cgroup。
ステップ4—テスト
このステップでは、2MiB / sのディスク読み取りスループット制限が、追加したルールに従って正しく適用されていることを確認します。 cgrules.conf
. これを行うには、をインストールして実行します hdparm
道具。 The 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サブシステムを使用してプロセスのグループを一時停止したりすることもできます。
詳細については、次のリソースを確認してください。