cgroup/cpuset 옵션과 함께 사용할 수 있는 프로세스 집합의 코어를 제한한다고 가정해 보겠습니다.
이 cgroup에 할당된 스레드가 너무 많은지, 스레드가 사용 가능한 코어에 대해 과도한 경합을 겪고 있는지 알아야 합니다.
어떻게 해야 하나요?
cgroupup이 없으면 로드 평균을 사용합니다. 경험상 로드 평균은 top
코어 수보다 작아야 합니다. cgroup/cpuset을 고려하면 비슷한 것이 있습니까?
답변1
특정 문제에 따라 두 가지 옵션이 있습니다.
"로드 평균"이 아닌 cgroup에 있는 스레드/프로세스 수에 관심이 있는 경우:
tasks
cgroup 파일의 줄 수를 세어보세요. 이 파일은 스레드나 프로세스가 cgroup에서 생성되거나 삭제될 때마다 자동으로 업데이트됩니다.
실제 활용도에 관심이 있는 경우:
이것은 약간 까다롭습니다. tasks
위 파일에서 cgroup의 프로세스/스레드 목록을 가져온 다음 를 사용하여 각 PID의 사용량을 확인할 수 있지만 /proc
이 접근 방식에는 경쟁 조건이 많아 경쟁 스포츠로 수익을 창출할 수 있습니다. 또는 버전 2 cgroup을 사용하는 경우 cpu.stat
cgroup의 파일을 검사할 수 있습니다. 파일에는 cgroup에서 소비하는 CPU 시간의 마이크로초 수를 계산하는 여러 줄이 있으므로 매초마다 두 번 확인하고 그 차이를 10000으로 나누어 사용률을 얻을 수 있습니다(코어 하나를 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
논평:
- 샘플링 시간과 샘플 수는 각각 첫 번째 및 두 번째 매개변수로 매개변수화됩니다.
- 이것은 내 WSL2 환경에 있는 cgroups v1용입니다.
- 최신 버전은
pgrep
cgroup 검색에도 작동하므로 ps+grep+grep 트리오보다 사용하는 것이 더 좋습니다. ps
부하 평균에 포함되지 않음- 프로세스가 cgroup에 있지 않은 경우에는 작동하지 않지만 조정하는 것은 매우 간단해야 합니다.