Product SiteDocumentation Site

第3章 サブシステムと調整可能なパラメータ

3.1. blkio
3.1.1. 比例ウェイト分割の設定オプション
3.1.2. I/O スロットリングの設定オプション
3.1.3. 共通の設定オプション
3.1.4. 使用例
3.2. cpu
3.3. cpuacct
3.4. cpuset
3.5. devices
3.6. freezer
3.7. memory
3.8. net_cls
3.9. ns
3.10. その他のリソース
Subsystems とは、cgroup を認識するカーネルモジュールで、通常は、異なるレベルのシステムリソースを異なる cgroup に割り当てるリソースコントローラです。ただし、サブシステムは、プロセスグループによって異なった扱いをする必要がある場合に、カーネルとのその他のインタラクション用にプログラムすることも可能です。新規サブシステムを開発するための アプリケーションプログラミングインターフェース (API) については、ご使用のシステムの /usr/share/doc/kernel-doc-kernel-version/Documentation/cgroups/ にインストールされているカーネルの文書 cgroups.txt (kernel-doc パッケージにより提供) に記載されています。cgroup に関するドキュメントの最新バージョンは、オンラインでもご覧いただけます: http://www.kernel.org/doc/Documentation/cgroups/cgroups.txt。ただし、最新版のドキュメントに記載されている機能は、ご使用のシステムにインストールされているカーネルで利用可能な機能と一致しない場合がある点に注意してください。
cgroup 用のサブシステムパラメータを含んでいる 状態オブジェクト (State object) は cgroup の仮想ファイルシステム内で 疑似ファイル (pseudofiles)として表示されます。これらの疑似ファイルは、シェルコマンドまたはそれに相当するシステムコールで操作することができます。例えば、cpuset.cpus は、cgroup によるアクセスが許可されている CPU を指定する疑似ファイルです。システム上で稼働する Web サーバー用の cgroup が /cgroup/cpuset/webserver である場合には、以下のコマンドを実行してください。
~]# echo 0,2 > /cgroup/cpuset/webserver/cpuset.cpus
上記のコマンドは、0,2 の値を cpuset.cpus 疑似ファイルに書き込むことにより、/cgroup/cpuset/webserver/tasks に記載されている PID のタスクがシステム上の CPU 0 と CPU 2 のみを使用するように限定します。

3.1. blkio

ブロック I/O (blkio) サブシステムは、cgroup 内のタスクによる、ブロックデバイス上の I/O へのアクセスを制御・監視します。これらの疑似ファイルに値を書き込むと、アクセスまたは帯域幅が限定され、またこれらの疑似ファイルから値を読み取ると、I/O 操作についての情報が提供されます。
blkio サブシステムは I/O へのアクセスを制御するために2つのポリシーを提供します:
  1. 比例ウェイト分割 — Completely Fair Queuing I/O スケジューラーにおいて実装されました、このポリシーによりウェイトを特定の cgroups に設定できます。各 cgroup はすべての予約された I/O 操作のセットパーセンテージ(cgroup のウェイトに依存します)を持つことを意味します。詳細は「比例ウェイト分割の設定オプション」を参照してください。
  2. I/O スロットリング (上限) — 特定のデバイスにより実行される I/O 操作数に対する上限を設定するために使用されます。デバイスは読み込みまたは書き込み操作の制限された割合を持てることを意味します。詳細は「I/O スロットリングの設定オプション」を参照してください。

バッファーされた書き込み操作

現在、ブロック I/O サブシステムはバッファーされた書き込み操作に対して機能しません。これは主に直接 I/O に照準を合わせていますが、バッファーされた読み込み操作に対して機能します。

3.1.1. 比例ウェイト分割の設定オプション

blkio.weight
デフォルトで cgroup に提供される ブロック I/O アクセスの相対的比率 (ウェイト) を 100 から 1000 の範囲内で指定します。この値は、特定のデバイスに対して、blkio.weight_device パラメータによってオーバーライドされます。例えば、ブロックデバイスにアクセスするためのデフォルトのウェイト 500 を cgroup に割り当てるには、以下のコマンドを実行します。
echo 500 > blkio.weight
blkio.weight_device
特定のデバイス上で cgroup に提供される IO アクセスの相対的比率 (ウェイト) を 100 から 1000 の範囲内で指定します。このパラメータの値は、指定したデバイスの blkio.weight パラメータの値をオーバーライドします。これらの値は、major:minor weight という形式と取り、majorminor は、http://www.kernel.org/doc/Documentation/devices.txt から入手可能な Linux Allocated Devices (別名 Linux Devices List) で指定されているデバイスタイプとノード番号となります。例えば、cgroup による /dev/sda へのアクセスに 500 のウェイトを割り当てるには、以下のコマンドを実行します。
echo 8:0 500 > blkio.weight_device
Linux Allocated Devices の表記では、8:0/dev/sda を示します。
blkio.time
cgroup が特定のデバイスに I/O アクセスを行った時間をレポートします。エントリは、majorminor、および time の 3 つのフィールドで構成されます。majorminorLinux Allocated Devices で指定されているデバイスタイプとノード番号、また time はミリ秒 (ms) 単位の時間です。
blkio.sectors
cgroup により、特定のデバイスとの間で転送されたセクターの数をレポートします。エントリは、majorminor、および sectors の 3 つのフィールドで構成されます。majorminorLinux Allocated Devices で指定されているデバイスタイプとノード番号、また sectors はセクター数です。
blkio.io_serviced
特定のデバイス上で cgroup によって実行された I/O 操作の回数をレポートします。エントリはmajorminoroperation、および bytes の 4 つのフィールドで構成されます。majorminorLinux Allocated Devices で指定されているデバイスタイプとノード数で、operation は操作のタイプ (readwritesync、または async)、number は操作回数を示します。
blkio.io_service_bytes
CFQスケジューラーにより見えるように、cgroup により特定のデバイス上で転送されたバイト数をレポートします。エントリは、majorminoroperation、および bytes の 4 つのフィールドで構成されます。majorminor は、Linux Allocated Devices で指定されているデバイスタイプとノード番号です。operation は操作のタイプ (readwritesync、または async) です。bytes は転送されたバイト数です。
blkio.io_service_time
cgroup により特定のデバイス上で行われる I/O 操作の要求がディスパッチされてから完了するまでの合計時間をレポートします。エントリは、majorminoroperation、および bytes の 4 つのフィールドで構成されます。majorminor は、Linux Allocated Devices で指定されているデバイスタイプとノード番号です。operation は操作のタイプ (readwritesync、または async)、time は時間をナノ秒 (ns) 単位で示します。時間は、大きな単位ではなく、ナノ秒単位でレポートされるため、ソリッドステートのデバイスでもレポートが有意となります。
blkio.io_wait_time
スケジューラキュー内のサービスを待つのに費した、cgroup による 特定のデバイス上の I/O 操作の合計時間をレポートします。このレポートを解析する際には、以下の点に注意してください。
  • レポートされる時間は、cgroup 自体が I/O 操作を待つのに費した時間ではなく、cgroup の全 I/O 操作の累計であるため、経過時間の合計よりも長い場合があります。グループ全体として費した待ち時間を確認するには、blkio.group_wait_time を使用します。
  • デバイスに queue_depth > 1 がある場合は、レポートされる時間には、デバイスが要求を並べ替える間に費した待ち時間ではなく、要求がデバイスにディスパッチされるまでの時間のみが含まれます。
エントリは、majorminoroperation、および time の 4 つのフィールドで構成されます。majorminor は、Linux Allocated Devices で指定されているデバイスタイプとノード番号です。operation は、操作のタイプ (readwritesync、または async)、time はナノ秒 (ns) 単位の時間を示します。時間は、大きな単位ではなく、ナノ秒単位でレポートされるため、ソリッドステートのデバイスでもレポートが有意となります。
blkio.io_merged
cgroup により、I/O 操作要求にマージされた、BIOS 要求数をレポートします。エントリは numberoperation の 2 つのフィールドで構成されます。number は、要求数、operation は操作のタイプ (readwritesync、または async) を示します。
blkio.io_queued
cgroupt により、I/O 操作のキューに入れられた要求の数をレポートします。エントリは、numberoperation の 2 つのフィールドで構成されます。number は、要求数、operation は操作のタイプ (readwritesync、または async) を示します。
blkio.avg_queue_size
グループ存在の全時間にわたる、cgroup による I/O 操作の平均キューサイズをレポートします。キューサイズは、この cgroup がタイムスライスを取得する度にサンプリングされます。このレポートは、システム上で CONFIG_DEBUG_BLK_CGROUP=y が設定されている場合のみ利用可能である点に注意してください。
blkio.group_wait_time
cgroup が一つのキューで費した待ち時間の合計を (ナノ秒単位 — ns で) レポートします。レポートは、この cgroup がタイムスライスを取得する度に更新されるので、cgroup がタイムスライスを待っている間にこの疑似ファイルを読んだ場合には、現在キューに入っている操作を待つのに費した時間は含まれません。このレポートは、システム上でCONFIG_DEBUG_BLK_CGROUP=y が設定されている場合のみ利用可能である点に注意してください。
blkio.empty_time
cgroup が保留中の要求なしに費した時間の合計を (ナノ秒単位 — ns で) レポートします。レポートは、保留中の要求がこの cgroup のキューに入る度に更新されるので、cgroup に保留中の要求がない時に疑似ファイルを読んだ場合には、現在の空の状態で費した時間はレポートには含まれません。このレポートは、システム上で CONFIG_DEBUG_BLK_CGROUP=y が設定されている場合のみ利用可能である点に注意してください。
blkio.idle_time
すでにキューに入っている別の要求や別のグループからの要求よりも高い要求に備えて、cgroup に対してスケジューラがアイドリング状態で費した時間の合計を (ナノ秒単位 — ns で) レポートします。レポートは、グループがアイドリング状態でなくなった時点で毎回更新されるため、cgroup がアイドリング状態の間にこの疑似ファイルを読んだ場合には、現在のアイドリング状態で費した時間はレポートには含まれません。このレポートは、システム上で CONFIG_DEBUG_BLK_CGROUP=y が設定されている場合のみ利用可能である点に注意してください。
blkio.dequeue
cgroup が I/O 操作を要求した回数をレポートします。エントリは、majorminor、および number の 3 つのフィールドで構成されます。majorminor は、Linux Allocated Devices で指定されているデバイスタイプとノード番号です。number は、グループがキューから削除された要求の回数です。このレポートは、システム上で CONFIG_DEBUG_BLK_CGROUP=y が設定されている場合のみ利用可能である点に注意してください。

3.1.2. I/O スロットリングの設定オプション

blkio.throttle.read_bps_device
デバイスが実行できる読み込み操作数の上限を指定します。読み込み操作の割合は秒あたりのバイト数で指定します。エントリは3つの項目を持ちます: majorminor、および bytes_per_secondmajorminor は、Linux Allocated Devices で指定されているデバイスタイプとノード番号となります。また bytes_per_second読み込み操作が実行できる上限の割合です。例えば、/dev/sda デバイスが最大 10 MBps で読み込み操作を実行できるようにするには、以下のコマンドを実行します:
~]# echo "8:0 10485760" > /cgroups/blkio/test/blkio.throttle.read_bps_device
blkio.throttle.read_iops_device
デバイスが実行できる読み込み操作数の上限を指定します。読み込み操作の割合は秒あたりの操作回数で指定します。エントリは3つの項目を持ちます: majorminor、およびoperations_per_secondmajorminorLinux Allocated Devices で指定されているデバイスタイプとノード番号となります。また operations_per_second読み込み操作が実行できる上限の割合です。例えば、/dev/sda デバイスが秒あたり最大 10 回の読み込み操作を実行できるようにするには、以下のコマンドを実行します:
~]# echo "8:0 10" > /cgroups/blkio/test/blkio.throttle.read_iops_device
blkio.throttle.write_bps_device
デバイスが実行できる書き込み操作数の上限を指定します。書き込み操作の割合は秒あたりのバイト数で指定します。エントリは3つの項目を持ちます: majorminor、および bytes_per_secondmajorminor は、Linux Allocated Devices で指定されているデバイスタイプとノード番号となります。また bytes_per_second書き込み操作が実行できる上限の割合です。例えば、/dev/sda デバイスが最大 10 MBps で書き込み操作を実行できるようにするには、以下のコマンドを実行します:
~]# echo "8:0 10485760" > /cgroups/blkio/test/blkio.throttle.write_bps_device
blkio.throttle.write_iops_device
デバイスが実行できる書き込み操作数の上限を指定します。書き込み操作の割合は秒あたりの操作回数で指定します。エントリは3つの項目を持ちます: majorminor、およびoperations_per_secondmajorminorLinux Allocated Devices で指定されているデバイスタイプとノード番号となります。また operations_per_second書き込み操作が実行できる上限の割合です。例えば、/dev/sda デバイスが秒あたり最大 10 回の書き込み操作を実行できるようにするには、以下のコマンドを実行します:
~]# echo "8:0 10" > /cgroups/blkio/test/blkio.throttle.write_iops_device
blkio.throttle.io_serviced
特定のデバイス上で cgroup によって実行された I/O 操作の回数をスロットリングのポリシーにより見られるようにレポートします。エントリはmajorminoroperation、および number の 4 つのフィールドで構成されます。majorminorLinux Allocated Devices で指定されているデバイスタイプとノード数で、operation は操作のタイプ (readwritesync、または async)、number は操作回数を示します。
blkio.throttle.io_service_bytes
cgroup により特定のデバイス上で転送されたバイト数をレポートします。blkio.io_service_bytesblkio.throttle.io_service_bytes\n の唯一の違いは、CFQ スケジューラーが要求キューにおいて実行しているときに前者は更新されないことです。エントリは、majorminoroperation、および bytes の 4 つのフィールドで構成されます。majorminor は、Linux Allocated Devices で指定されているデバイスタイプとノード番号です。operation は操作のタイプ (readwritesync、または async) です。bytes は転送されたバイト数です。

3.1.3. 共通の設定オプション

以下の設定オプションは「blkio」に一覧化されているポリシーのいずれかのために使用されます。
blkio.reset_stats
その他の疑似ファイルに記録されている統計をリセットします。この cgroup の統計をリセットするには、このファイルに整数を書き込みます。

3.1.4. 使用例

さまざまな blkio.weight 値を持つ2つの異なる cgroups において2つの dd スレッドを実行するという簡単なテストは例3.1「blkio 比例ウェイト分割」を参照してください。
例3.1 blkio 比例ウェイト分割
  1. blkio サブシステムをマウントします:
    ~]# mount -t cgroup -o blkio blkio /cgroup/blkio/
    
  2. blkio サブシステムに対するう2つの cgroups を作成します:
    ~]# mkdir /cgroup/blkio/test1/
    ~]# mkdir /cgroup/blkio/test2/
    
  3. 前に作成した cgroups にさまざまな blkio ウェイトを設定します:
    ~]# echo 1000 > /cgroup/blkio/test1/blkio.weight
    ~]# echo 500 > /cgroup/blkio/test2/blkio.weight
    
  4. 2つの大きなファイルを作成します:
    ~]# dd if=/dev/zero of=file_1 bs=1M count=4000
    ~]# dd if=/dev/zero of=file_2 bs=1M count=4000
    
    上のコマンドは容量 4 GB の2つのファイル (file_1file_2) を作成します。
  5. 各テスト cgroups に対して、ある大きなファイルにおいて(ファイルの内容を読み込んでヌルデバイスに出力する) dd コマンドを実行します:
    ~]# cgexec -g blkio:test1 time dd if=file_1 of=/dev/null
    ~]# cgexec -g blkio:test2 time dd if=file_2 of=/dev/null
    
    どちらのコマンドも、完了すると、かかった時間を表示します。
  6. 同時に2つの dd スレッドを実行すると、iotop ユーティリティによりリアルタイムにパフォーマンスをモニターできます。iotop ユーティリティをインストールするには、root として yum install iotop コマンドを実行します。以下は先ほど開始した dd スレッドを実行中に \niotop ユーティリティで見られるような出力例です:
    Total DISK READ: 83.16 M/s | Total DISK WRITE: 0.00 B/s
        TIME  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
    15:18:04 15071 be/4 root       27.64 M/s    0.00 B/s  0.00 % 92.30 % dd if=file_2 of=/dev/null
    15:18:04 15069 be/4 root       55.52 M/s    0.00 B/s  0.00 % 88.48 % dd if=file_1 of=/dev/null
    

例3.1「blkio 比例ウェイト分割」において最も正確な結果を得るためには、dd コマンドを実行する前に、以下のコマンドを使用してすべてのファイルシステムバッファーと空きページキャッシュ、dentry および inode をフラッシュします:
~]# sync
~]# echo 3 > /proc/sys/vm/drop_caches
加えて、スループットの消費においてグループ間でより強力な分離を提供する、グループ分離 (group isolation) を有効にできます。グループ分離が無効化されるとき、公平性は連続的な作業負荷に対してのみ期待できます。デフォルトで、グループ分離は有効化されていて、公平性はランダム I/O に対しても同様に期待できます。グループ分離を有効化するには、以下のコマンドを使用します:
~]# echo 1 > /sys/block/<disk_device>/queue/iosched/group_isolation
ここで <disk_device> 希望するデバイスの名前を意味します。例えば sda です。