반응형

Backend Performance 3

11편. JVM, Linux, 컨테이너가 충돌하는 지점들

Linux 공식문서로 다시 이해하는 JVM 서버 실행 환경1편부터 10편까지 우리는 Linux 커널이 JVM 서버를 어떻게 실행하고, 어떤 규칙으로 자원을 나누며, 어떻게 감시하고, 언제 죽이는지를 하나씩 살펴봤다.이번 편에서는 그 모든 요소가 한 지점에서 충돌하는 순간들을 정리한다.운영 중 자주 듣는 말들이 있다.“코드는 멀쩡한데 서버가 느리다”“메모리는 남아 있는데 죽었다”“배포할 때만 이상하다”이 말들은 대부분 JVM, Linux, 컨테이너의 가정이 서로 어긋나는 지점에서 나온다.충돌 1. JVM의 병렬성 가정 vs Linux 스케줄러JVM은 기본적으로 이렇게 가정한다.CPU 코어 수만큼 병렬 실행이 가능하다스레드를 늘리면 처리량이 늘어난다하지만 Linux 스케줄러(CFS)는 다르게 동작한다.CPU..

5편. 리눅스 메모리는 Heap을 모른다

Linux 공식문서로 다시 이해하는 JVM 서버 실행 환경4편에서 CPU는 스레드를 많이 만든다고 빨라지지 않으며, 컨텍스트 스위칭과 run queue가 지연을 만든다는 것을 살펴봤다.이번 편의 주제는 그 다음으로 자주 오해되는 영역이다.“메모리는 충분한데 왜 느려질까”“Heap은 여유가 있는데 왜 문제가 생길까”이 질문의 답은 JVM이 아니라, Linux의 메모리 관점에 있다.리눅스는 Heap이라는 개념을 모른다JVM 개발자는 메모리를 이렇게 생각한다.HeapMetaspaceStack하지만 Linux 커널은 이 구분을 전혀 모른다.Linux가 아는 것은 오직 이것뿐이다.가상 주소 공간(Virtual Address Space)페이지(Page)물리 메모리Heap은 JVM의 논리적 개념이지, OS의 개념이 ..

3편. 리눅스 스케줄러는 공정하지 않다

Linux 공식문서로 다시 이해하는 JVM 서버 실행 환경2편에서 JVM 서버는 fork - exec를 거쳐 하나의 프로세스로 실행되고, 컨테이너 환경에서는 그 프로세스가 자연스럽게 PID 1이 된다는 것을 살펴봤다.이번 편에서는 그 프로세스가 실행된 이후의 이야기다.CPU는 어떻게 나뉘는가왜 스레드를 많이 만들어도 성능이 좋아지지 않을까이 질문의 답은 JVM이나 Spring이 아니라, Linux 스케줄러의 철학에 있다.CPU는 동시에 여러 개의 프로세스를 실행하지 않는다멀티코어 환경에서는 동시에 여러 작업이 실행되는 것처럼 보인다.하지만 단일 코어 기준으로 보면, CPU는 언제나 하나의 작업만 실행한다.Linux의 역할은 단순하다.“누구에게 지금 CPU를 줄 것인가”이 결정을 담당하는 것이 바로 스케줄..

반응형