Linux procfs/sysfs · 커널 6.18 문서 참고

메모리·온도·CPU 상태를 읽는 방법

수치의 대상과 단위를 확인하고, 관찰한 값에서 말할 수 있는 범위를 구분합니다.

VIRT, RSS, PSS는 서로 다른 값입니다

ps -o pid,vsz,rss,comm -p "$$"
cat /proc/$$/smaps_rollup
getconf PAGESIZE

VIRT/VSZ는 가상 주소 공간, RSS는 실제 메모리에 있는 페이지의 양을 보는 지표입니다. 여러 프로세스가 같은 페이지를 공유하면 RSS를 더할 때 중복 집계할 수 있습니다. PSS는 공유된 페이지의 비용을 나누어 계산합니다. 접근 권한과 커널 설정에 따라 smaps_rollup을 읽지 못할 수 있습니다.

VIRT가 크다고 모두 물리 메모리를 쓴 것은 아니지만 주소 공간 제한이나 commit 정책과 무관한 값도 아닙니다. 페이지 크기는 getconf PAGESIZE 또는 sysconf(_SC_PAGESIZE)로 확인합니다. 서로 다른 시점의 Mapped와 nr_mapped를 나누어 추정하면 단위·시점 때문에 틀릴 수 있습니다.

thermal_zone0이 항상 CPU 온도는 아닙니다

for zone in /sys/class/thermal/thermal_zone*; do
    [ -r "$zone/type" ] && [ -r "$zone/temp" ] || continue
    printf '%s: ' "$zone"
    cat "$zone/type" "$zone/temp"
done

각 zone의 type을 먼저 읽습니다. thermal temp의 단위는 보통 밀리섭씨도이므로 42000은 42°C에 해당합니다. 어떤 부품의 측정값인지는 드라이버와 하드웨어 설명을 확인해야 합니다. hwmon의 temp 입력과 thermal zone은 관련이 있을 수 있지만 같은 경로 체계는 아닙니다.

측정값을 해석하는 세 항목
  1. 대상CPU, 보드, 센서 중 무엇을 측정하는지 확인합니다.
  2. 단위바이트·페이지·밀리섭씨도·kHz를 구분합니다.
  3. 시점순간값·누적값·구간 평균을 구분합니다.

각 상자는 해석에 필요한 정보입니다. 숫자만 같아도 세 항목이 다르면 같은 현상이 아닙니다.

governor 이름만으로 고정 주파수를 단정하지 않습니다

for policy in /sys/devices/system/cpu/cpufreq/policy*; do
    [ -d "$policy" ] || continue
    printf '%s\n' "$policy"
    cat "$policy/scaling_driver" "$policy/scaling_governor"
done

정책에 연결된 CPU와 scaling driver를 함께 봅니다. powersave의 의미는 드라이버와 동작 모드에 따라 다르며 언제나 최저 주파수 고정이라는 뜻은 아닙니다. cpufreq 경로가 없는 가상 환경도 있습니다. 무한 부하 루프를 남긴 채 측정하면 다른 결과까지 바뀌므로 부하 발생과 종료를 한 실험으로 관리합니다.

NUMA miss와 foreign의 방향을 구분합니다

항목이 노드를 기준으로 한 뜻
numa_hit이 노드를 원했고 이 노드에 할당되었습니다.
numa_miss다른 노드를 원했으나 이 노드에 할당되었습니다.
numa_foreign이 노드를 원했으나 다른 노드에 할당되었습니다.
local_node / other_node할당을 요청한 CPU가 이 노드에 속하는지에 따른 통계입니다.

누적 할당 통계이며 페이지 접근 지연을 직접 측정한 값은 아닙니다. NUMA 정책과 CPU 배치가 바뀌면 의미도 달라집니다. 한 번의 절댓값보다 같은 구간의 증분과 워크로드를 함께 봅니다.

확인한 문서

Linux procfs/sysfs · 커널 6.18 문서 참고