cgroup / cpusetオプションで使用できるプロセスセットのコアを制限するとします。
このcgroupに割り当てられたスレッドが多すぎるか、スレッドが使用可能なコアに対して過度の競合を経験しているかどうかを知る必要があります。
どうすればいいですか?
cgroupupがない場合は、負荷平均を使用します。経験的に、負荷平均はtop
コア数より小さくなければなりません。 cgroup / cpusetを考えると、似たようなことがありますか?
答え1
特定の問題に応じて、2つのオプションがあります。
「ロード平均」ではなく、cgroup内のスレッド/プロセス数に興味がある場合:
tasks
cgroupファイルの行数を数えます。このファイルは、スレッドまたはプロセスがcgroupで作成または削除されるたびに自動的に更新されます。
実際の活用に興味がある場合:
これは少しトリッキーです。tasks
上記のファイルからcgroupのプロセス/スレッドのリストを取得してから、各PIDの使用量を確認できますが、/proc
このアプローチでは競合状態が高く、競合スポーツで収益を上げることができます。または、バージョン2のcgroupを使用している場合は、cpu.stat
cgroupのファイルを調べることができます。ファイルには 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用です。
- 最新バージョンは
pgrep
cgroup検索でも機能するため、ps + grep + grepトリオよりも使用する方が良いです。 ps
負荷平均に含まれない- プロセスがcgroupにない場合は機能しませんが、調整するのは非常に簡単です。