Today, large-scale servers or middleboxes face millions of transactions over TCP every second. However, scaling the performance of short TCP connections (e.g., transactions) on multicore systems is fundamentally challenging. Although many proposals have attempted to address various shortcomings, inefficiency in the kernel implementation still persists. For example, even the state-of-the-art design spends 70 to 80% of CPU cycles in handling TCP connections in the kernel, leaving only small room for innovation in the user-level program.
This work presents mTCP, a high-performance user-level TCP stack for multicore systems. mTCP addresses the inefficiency from the ground up-from packet I/O and TCP connection management to the application interface. In addition to adopting well-known techniques, our design (1) translates expensive system call to shared memory access between two threads within the same CPU core, (2) allows efficient flow-level event aggregation, and (3) performs batch processing of RX/TX packets for high I/O efficiency. Our evaluation on an 8-core machine shows that mTCP improves the performance of small message transactions by a factor 25 and 3 than that of latest Linux TCP stack and the best-performing research system known so far. It also improves the performance of various popular applications by 33% to 320% compared with those on the Linux stack.
멀티코어 시스템에서 transaction과 같은 짧은 TCP 연결을 빠르게 처리하는 것에는 근본적으로 어려움이 있다. 기존의 많은 연구들이 이를 해결하고자 여러 개의 코어에서 동시에 접근하는 리소스들을 각 코어 별로 분리하는 등의 다양한 방법을 시도하였으나, 커널이 구현될 시에 멀티코어 시스템을 고려하지 않고 설계된 까닭에 여전히 많은 문제가 커널 내부에 산재되어 있다. 한 예로, 현재 최신 리눅스 커널에서조차 웹서버를 구동하는 데 70~80% 정도의 CPU cycle을 사용하여, 애플리케이션이 아무리 발전하더라도 성능의 향상이 나머지 20% 내에서밖에 이루어질 수 없는 근본적인 한계가 있다.
본 연구에서는 유저레벨에서 멀티코어 시스템을 위한 고성능 TCP 스택을 개발한다. 본 연구에서 개발한 mTCP는 기존의 비효율적인 커널의 구조를 피하여 유저레벨에서 패킷 I/O부터 TCP 연결 관리, 애플리케이션 인터페이스까지 모두를 포괄한다. 기존의 연구들에서 발표된 최적화 기법들 외에 본 연구에서는 TCP 연결을 효과적으로 처리하기 위해 (1) 기존에 큰 오버헤드를 수반하던 system call 기반의 인터페이스를 thread간의 공유 메모리 접근으로 바꾸는 기법, (2) 여러 개의 TCP 레벨 이벤트를 합쳐 어플리케이션에 전달함으로써 하나의 이벤트 당 오버헤드를 줄이는 기법, (3) 패킷 I/O를 여러 개의 패킷에 대하여 한번에 처리함으로써 패킷 당 I/O 오버헤드를 줄이는 기법 등을 사용한다.
본 연구의 결과로 8개의 CPU 코어가 있는 최신 리눅스 기기에서 TCP를 통한 작은 메시지 전송 성능이 기존 리눅스 시스템 대비 최대 25배 향상되었고, 이전 연구에서 제안되었던 시스템인 MegaPipe에 비하여도 3배가 향상되었다. 또한 다양한 실제 네트워크 애플리케이션을 mTCP를 사용하도록 한 결과, 널리 사용되는 웹서버인 lighttpd의 경우 320%, SSL reverse proxy인 SSLShader의 경우 33%의 성능 향상을 이루어 내었다. Lighttpd와 같이 TCP를 통한 네트워크 I/O를 많이 쓰는 애플리케이션들은 본 연구에서 개발한 mTCP를 통하여 최소한의 코드 수정으로 성능을 약 3배정도 향상시킬 수 있음을 보였고, 상대적으로 암호화에 많은 CPU를 사용하여 네트워크 I/O가 많지 않은 SSLShader와 같은 애플리케이션도 mTCP를 통해 그 성능을 향상시킬 수 있음을 보였다. 본 연구는 위에서 보인 바와 같이 다양한 고성능 네트워크 시스템을 거의 인터페이스의 차이 없이 성능을 크게 향상 시킬 수 있다는 데 그 의의가 있다.