목표
/proc 파일시스템을 통해 실행 중인 프로세스의 상태를 분석하고, FD 누수나 메모리 문제를 진단할 수 있어야 함.
/proc 파일시스템이란?
/proc은 가상의 파일시스템이며, 실제 디스크에 존재하지 않고 커널이 실시간으로 생성하는 정보가 담긴 파일시스템이며, 프로세스와 시스템의 상태를 파일처럼 읽을 수 있다.
실제 장애 상황

- 증상에 대한 분석과 진단을 한 근거를 찾아가는 과정
1. Pod 및 OOMKilled 라는 용어 자체가 생소하였음.
2. Pod는 쿠버네티스의 가장 작은 실행단위이며, 1개 이상의 컨테이너의 묶음과 격리된 네임스페이스, cgroup의 단위임.
3. 여기서 네임스페이스는 같은 운영체제 (커널)을 사용하지만 보이는 것은 다른 서버 인 것 처럼 보여줄 수 있는 매커니즘
4. 더 나아가, 컨테이너 기술은 네임스페이스에 cgroup, file system, 권한제어를 결합해 구현하는 것임
5. cgroup은 프로세스의 프로세스가 사용하는 리소스의 양을 측정하는 기능임
6. OOMKilled는 리눅스 커널에서 OOM(Out Of Memory) Killer가 프로세스를 강제로 종료한 상태이다.
7. 리눅스 커널에서 프로세스를 강제로 종료하는 이유는, 메모리가 완전 고갈되면 시스템 전체가 멈출 수 있기 때문에 커널에서 메모리 조절을 위해 프로세스를 강제로 종료한다.
8. 다시, Pod 프로세스가 리소스를 너무 많이 사용하여서 리눅스 커널에서 Pod 프로세스를 강제로 종료하였고, kubelet에 의해 Pod가 재시작된 상황임.
9. VmRSS는 실제 물리 메모리에 올라와있는 메모리를 뜻하며, 장애 상황 예시에서는 이미 2gb의 메모리를 사용하고 있는 것
10. VmSize는 가상 주소의 전체 메모리를 뜻하며, 실제로 사용하지 않는 영역의 메모리까지 포함한 메모리 크기.
11. 해당 Pod의 프로세스 내의 Threads가 500개라는 뜻인데, 리눅스에서는 스레드 1개는 곧, 스택 1개를 의미하고, 기본 스택의 크기는 보통 8MB 정도로 500개의 스레드는 약 4gb로 전체 메모리를 차지 할 수 있는 스레드 갯수임.
12. 스레드가 생성되면 가상 메모리만 차지하다가, 실제로 스택 내부에서 함수의 깊이가 깊어지거나, 변수의 할당, TLS 생성 등으로 실제 스택의 컨텍스트를 실행하게 되면 페이지 단위의 용량이 vmRSS에 더해진다.
13. 그리하여, 500개의 스레드에서 최소 단위의 페이지 용량이 vmRSS에 더해지면 메모리 용량 부족으로 리눅스 커널에서 SIGKILL 을 하는 것
14. 자바 어플리케이션을 기준으로 한다면, WAS에서 스레드 갯수를 제한해서 스레드 갯수를 줄이는 방법 혹은 -Xss 옵션을 통해 Java 스레드가 사용할 수 있는 스택의 용량을 제한하여 용량 자체를 줄일 수 있는 방법, Java의 컨테이너 인식, 쿠버네티스 메모리 증가 및 cgroup의 옵션 조정을 통해 해당 문제를 해결할 수 있음
실습1: 프로세스 상태 확인
목표: 특정 프로세스의 메모리 사용량과 스레드 수 확인

실습 2: 열린 파일 디스크립터(FD) 확인
목표: FD 누수 탐지
- 몰라서 찾아본 것
1. FD 라는 것은 프로세스가 커널에 요청해서 연 파일이나 소켓 등을 가리키는 정수 값임.
2. Linux/Unix의 철학은 모든 것은 파일이기 때문에 FD는 파일, 소켓, 디렉토리, 터미널 등 I/O가 가능한 커널 객체를 모두 포함할 수 있다.
3. FD는 기본적으로 0(stdin), 1(stdout), 2(stderr) 를 생성하고 이 것들은 지워지지 않는다
4. ulimit -n 명령어로 프로세스의 FD 제한값을 확인할 수 있고, 프로세스에서 open만 하고 close하지 않는 FD가 많아지면 FD 제한값에 닿을 수 있고, 모든 것이 파일로 이루어진 Linux/Unix 에선 파일을 열 수 없다면 I/O 작업이 불가능해지기 때문에 장애가 발생할 수 있다.



학습 간 느낀점
Day1의 시스템 콜 분석과 더불어 파일시스템을 통해 프로세스 상태를 분석해서 FD 누수나 메모리 문제를 진단할 수 있다는 것에 신기하였고, 여러 방면으로 특히 애플리케이션 수준이 아닌 운영체제 수준에서 근본적인 문제들을 탐지할 수 있다는 자신감이 생겼음
또한, 그 동안 지나치면서만 봤던 /proc 내부의 내용을 알게 되어서 신기하고 좋았음
앞으로 학습할 쿠버네티스와 연결지어 장애 상황을 알게된 것도 앞으로의 학습에 기대가 많아졌음
'DevOps' 카테고리의 다른 글
| Day3: 메모리 분석 (Free, vmstat, /proc/meminfo) (0) | 2026.01.11 |
|---|---|
| Day 1: strace로 시스템 콜 분석하기 (0) | 2026.01.08 |