성능·관측·로그 용어
프로파일링, 메모리, 압축, 직렬화 포맷, 로그와 메트릭 등 성능 분석·운영 용어
- 용어 22개
profiling / profiler (프로파일링)
프로그램이 CPU 시간이나 메모리를 어디서 쓰는지 측정하는 것 / 그 도구.
- 디버깅은 “왜 틀린 결과가 나오나”, 프로파일링은 “왜 느린가, 어디서 자원을 쓰나”를 묻는다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리
flame graph (플레임 그래프)
함수 호출 스택별로 CPU 사용 시간을 쌓아 올려 보여 주는 그래프.
- 넓은 막대가 시간을 많이 쓰는 함수다. 어디가 병목인지 한눈에 보인다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리
perf / eBPF
perf는 리눅스 커널 수준 성능 분석 도구, eBPF는 커널을 고치지 않고 커널 안에 작은 프로그램을 넣어 이벤트를 수집하는 기술.
- eBPF는 프로파일링과 관측(observability)에 가깝고 오버헤드가 낮아 운영 중인 서버에도 쓴다.
- async-profiler는 JVM용 샘플링 프로파일러로 flame graph를 만들 수 있다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리 · 명령어 Ftrace 사용법 (source 분석)
context switching (컨텍스트 스위칭)
CPU가 실행하던 스레드·프로세스를 다른 것으로 바꾸는 것.
- 스레드가 너무 많으면 CPU가 일보다 전환에 시간을 쓴다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리 · 스레드 동시성 문제 정리 - race·deadlock·livelock·starvation
run queue
CPU를 받기 위해 대기 중인 실행 가능한 스레드의 줄.
- CPU 사용률은 낮은데 느릴 때, run queue에서 오래 기다리는 경우가 원인일 수 있다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리
CPU steal
가상머신 환경에서 다른 VM이 물리 CPU를 가져가서 내 VM이 CPU를 쓰지 못한 시간.
top의st값으로 본다.- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리
heap / heap dump
heap은 프로그램이 동적으로 할당하는 메모리 영역, heap dump는 그 순간의 스냅샷.
- 어떤 객체가 메모리를 차지하는지 분석해 메모리 누수를 찾는다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리 · 메모리 구조
GC (Garbage Collection / garbage collector)
더 이상 참조되지 않아 쓸 수 없게 된 메모리를 런타임이 자동으로 찾아 해제하는 기능(또는 그 일을 하는 구성 요소).
- Java, Go, Python, C# 등에 있고, C/C++처럼 직접 malloc/free하는 언어에는 없다.
- GC가 도는 동안 애플리케이션이 잠깐 멈추는 시간(pause, stop-the-world)이 생길 수 있어 GC 로그로 빈도와 멈춤 시간을 본다.
- GC가 있어도 불필요한 참조가 남아 있으면 메모리 누수가 생긴다.
- 학습 노트: 메모리 구조 · 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리
RSS / OOM Kill
RSS는 프로세스가 실제로 차지한 물리 메모리, OOM Kill은 메모리가 부족할 때 OS나 컨테이너 런타임이 프로세스를 강제 종료하는 것.
- 컨테이너는 힙만이 아니라 프로세스 전체 메모리(RSS)로 판정한다. 힙에 여유가 있어도 네이티브 메모리, 스레드 스택, 페이지 캐시 때문에 죽을 수 있다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리 · 쿠버네티스 기본 개념 - Pod·Node·Cluster·Deployment
mmap / page cache
mmap은 파일을 메모리 주소 공간에 연결해 읽고 쓰는 방식, page cache는 OS가 읽은 파일 내용을 메모리에 캐시해 두는 것.
- 이 영역도 메모리 사용량으로 잡혀서 컨테이너 메모리 한도 계산에 영향을 준다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리
memory allocator (malloc, jemalloc)
malloc/free로 메모리를 요청하고 반납할 때 실제로 OS에서 받아 잘라 주는 라이브러리. 리눅스 기본은 glibc malloc, 대안으로 jemalloc 등이 있다.
- Java 서버도 힙 바깥의 네이티브 메모리(Netty direct buffer, 압축 라이브러리 등)는 malloc으로 할당한다.
- 할당과 해제가 잦으면 메모리가 잘게 쪼개지는 fragmentation(단편화)이 생기고, 실제 쓰는 양보다 메모리를 많이 잡거나 할당기가 CPU를 많이 쓴다.
- 대응: 버퍼 재사용·풀링으로 할당 횟수를 줄이기, 할당기 옵션 튜닝, 버전 업그레이드.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리 · 메모리 정렬(Memory Alignment)과 aligned_alloc — CPU 워드 경계와 안전한 할당 래퍼
압축 (gzip, zstd) / threshold
데이터를 줄여 전송량이나 저장 공간을 아끼는 것.
- 작은 데이터는 압축하면 오히려 손해라서 일정 크기(threshold) 이상일 때만 압축한다.
- HTTP에서는
Content-Encoding: gzip헤더로 압축 여부를 알린다. - 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리 · SXSSFWorkbook 대용량 엑셀 스트리밍과 동적 ZIP 분할 압축 설계 패턴
Protobuf / Avro (바이너리 포맷)
JSON 같은 텍스트가 아닌 바이너리로 직렬화하는 포맷. 더 작고 빠르다.
- 스키마를 어떻게 운영할지가 중요하다. Schema Registry에 스키마 버전을 모아 두고, 하위·상위 호환성 규칙(새 버전이 옛 데이터를, 옛 버전이 새 데이터를 읽을 수 있는지)을 지킨다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리
observability (관측 가능성)
시스템 내부 상태를 로그, 메트릭, 추적(trace)으로 밖에서 알 수 있게 하는 능력.
- monitoring이 “정해 둔 지표를 지켜보는 것”이라면 observability는 “처음 보는 문제도 원인을 파고들 수 있게 하는 것”에 가깝다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리
metric (메트릭)
시간에 따라 수치로 집계한 지표. 요청 수, 지연 시간, 에러율, 큐 길이 등.
- 로그는 개별 사건의 기록이고 메트릭은 집계된 숫자다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리 · Grafana Alert Slack 연동 설정 가이드
percentile (p50 / p95 / p99)
응답 시간을 작은 순으로 줄 세웠을 때 상위 몇 %의 값. p99 = 100번 중 99번은 이 시간 안에 끝난다.
- 평균은 느린 소수를 가린다. 그래서 지연은 p95, p99로 본다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리
structured log (정형 로그)
JSON처럼 필드가 정해진 형식으로 남긴 로그. 검색과 집계가 쉽다.
- 자유 형식 텍스트 로그(비정형)와 대비된다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리
appender
로그를 어디로 보낼지(파일, 콘솔, Kafka, 알림 등) 정하는 Logback 같은 로깅 프레임워크의 구성 요소.
masking (마스킹)
개인정보나 카드번호 같은 민감한 값을 일부 가려서 남기는 것.
- 예)
1234-****-****-5678. 로그에 요청과 응답을 남길 때 금융, 개인정보 규정상 필수다. - 학습 노트: 제로 디펜던시 개인정보 마스킹과 오류 핑거프린팅(SHA-256) 모니터링 설계 · 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리
async logging / neverBlock
로그를 큐에 넣고 별도 스레드가 전송하는 방식. 큐가 가득 차면 기본은 애플리케이션 스레드가 기다린다(blocking).
- Logback의
neverBlock=true는 큐가 가득 찼을 때 로그를 버리고 서비스는 계속 동작하게 한다. 그러면 로그 유실이 조용히 일어나므로 버려진 로그 수와 큐 사용량을 메트릭으로 감시해야 한다. - 전송 실패 대비로 재시도하고, 그래도 안 되면 로컬 파일에 남겼다가 나중에 다시 보내는 방식도 쓴다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리 · 멀티스레드 로깅
slow log / slow query
기준 시간보다 오래 걸린 쿼리(DB)나 명령(Redis SLOWLOG)을 기록한 로그.
- 쿼리에 호출한 API 이름을 주석으로 붙여 두면 슬로우 로그만 봐도 어느 API의 쿼리인지 알 수 있다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리
ELK stack
Elasticsearch(저장·검색), Logstash(수집·가공), Kibana(시각화)를 묶어 로그를 모으고 검색하는 구성.
- 수집기를 Vector 같은 더 가벼운 것으로 바꾸거나 저장소를 더 저렴한 로그 DB로 바꾸기도 한다.
- 학습 노트: 성능 분석 도구와 관측 - perf·flame graph·eBPF·메모리 · LogQL 쿼리 문법 정리 (필터·집계·rate·pattern)