CentOS6でcgroupsを使用してリソースを制限する方法
ステータス:非推奨
この記事では、サポートされなくなったバージョンの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
ファイルには、mount
とgroup
の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
グループの誰かによって実行され、cgrouplimitmem
に追加され、メモリサブシステムに制限されます。 - 任意のユーザーによって実行される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プロセスをlimitio
cgroupに追加できます。
ステップ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サブシステムを使用してプロセスのグループを一時停止したりすることもできます。
詳細については、次のリソースを確認してください。