VIRT, RSS, PSS는 서로 다른 값입니다
ps -o pid,vsz,rss,comm -p "$$"
cat /proc/$$/smaps_rollup
getconf PAGESIZEVIRT/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은 관련이 있을 수 있지만 같은 경로 체계는 아닙니다.
- 대상CPU, 보드, 센서 중 무엇을 측정하는지 확인합니다.
- 단위바이트·페이지·밀리섭씨도·kHz를 구분합니다.
- 시점순간값·누적값·구간 평균을 구분합니다.
각 상자는 해석에 필요한 정보입니다. 숫자만 같아도 세 항목이 다르면 같은 현상이 아닙니다.
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 배치가 바뀌면 의미도 달라집니다. 한 번의 절댓값보다 같은 구간의 증분과 워크로드를 함께 봅니다.
첫 화면과 같은 구간의 통계를 구분합니다
초기 성능 점검은 원인을 확정하는 절차가 아니라 다음 관찰 대상을 좁히는 과정입니다. Netflix가 2015년에 소개한 첫 1분 점검을 출발점으로 삼되, 당시 예제 출력과 현재 서버의 수치를 같은 기준으로 비교하지 않습니다.
uptime
free -m
vmstat 1 6
iostat -x -y 1 5
위 명령은 사용 예시이며 이 글에서 서버를 실행·측정한 결과는 아닙니다. 순서대로 실행하면 서로 다른 시간 구간을 봅니다. 비교 기록에는 시각, 워크로드, CPU 수, 장치 구성, 커널과 도구 버전을 함께 남깁니다. vmstat·free는 procps-ng, iostat는 sysstat 도구이며 배포판에 따라 설치 여부와 옵션 지원이 다를 수 있습니다.
- 첫 보고CPU·I/O 등 비율 통계는 부팅 이후 평균입니다.
- 뒤의 다섯 보고각각 앞선 약 1초 구간의 통계입니다.
- 예외: procs·memory프로세스와 메모리 항목은 첫 보고와 후속 보고 모두 보고 시점의 값입니다.
vmstat의 첫 줄 전체를 구간 평균으로 읽지 않습니다. iostat -y는 간격을 지정했을 때 첫 부팅 이후 보고를 생략합니다.
| 관찰값 | 읽을 수 있는 것 | 이 값만으로 단정할 수 없는 것 |
|---|---|---|
uptime의 load average | 1·5·15분 동안 실행 가능 상태와 중단 불가능 대기 상태에 있던 작업 수의 평균입니다. | CPU 사용률(%)이 아닙니다. CPU 수로 정규화된 값도 아니며, CPU 경합과 I/O 대기를 나누어 봐야 합니다. |
free -m의 free / available | free는 미사용 메모리, available은 스와핑 없이 새 프로그램에 쓸 수 있는 메모리의 추정량입니다. -m의 단위는 MiB입니다. | free가 작다는 사실만으로 메모리 부족을 확정하지 않습니다. 회수 가능한 캐시와 실제 스왑 입출력·애플리케이션 증상을 함께 봅니다. |
vmstat의 r / b | r은 실행 중이거나 CPU를 기다리는 작업, b는 I/O 완료를 기다리며 막힌 작업을 관찰하는 단서입니다. | 단일 순간의 작업 수만으로 지속적인 병목이나 어느 프로세스의 책임인지 알 수 없습니다. |
iostat의 평균 지연과 장치 사용률은 한계가 다릅니다
iostat -x -y 1 5는 확장 장치 통계를 유한한 횟수로 관찰하는 예입니다. 아래 정의는 sysstat v12.8.0 매뉴얼을 기준으로 확인했습니다. 실제 출력 열과 단위는 iostat -V와 설치된 매뉴얼로 다시 확인합니다.
| 항목 | 의미와 해석 한계 |
|---|---|
await | 요청이 큐에서 기다리고 처리되는 시간을 합한 평균 밀리초(ms)입니다. 애플리케이션 응답 시간이나 p95·p99 같은 꼬리 지연은 아닙니다. |
aqu-sz | 평균 큐 길이입니다. 이전 도구에서는 avgqu-sz로 표시되기도 합니다. 절댓값의 공통 임계치 대신 처리량·지연과 같은 구간에서 비교합니다. |
%util | 장치에 I/O 요청이 발행되어 있던 시간의 비율입니다. 요청을 직렬로 처리하는 장치에서는 100%에 가까우면 포화의 단서지만, 병렬 처리하는 RAID와 현대 SSD에서는 이 값만으로 성능 한계를 판정할 수 없습니다. |
관찰된 평균과 사용자 지연이 함께 나빠졌을 때도 곧바로 특정 디스크를 원인으로 정하지 않습니다. 장치 계층, 요청 크기와 동시성, 같은 구간의 애플리케이션 지연을 대조해 다음 실험을 정합니다. 여기에는 실제 장치 벤치마크나 성능 개선을 입증한 수치는 포함하지 않았습니다.