Linux

  
でCPUリソースを管理するためのcgroupsの使い方

これまでの紹介で、Linuxのcgroupsを使ってCPUリソースを制限できることを学びました。次の小シリーズでは、Linuxでcgroupを使用してCPUリソースを制限する方法を紹介します。

この時間は、CPUリソースのcgroupを管理する方法について話をします。制御プロセスのCPU使用について話しましょう。 1つのマシン上で多くのリソースを消費する可能性がある複数のプログラムを実行する場合、プログラムがすべてのリソースを占有し、他のプログラムが正しく実行されなかったり、システムが維持されなくなったりしたくありません。この時点で、cgroupを使用してプロセスのリソース消費を制御できます。これがcpuリソースです。

cgroupsでは、cpu.cfs_period_usとcpu.cfs_quota_usを使用して、グループ内のすべてのプロセスが単位時間あたりに使用できるCPU時間を制限できます。ここでcfsはFull Fair Schedulerの略です。 Cpu.cfs_period_usは期間で、デフォルトは100000、つまり100ミリ秒です。 Cpu.cfs_quota_usは、この期間中に使用できるCPU時間で、デフォルトは-1です。

CPUを消費するプログラムの実行

コードは次のとおりです。

#echo‘ while True:pass’ Python&

[1] 1532

トップこのプロセスのcpuコードの100%が、次のようになっていることがわかります。

PID USER PR NI VIRT RES SHR S%CPU%MEMORY + COMMAND

1532 root 20 0 112m 3684 1708 R 99.6 0.7 0:30.42 python

。 。 。

次に来て、プロセスを制限します。最初に/foo制御グループの制限を変更してから、プロセスを追加してください。

コードは以下のとおりです。

echo 50000》 /sys/fs/cgroup/cpu/foo/cpu.cfs_quota_us

echo 1532》 /sys /fs /group /cpu /Foo /tasks

cgroupにプロセスを追加するには、タスクファイルにpidを書きます。ここでは、cpu.cfs_quota_usが50000に設定されています。これは、cpu.cfs_period_usに対して50%または50%です。それから効果を見てください。

コードは次のとおりです。

PIDユーザーPR NI VIRT RES SHR S%CPU%メンバー時間+コマンド

1532 root 20 0 112m 3684 1708 R 50.2 0.7 5:00.31 python < Br> <p>。 。 。

ご覧のとおり、プロセスのCPU使用率は50%に制限されています。ここでは、テスト対象の仮想マシンにコアが1つだけあります。マルチコアの場合、表示される値は異なります。さらに、cfs_quota_usはcfs_period_usよりも大きくなる可能性があります。これは主にマルチコアの場合です。コア数がnの場合、1つの制御グループ内のプロセスは、当然CPU時間のn倍まで使用できます。

これら2つの値はcgroups階層内で制限されており、基礎となるリソースは上限レベルを超えることはできません。具体的には、下位層のcpu.cfs_period_usの値を上位層の値より小さくすることはできず、cpu.cfs_quota_usの値を上位層の値より大きくすることはできません。

cpu.rt_period_us、cpu.rt_runtime_usのもう1つのセットはリアルタイムプロセス制限に対応します。通常は使用する機会がありません。

cpuサブシステムでは、cpu.statは前の方法で行われたリソース制限の統計です。 Nr_periods、nr_throttledは、合計で経過したサイクル、およびそれらが制限される期間です。 throttled_timeは、制御グループによって失われた合計CPU使用時間です。

cpu.sharesもあります。これはcpuの使用を制限するためにも使用されます。しかし、cpu.cfs_quota_usとcpu.cfs_period_usには大きな違いがあります。 Cpu.sharesは、プロセスが使用できる絶対CPU時間を制限するのではなく、グループ間のクォータを制御するためのものです。たとえば、

コードは次のようになります。

/cpu/cpu.shares:1024

/cpu/foo/cpu.shares:2048

グループ内のプロセスが最大容量で実行されている場合、/foo内のプロセスは/内のプロセスの2倍のCPUを占有します。 /foo /barを構築した場合、cpu.sharesも1024で、全容量で実行されているプロセスもある場合、/、/foo、/foo /bar cpuの占有率は1:2:1です。前のものはそれぞれが一杯になっている状況についてです。他の制御グループ内のプロセスがアイドル状態の場合、特定のグループのプロセスはすべてのCPUを完全に使用できます。通常の状況下では、この方法は公平性を確保しながらリソースを最大限に活用できることがわかります。

さらに、プロセスで使用できるCPUコアを制限できます。 cpusetサブシステムは、処理プロセスやその他の関連構成で使用できるcpuコアおよびメモリノードです。このセクションの設定の多くはNUMAに関連しています。 cpuset.cpusの中で、cpuset.memsはプロセスが使用できるCPUコアとメモリノードを制限するために使用されます。これら2つのパラメータのCPUコアとメモリノードは、「l」、「r」で区切られたidで表されます。たとえば、0、1、2です。 0〜3などの範囲を示すために' - 'を使用することもできます。両方を組み合わせることができます。 「0-2,6,7」のように。プロセスを追加する前に、cpuset.cpusとcpuset.memsを同時に設定し、互換性を保つ必要があります。そうしないと、エラーが発生します。たとえば、

コードは次のとおりです。

#echo 0》 /sys/fs/cgroup/cpuset/foo/cpuset.cpus

#echo 0》 /sys /fs /cgroup /cpuset/foo/cpuset.mems

したがって、/foo内のプロセスはcpu0とメモリノード0のみを使用できます。次のように

コードを使用します。

#cat /proc /"pid" /status Grep‘ _allowed_list’

で効果を確認できます。

リソース使用量を制限することに加えて、cgroupsにはリソースを数える機能もあります。クラウドコンピューティングの請求に使用できます。 cpuリソース統計専用のcpuacctサブシステムがあります。 Cpuacct.statは、コントロールグループ内のプロセスユーザーモードとカーネルモードのCPU使用率をカウントします単位はUSER_HZ、つまりjiffyとcpu tickです。 1秒あたりのティック数はgetconf CLK_TCKで取得できます。これは通常100です。表示されている値をこの値で除算すると、秒になります。

cpuacct.usageおよびcpuacct.usage_percpuは、この制御グループ内のプロセスによって消費されたCPU時間(ナノ秒単位)です。後者はcpu統計に分けられます。

PS 2014-4-22

SLES 11、sp2、sp3、対応するカーネルバージョン3.0.13、3.0.76、cpuサブシステムの場合、cgroup.procsにpidを書き込みます実際には効力を発揮しないでしょう。タスクを書いても大丈夫です。他の環境では、それ以降のバージョンまたはそれ以下のカーネルは見つかりません。

上記はLinuxでcgroupリソースを制御するためにcgroupを使用する方法です。 CPUリソースを制御し、試してみてください。

Copyright © Windowsの知識 All Rights Reserved