[논문 리뷰] CPC: programming with a massive number of lightweight threads
CPC는 스레드 기반 프로그래밍의 간편함과 이벤트 기반 실행의 효율성을 결합하여, 수천 개의 경량 협동 스레드를 사용할 수 있도록 하며, 이는 네트워크 서버 성능을 햖당하고 Hekate와 같은 BitTorrent 시드러를 통해 최대 1,000명의 피어를 지속적으로 지원하면서도 CPU 사용률을 최소화한다. 이 접근법은 스레드 유사한 단순성과 이벤트 기반의 효율성을 결합하여 메모리 오버헤드를 줄이고 코드 가독성을 향상시키며, 차단 I/O를 처리하기 위해 분리된 네이티브 스레드를 혼합 사용할 수 있도록 한다.
Threads are a convenient and modular abstraction for writing concurrent programs, but often fairly expensive. The standard alternative to threads, event-loop programming, allows much lighter units of concurrency, but leads to code that is difficult to write and even harder to understand. Continuation Passing C (CPC) is a translator that converts a program written in threaded style into a program written with events and native system threads, at the programmer's choice. Together with two undergraduate students, we taught ourselves how to program in CPC by writing Hekate, a massively concurrent network server designed to efficiently handle tens of thousands of simultaneously connected peers. In this paper, we describe a number of programming idioms that we learnt while writing Hekate; while some of these idioms are specific to CPC, many should be applicable to other programming systems with sufficiently cheap threads.
연구 동기 및 목표
- 기존 스레드와 이벤트 기반 프로그래밍 간의 성능와 표현력의 상충 관계를 해결하기 위해.
- 최소한의 오버헤드와 높은 코드 가독성을 유지하면서 수천 개의 동시 연결을 지원하는 프로그래밍 모델을 제공하기 위해.
- 매우 경량이면서 협동적인 스레드를 사용하여 BitTorrent 시드러와 같은 확장 가능한 네트워크 서버를 구축할 수 있는지 탐색하기 위해.
- 협동적 CPC 스레드와 분리된 네이티브 스레드를 조합한 하이브리드 프로그래밍 모델이 차단 I/O를 효율적으로 처리하면서도 성능을 유지할 수 있는지 보여주기 위해.
제안 방법
- 스레드 기반 스타일로 작성된 프로그램을 Continuation Passing Style (CPS) 변환을 통해 이벤트 기반 코드로 변환하여 매우 경량의 스레드 실행을 가능하게 한다.
- CPC 스레드에 대해 협동적이고 비선점적 스케줄링을 사용하며, 컨텍스트 스위치는 항상 CPS 함수 내의 정의된 지점에서만 발생하여 런타임 오버헤드를 줄인다.
- 지정된 기간 동안 활동이 없으면 I/O를 취소하는 짧은 수명의 분리된 타임아웃 스레드를 사용하여 타임아웃을 구현한다.
- CPS 함수가 네이티브 함수를 호출하고 cpc_detached를 사용해 차단 I/O 작업을 위한 네이티브 스레드를 생성할 수 있는 하이브리드 모델을 도입한다.
- cpc_io_wait를 통해 I/O 준비 상태가 확인된 후에 버퍼 할당을 연기함으로써, 기존의 차단 스레드 모델 대비 메모리 사용량을 줄였다.
- cpc_yield와 cpc_attach를 사용하여 협동 스레드와 네이티브 스레드 실행 간 전환함으로써, 비차단 및 차단 작업을 효율적으로 처리할 수 있도록 한다.
실험 결과
연구 질문
- RQ1매우 많은 수의 경량 협동 스레드를 사용하는 프로그래밍 모델이 이벤트 기반 시스템과 유사한 성능을 달성하면서도 스레드 기반 프로그래밍의 단순함을 유지할 수 있는가?
- RQ2CPS 변환과 협동 스케줄링의 사용이 동시 네트워크 서버의 메모리 사용량과 시스템 오버헤드에 어떤 영향을 미치는가?
- RQ3협동 CPC 스레드와 분리된 네이티브 스레드를 조합한 하이브리드 프로그래밍 모델이 차단 I/O 작업 처리 효율성에 얼마나 기여하는가?
- RQ4이러한 시스템은 저성능 라우터와 같은 자원이 제한된 임베디드 하드웨어에서도 효과적으로 구동될 수 있는가?
주요 결과
- Hekate는 표준 듌링 코어 CPU에서 최대 1,000명의 연결된 피어를 지속적으로 유지하면서도 CPU 사용률이 10% 미만이었으며, 최고 10 MB/s의 처리량을 기록했다.
- 266 MHz MIPS 기반 라우터(32 MB RAM)에서도 성공적으로 실행되었으며, 1.2 GB 토런트 파일을 사용한 1,000명의 클라이언트 스트레스 테스트에서 2.9 MB/s의 처리량을 달성했다.
- BitTorrent 핸드셰이크와 같은 복잡한 프로토콜의 경우, 이벤트 기반 시스템에서는 1,000줄 이상이었으나 CPC에서는 50줄 미만으로 줄어들어 코드의 가독성이 크게 향상되었다.
- I/O 준비 상태 확인 후에 버퍼 할당을 연기함으로써 기존의 차단 스레드 모델 대비 메모리 사용량을 줄였으며, 同시에 선형 제어 흐름을 유지했다.
- cpc_detached를 사용한 하이브리드 모델은 디스크 I/O를 효율적으로 처리했으며, 평균 10 ms 이내에 쓰기 작업이 완료되어 레이스 컨dition의 영향을 최소화했다.
- CPC 런타임은 cpc_write가 분리된 모드에서 사용된 경우 이를 일반적인 write 시스템 콜처럼 최적화하여 코드를 단순화하면서도 성능 손실 없이 처리했다.
더 나은 연구,지금 바로 시작하세요
논문 읽기부터 검토까지, 연구 시간을 획기적으로 줄여보세요.
카드 등록 없음 · 무료 플랜 제공
이 리뷰는 AI가 만들고, 인간 에디터가 검토했습니다.