vm.overcommit_memory와 Process Status 및 Priority
1. vm.overcommit_memory
커널이 메모리 할당 요청을 처리하는 방식을 결정하는 파라미터.
오버커밋 = 실제 물리 메모리보다 많은 메모리 요청을 일단 허용하고, 실제로 쓸 때 물리 메모리를 할당하는 방식
값 이름 동작
| 0 | 휴리스틱 (기본값) | 커널이 알아서 판단 |
| 1 | 무조건 허용 | 모든 요청 허용, OOM 위험 |
| 2 | 엄격한 제한 | 한도 초과 시 즉시 거절 |
오버커밋이 필요한 이유: fork() 시 부모 메모리를 복사하지만, exec() 후엔 대부분 쓰지 않음 → 오버커밋 없으면 메모리 낭비가 극심해짐
2. 프로세스 상태 코드
ps aux / top의 STAT 컬럼에 표시
코드 이름 설명
| R | Running | CPU 실행 중 또는 대기 중 |
| S | Sleeping | 이벤트 대기 (깨울 수 있음) |
| D | Disk Sleep | IO 완료 대기 (kill도 안 통함) |
| Z | Zombie | 종료됐지만 부모가 수거 안 함 |
| T | Stopped | Ctrl+Z 등으로 일시 정지 |
좀비 프로세스 발생 원인
자식 종료 → 부모가 wait()를 호출하지 않음 → Z 상태
- 메모리는 차지 안 하지만 PID를 점유 → 대량 발생 시 PID 고갈 위험
- 부모가 먼저 죽는 경우는 → 고아 프로세스 → init이 입양 후 수거 (좀비 아님)
3. PR / NI — 프로세스 우선순위
NI (Nice 값) — 내가 설정하는 값
- 범위: -20 ~ +19
- 낮을수록 높은 우선순위 (CPU를 많이 가져감)
- 높을수록 낮은 우선순위 (다른 프로세스에게 양보)
- "나이스할수록 손해본다"
PR (Priority) — 커널이 실제 사용하는 값
PR = 20 + NI
- rt 표시 → 실시간 프로세스 (일반 프로세스보다 항상 우선)
우선순위가 의미 없을 때
CPU 코어 수 = 실행 중인 프로세스 수 → 경합 없음 → NI값 무의미
우선순위는 경쟁이 있을 때만 효과가 있다.
# 낮은 우선순위로 실행 (백그라운드 작업에 유용)
nice -n 19 ./backup.sh
# 실행 중인 프로세스 우선순위 변경
renice -n 5 -p [PID]