개요 웹의 기반이 되는 HTTP프로토콜은 근본적으로 무상태성(Stateless)이라는 특징을 가진다. 이는 서버가 클라이언트의 이전 요청을 기억하지 못한다는 의미이다. 모든 요청은 독립적인 것으로 취급되기 때문에, 서버는 방금 전 통신한 클라이언트가 다시 요청을 보내도 그 클라이언트가 누구였는지 알지 못한다. 마치 서버가 단기 기억상실증에 걸린 것처럼, 매번 "누구시죠?"라고 묻는 것과 같다. 이러한 방식은 서버의 부담을 줄이고 확장성을 높이는 장점이 있으나, 로그인 유지나 장바구니 기능 등 연속적인 상태가 필요한 서비스를 구현하기에는 어려움이 있다. 쿠키(Cookie)쿠키는 HTTP의 무상태성을 보완하기 위해 등장한 것이 쿠키이다. 쿠키는 서버가 클라이언트(브라우저)에 데이터를 저장하고, 클라이언트가 ..
개요 멀티 스레드 환경에서는 여러 스레드가 동시에 공유 자원에 접근할 수 있다. 이때 하나의 스레드가 값을 읽거나 수정하는 도중에 다른 스레드가 접근하게 되면 정합성에 문제가 발생할 수 있다. 이러한 구역을 임계영역(Critical Section)이라 하며, 반드시 동시에 하나의 스레드만 접근할 수 있도록 상호배제(mutual exclusion)이라는 기법을 지켜야한다. balance라는 공유 변수를 1증가시키는 연산을 수행하고 있다. 이때 소스코드의 임계영역을 락으로 둘러 그 임계구역을 마치 하나의 원자 단위 명령어인 것처럼 실행되도록 한다.lock_t mutex;...lock(&mutex);balance = balance + 1;unlock(&mutex);락은 상호배제(mutual exclusion)..
개요 지난 글에서는 유저공간과 커널공간 혹은 커널 내부에서 발생하는 불필요한 데이터 복사를 최적화 하는 기술인 zero-copy를 이론 중심으로 살펴보았다. 본 포스트에서는 직접 구현한 Java NIO 기반 웹 애플리케이션 서버의 정적 파일 성능 병목 현상을 분석하고, 이 문제를 해결하기 위해 Java NIO의 FileChannel.transferTo()를 이용해 Zero-Copy를 직접 적용한 과정을 기록한다. 이를 통해 이론으로만 접했던 Zero-Copy가 실제 애플리케이션의 성능에 미치는 영향을 정량적으로 확인하고, 도입 과정에서 고려해야 했던 아키텍처 변경 사항까지 함께 다룬다. (이전 글은 아래 링크를 참고 바랍니다.) 메모리 복사를 최소화하는 기술, Zero-Copy개요 이전 글에서 다룬 인터..
개요 이전 글에서 다룬 인터럽트는 CPU의 대기 시간을 줄여주고, DMA는 CPU가 직접 데이터 전송을 수행하는 부담을 줄여준다. 하지만 여전히 해결되지 않은 비효율이 존재한다. 커널 공간(Kernel Space)과 사용자 공간(User Space)사이에서 발생하는 데이터 복사이다. 이러한 문제를 해결하기 위해서 등장한 기술이 바로 Zero-Copy이다. 현재 제로 카피를 주제로 가장 유명한 아티클 중 하나인 IBM의 'Efficient data transfer through zero copy'을 기반으로 제로 카피의 원리와 필요성과 구현된 mmap(), sendfile()시스템 콜에 대해 알아본다. (이전 글은 아래 링크를 참고 바랍니다.) I/O장치와 인터럽트 그리고 DMA개요 입출력(I/O)은 컴퓨..
개요 입출력(I/O)은 컴퓨터 시스템이 외부환경과 데이터를 주고받는 유용한 장치로 기능하게 하는 핵심 과정이다. 외부로부터 데이터를 입력받고 처리 결과를 출력할 수 없다면 컴퓨터는 고립된 연산장치에 불과하기 때문이다. 그러나 CPU의 빠른 연산 속도와 I/O장치의 느린 처리 속도 사이에 큰 간극이 존재한다. 이 속도 차이를 효율적으로 관리하지 않으면 시스템 전체 성능이 저하되는 병목현상이 발생하게 된다. 이러한 문제를 해결하고 I/O작업을 효율적으로 관리하기 위해 인터럽트(Interrupt)와 직접 메모리 접근(DMA, Direct Memory Access)이 등장했다. 본 글에서는 두 방식이 어떠한 배경에서 등장했으며, 각각 어떠한 역할을 수행하는지 알아본다.시스템 구조먼저 고전적인 시스템 구조를 살펴..
개요 C10K 문제란, 단일 서버가 동시에 10,000명(Concurrent 10K connections) 이상의 클라이언트와 연결을 유지하며 통신할 수 있도록 네트워크 소켓 처리 성능을 최적화하는 문제를 말한다.이 용어는 1999년 Dan Kegel이 처음 제시했으며, 당시에는 대부분의 서버가 수백-수천 개의 동시 연결만으로도 성능 병목에 부딪히는 것이 일반적이었다. 하지만 인터넷의 폭발적인 성장과 함께, 수만 명의 사용자가 동시에 접속하는 환경이 점점 일상화되면서, C10K 문제의 해결은 고성능 서버 설계의 필수 요소가 되었다.오늘날에는 수만 개의 연결을 동시에 처리하는 것은 기술적으로 어렵지 않지만, 이 문제를 어떻게 극복해 왔고, 그 과정에서 서버 아키텍처와 커널은 어떻게 발전해 왔는지를 이해하는..