내 cgroup에 과부하가 걸렸나요?

내 cgroup에 과부하가 걸렸나요?

cgroup/cpuset 옵션과 함께 사용할 수 있는 프로세스 집합의 코어를 제한한다고 가정해 보겠습니다.

이 cgroup에 할당된 스레드가 너무 많은지, 스레드가 사용 가능한 코어에 대해 과도한 경합을 겪고 있는지 알아야 합니다.

어떻게 해야 하나요?

cgroupup이 없으면 로드 평균을 사용합니다. 경험상 로드 평균은 top코어 수보다 작아야 합니다. cgroup/cpuset을 고려하면 비슷한 것이 있습니까?

답변1

특정 문제에 따라 두 가지 옵션이 있습니다.

"로드 평균"이 아닌 cgroup에 있는 스레드/프로세스 수에 관심이 있는 경우:

taskscgroup 파일의 줄 수를 세어보세요. 이 파일은 스레드나 프로세스가 cgroup에서 생성되거나 삭제될 때마다 자동으로 업데이트됩니다.

실제 활용도에 관심이 있는 경우:

이것은 약간 까다롭습니다. tasks위 파일에서 cgroup의 프로세스/스레드 목록을 가져온 다음 를 사용하여 각 PID의 사용량을 확인할 수 있지만 /proc이 접근 방식에는 경쟁 조건이 많아 경쟁 스포츠로 수익을 창출할 수 있습니다. 또는 버전 2 cgroup을 사용하는 경우 cpu.statcgroup의 파일을 검사할 수 있습니다. 파일에는 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용입니다.
  • 최신 버전은 pgrepcgroup 검색에도 작동하므로 ps+grep+grep 트리오보다 사용하는 것이 더 좋습니다.
  • ps부하 평균에 포함되지 않음
  • 프로세스가 cgroup에 있지 않은 경우에는 작동하지 않지만 조정하는 것은 매우 간단해야 합니다.

관련 정보