본문으로 건너뛰기
0
r/jeffnews HN 약 5분

rsloop: Rust로 만든 Python asyncio 이벤트 루프 (io_uring 지원)

backend

요약

PyO3 기반으로 Python asyncio 이벤트 루프를 Rust로 재구현한 rsloop. Linux에서 compio + io_uring을 사용하고, asyncio 호환 표면이 넓어 drop-in 교체가 가능하다. uvloop과는 다른 접근으로 이벤트 루프 성능을 노리는 프로젝트.

기사 전체 정리

  • Python asyncio의 이벤트 루프를 Rust로 구현한 rsloop이 나왔음. PyO3 기반이고, pip install로 바로 쓸 수 있음. uvloop의 대항마 포지션인데, 접근 방식이 다름

아키텍처

  • rsloop.Loop은 전용 Rust 런타임 스레드를 하나 소유함. 이 스레드가 루프 조율과 I/O를 담당하고, Python 콜백/태스크/코루틴은 run_forever()run_until_complete()을 호출한 스레드(보통 메인 Python 스레드)에서 실행됨

  • Linux에서는 compio + io_uring을 사용해서 fd watcher, TCP/Unix 소켓 readiness, 소켓 읽기, non-TLS 서버 accept을 런타임 스레드에서 처리함. 다만 TLS I/O, TLS accept, 레거시 transport write는 아직 헬퍼 스레드를 사용하는 하이브리드 모델임

  • 플랫폼 지원은 Linux, macOS, Windows 모두 커버. Windows 파이프 transport와 subprocess 워크플로우도 됨

기능 범위

  • asyncio 호환 표면이 꽤 넓음:

    • 루프 라이프사이클: run_forever, run_until_complete, stop, close
    • 스케줄링: call_soon, call_later, call_at + Handle/TimerHandle
    • Future/Task: create_future, create_task, run_in_executor
    • I/O: add_reader/add_writer, sock_recv/sock_sendall, create_server/create_connection
    • Unix 소켓, 파이프, subprocess, 시그널 핸들러까지 지원
    • contextvars.Context 캡처 하에 콜백 실행
    • Python 3.12+ asyncio.run(loop_factory=...) 통합
  • import하면 자동으로 asyncio.open_connection()asyncio.start_server()를 몽키패치함. RSLOOP_USE_FAST_STREAMS 환경변수로 끌 수 있고, SSL이 설정되면 자동으로 stdlib으로 폴백됨

벤치마크와 한계

  • CPython 3.14.0 Linux 기준 벤치마크 스크립트가 포함되어 있고, uvloop과의 콜백/태스크/TCP 스트림 비교가 가능함. FastAPI 데모도 있어서 stdlib asyncio, uvloop, rsloop 세 가지로 같은 앱을 돌려볼 수 있음

  • 현재 한계도 명확함:

    • TLS는 rustls 백엔드 사용, 암호화된 프라이빗 키 미지원
    • preexec_fn 미지원 (fork/exec 사이에 Python 실행이 unsafe)
    • 싱글 런타임 스레드 I/O 모델로 전환 중이지만 아직 완성 안 됨

💡

> Python 3.8~3.14(+free-threaded 3.14t)까지 휠을 빌드할 수 있고, Tracy 프로파일러 통합도 지원함. --features profiler로 빌드하면 됨

  • asyncio 이벤트 루프를 Rust로 재구현하는 접근은 uvloop(libuv 기반 Cython)과 다른 길을 가는 거임. io_uring + compio 조합으로 Linux에서의 I/O 성능을 노리는 방향이 흥미로움. 아직 하이브리드 모델이라 완성도는 더 지켜봐야 하지만, 방향성 자체는 주목할 만함

핵심 포인트

  • 전용 Rust 런타임 스레드 + Python 콜백은 메인 스레드에서 실행하는 하이브리드 모델
  • Linux에서 compio + io_uring으로 I/O 처리
  • Python 3.8~3.14(+free-threaded 3.14t) 지원, Linux/macOS/Windows 크로스플랫폼
  • TLS는 rustls 백엔드, 아직 헬퍼 스레드 의존 — 싱글 스레드 I/O 모델 전환 중

인사이트

uvloop(libuv+Cython)과 다른 접근으로 io_uring + Rust 조합을 선택한 게 흥미로움. 아직 하이브리드 모델이라 완성도는 지켜봐야 하지만 방향성이 주목할 만함.

댓글

댓글

댓글을 불러오는 중...

backend

Redis 8.0 출시 — I/O 스레딩 갈아엎고 처리량 3배, 2.1M ops/sec 달성

Redis 8.0이 I/O 스레딩 모델을 완전히 재설계해서 16코어 기준 2.1M ops/sec를 달성함 (7.4 대비 3배). Hash field expiration, Vector search HNSW, Client-side caching v2, Redis Functions 2.0 async 실행 등 굵직한 기능이 추가되고, jemalloc 통합으로 메모리 fragmentation도 25% 줄어듦.

backend

Go 1.26의 타입 생성(Type Construction)과 순환 감지(Cycle Detection) 개선

Go 1.26에서 타입 체커의 타입 생성 알고리즘을 개선해 재귀 타입과 배열 크기 계산 시 발생하던 순환 감지 문제를 체계적으로 해결했다. 불완전한 값이 다운스트림으로 퍼지기 전에 업스트림에서 차단하는 새로운 접근법으로 여러 컴파일러 패닉을 수정.

backend

Cloudflare Gen 13 서버: 캐시를 코어로 바꿔 성능 2배 달성한 이야기

Cloudflare가 AMD Turin 9965(192코어) 기반 Gen 13 서버를 배포함. 코어당 L3 캐시가 6배 줄어 레거시 NGINX 스택(FL1)으로는 레이턴시 50% 악화가 불가피했으나, Rust로 전면 재작성한 FL2로 전환해 Gen 12 대비 처리량 2배, 성능/와트 50% 개선을 달성함.

backend

칩셋 레이턴시를 측정해봤더니 — 쓸모는 없지만 재밌는 실험

Vulkan GPU 벤치마크로 여러 세대 마더보드 칩셋의 PCIe 레이턴시를 측정한 실험. CPU 직결 대비 칩셋 경유 시 수백 ns 레이턴시가 추가되며, 의외로 2012년 Skylake Z170이 가장 낮은 추가 레이턴시를 보임.

backend

ForgeKV — Rust로 만든 멀티코어 Redis 대체제

Rust로 만든 Redis 드롭인 대체제. 64-샤드 잠금 아키텍처로 멀티코어 스케일링 지원. 2코어 환경에서 Redis 7 대비 41% 빠른 SET 처리량(158K ops/s). 고동시성에서는 약점 있음. Source-available 라이선스.