- 본 기사는 Rust 커뮤니티에서 멀티 스레드 실행자의 사용에 대한 논란을 논의하고 있으며, 이는 작업을 균형 있게 분배하기 위해 work-stealing을 수행하는 async 런타임입니다.
- 일부 Rust 사용자들은 "thread-per-core"라는 대안적인 아키텍처를 주장하며, 이는 성능이 더 우수하고 구현하기 쉽다고 약속하고 있습니다.
- "thread-per-core"라는 용어는 오해의 소지가 있습니다. 모든 멀티 스레드 실행자가 thread-per-core이며, OS 스레드를 코어 당 하나씩 생성하고 이러한 스레드 위에서 작업을 스케줄링합니다.
- Thread-per-core는 세 가지 아이디어를 결합합니다: 사용자 공간에서의 동시성 처리, I/O를 비동기화하여 스레드 차단을 피하고, CPU 코어 간의 데이터를 분할하여 동기화 비용과 CPU 캐시 간의 데이터 이동을 제거합니다.
- 이 논란은 주로 세 번째 포인트에 대한 것이며, async Rust를 사용하면 처음 두 요구사항을 충족시킬 수 있습니다.
- Thread-per-core 아키텍처에서는 두 가지 최적화를 수행할 수 있습니다: 스레드 간의 작업을 훔쳐가고, 가능한 한 적은 상태를 공유합니다.
- Work-stealing은 모든 스레드가 항상 작업을 할 수 있도록 하여 tail latency를 개선하지만, 구현하기 어렵고 동기화 비용과 캐시 누락을 초래할 수 있습니다.
- Share-nothing은 데이터를 단일 CPU 코어에 속한 더 빠른 캐시에 유지함으로써 tail latency를 개선하지만, 여러 파티션에서 상태를 변경해야 하는 복잡한 애플리케이션에 대해 구현하기 어려울 수 있습니다.
- 본 기사는 공유 상태를 사용하는 시스템에서 work-stealing이 부하하에서 CPU 사용률을 개선할 수 있을 것이라고 제안합니다.