私のcgroupに過負荷がかかりましたか?

私のcgroupに過負荷がかかりましたか?

cgroup / cpusetオプションで使用できるプロセスセットのコアを制限するとします。

このcgroupに割り当てられたスレッドが多すぎるか、スレッドが使用可能なコアに対して過度の競合を経験しているかどうかを知る必要があります。

どうすればいいですか?

cgroupupがない場合は、負荷平均を使用します。経験的に、負荷平均はtopコア数より小さくなければなりません。 cgroup / cpusetを考えると、似たようなことがありますか?

答え1

特定の問題に応じて、2つのオプションがあります。

「ロード平均」ではなく、cgroup内のスレッド/プロセス数に興味がある場合:

taskscgroupファイルの行数を数えます。このファイルは、スレッドまたはプロセスがcgroupで作成または削除されるたびに自動的に更新されます。

実際の活用に興味がある場合:

これは少しトリッキーです。tasks上記のファイルからcgroupのプロセス/スレッドのリストを取得してから、各PIDの使用量を確認できますが、/procこのアプローチでは競合状態が高く、競合スポーツで収益を上げることができます。または、バージョン2のcgroupを使用している場合は、cpu.statcgroupのファイルを調べることができます。ファイルには cgroup で消費する CPU 時間のマイクロ秒数を計算する複数行があるため、毎秒 2 回確認してその差を 10000 で割って使用率を得ることができます (コア 1 を 100% 全体使用する場合、全体使用率は2つのコアは20%です。 cpuacctコントローラーを持つcgroupのうち、バージョン1を使用して同様のアプローチを実行できます(cpusetコントローラーの下に作成したcgroupをミラーリングするそのコントローラーの下にcgroupを作成します)。

答え2

プロセスを実行するcgroupの負荷平均を計算するための簡単なスクリプトを作成しました。

$ cat loadavg-cgroup.sh
#!/bin/bash

sample_time=${1:-1} # in seconds
sample_count=${2:-10}
sleep_time="$(echo "scale=2 ; ${sample_time}/${sample_count}" | bc)"

cgroup=$(grep '^2:cpu:' /proc/$$/cgroup)
export cgroup

{
        for _ in $(seq 1 "${sample_count}" ) ; do
                # note, for cgroup v2 use newest pgrep
                ps -eLo cgroup,stat | grep "${cgroup}" | grep ' R[l+]*$' --count
                sleep "${sleep_time}"
        done
} \
| awk '{ sum+=$1 } END { print (sum/NR) - 1 } ' 

使用法:

# To calculate load average for period of 10 seconds
$ ./loadavg-cgroup.sh 10
1.6

コメント:

  • サンプリング時間とサンプル数は、それぞれ最初と2番目のパラメータでパラメータ化されます。
  • これは私のWSL2環境にあるcgroups v1用です。
  • 最新バージョンはpgrepcgroup検索でも機能するため、ps + grep + grepトリオよりも使用する方が良いです。
  • ps負荷平均に含まれない
  • プロセスがcgroupにない場合は機能しませんが、調整するのは非常に簡単です。

関連情報