node_exporter 는 리눅스 호스트의 /proc 과 /sys 를 읽어 Prometheus 형식으로 노출한다. 디스크 I/O 는 별도 문서에서 다루고, 여기서는 CPU · 메모리 · 네트워크 · 프로세스 메트릭과 그것으로 질의를 쓸 때 흔히 틀리는 지점을 정리한다. 최신 버전은 v1.12.1 이다[1].
| 메트릭 | 종류 | 의미 |
|---|---|---|
node_cpu_seconds_total |
Counter | CPU 가 각 상태(mode 레이블)로 보낸 누적 초. user · system · idle · iowait · irq · softirq · steal |
node_load1 · node_load5 · node_load15 |
Gauge | 1 · 5 · 15분 부하 평균 |
node_memory_MemTotal_bytes |
Gauge | 물리 메모리 총량 |
node_memory_MemFree_bytes |
Gauge | 아무것도 쓰고 있지 않은 메모리 |
node_memory_MemAvailable_bytes |
Gauge | 커널이 계산한 실제로 확보 가능한 메모리 |
node_memory_Buffers_bytes · node_memory_Cached_bytes |
Gauge | 버퍼 · 페이지 캐시 |
node_memory_SwapTotal_bytes · node_memory_SwapFree_bytes |
Gauge | 스왑 총량 · 잔여 |
node_filesystem_size_bytes · node_filesystem_avail_bytes |
Gauge | 파일시스템 크기 · 일반 사용자 가용 공간 |
node_network_receive_bytes_total · node_network_transmit_bytes_total |
Counter | 인터페이스별 수신 · 송신 누적 바이트 |
node_network_up |
Gauge | 인터페이스 활성 여부 (1 · 0) |
node_processes_running · node_processes_blocked |
Gauge | 실행 중 · I/O 대기 프로세스 수 |
node_boot_time_seconds |
Gauge | 부팅 시각 (Unix 시각) |
node_uname_info |
Gauge (항상 1) | 커널 · OS 정보를 레이블로 담은 info 메트릭 |
Counter 는 부팅 이후 누적값이라 그대로 그리면 우상향 직선만 나온다. 반드시 rate() 를 씌운다.
MemFree + Buffers + Cached 로 가용 메모리를 계산하는 식이 오래 돌아다니지만, 지금은 쓰지 않는다. 캐시 중에는 회수할 수 없는 부분(공유 메모리, 락된 페이지, 되돌려 쓰지 못한 더티 페이지)이 섞여 있어 실제보다 넉넉하게 나온다. 커널이 이 계산을 대신해 주는 값이 MemAvailable 이고, free 명령의 available 열도 같은 값이다.
# 가용 메모리 비율
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100
# 사용 중 메모리 (GiB)
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / 1024 / 1024 / 1024
MemAvailable 은 커널 3.14 부터 제공된다. 그보다 낮은 커널에서만 예전 근사식을 쓴다.
node_cpu_seconds_total 은 코어(cpu 레이블)와 상태(mode 레이블)로 쪼개져 있다. 사용률은 "idle 이 아닌 시간의 비율" 로 구하는 것이 아니라, idle 의 비율을 1에서 뺀다. 이렇게 해야 새 mode 가 커널에 추가돼도 식이 깨지지 않는다.
# 호스트별 CPU 사용률 (%)
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# iowait 비중
avg by (instance) (rate(node_cpu_seconds_total{mode="iowait"}[5m])) * 100
가상 머신이라면 steal 을 함께 본다. 값이 꾸준히 올라가면 게스트 안이 아니라 호스트가 붐비는 것이다.
특정 노드만 걸러 내려다 아래처럼 쓰는 경우가 많은데, 이것은 문법 오류다.
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes){instance=~"node1|node2"}
레이블 선택자 {...} 는 메트릭 이름 바로 뒤에만 붙는다. 괄호로 묶인 식에는 붙일 수 없다. 걸러 낼 조건은 각 항에 적거나, 전체를 부분 질의로 감싼다.
# 각 항에 붙인다
node_memory_MemTotal_bytes{instance=~"node1|node2"}
- node_memory_MemAvailable_bytes{instance=~"node1|node2"}
# 또는 결과에 조건을 건다
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes)
and on(instance) node_memory_MemTotal_bytes{instance=~"node1|node2"}
정규식은 완전 일치로 평가된다. instance=~"node1" 은 node1:9100 에 걸리지 않는다. 포트가 붙는 형태라면 instance=~"node1.*" 처럼 쓴다.
호스트명과 IP:포트 형식을 가려내고 싶을 때의 패턴은 다음과 같다.
# IP:포트 형태만
node_memory_MemTotal_bytes{instance=~"[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+"}
# 호스트명 형태만 (숫자로 시작하지 않는 이름)
node_memory_MemTotal_bytes{instance=~"[a-zA-Z][-a-zA-Z0-9_.]*(:[0-9]+)?"}
다만 instance 로 노드를 가르는 것은 스크레이프 설정이 바뀌면 깨진다. 스크레이프 설정에서 nodename 같은 레이블을 붙여 두고 그것으로 거르는 편이 오래 간다.
1024 로 세 번 나누면 GiB, 1e9 로 나누면 GB 다. 둘은 다른 값이다. Grafana 를 쓴다면 식에서 나누지 말고 패널의 단위를 bytes(IEC) 로 지정하는 쪽이 낫다. 임계값과 눈금이 함께 맞는다.
rate() · irate() 의 차이.by · without 로 시리즈를 묶는 방법.최신 버전 v1.12.1 — 2026-09-20 확인. https://github.com/prometheus/node_exporter/releases/latest ↩︎