본 업데이트는 UringMachine 프로젝트의 주요 진척 사항과 그 과정에서 얻은 기술적 통찰을 상세히 다룹니다.
UringMachine Fiber Scheduler 개발 현황
-
UringMachine은 io_uring 기반의 저수준 I/O API를 제공하며, 파이버를 통한 동시성 및 futex 기반 뮤텍스와 큐를 지원합니다.
-
표준 Ruby I/O 클래스와의 호환성 문제를 해결하기 위해
Fiber::Scheduler구현이 필수적임을 인지했습니다. -
현재 기본적인 I/O, 슬립, 블로킹 작업 대기(뮤텍스 잠금, 큐 대기) 및 스케줄러 생명주기 관리가 가능한
UringMachine용Fiber::Scheduler의 기본 버전이 완성되었습니다. -
io.c파일의 방대한 코드량(약 1만 라인)에서 알 수 있듯이, Ruby의IO클래스 구현은 매우 복잡하며,Fiber::Scheduler메커니즘을 점진적으로 학습하며 개발을 진행 중입니다.
Fiber Scheduler 작업 중 학습한 내용
-
Kernel.puts호출 시 후행 개행 문자가 별도의 쓰기 작업으로 처리되며, 동시 쓰기 시 예상치 못한 결과를 초래할 수 있어IO인스턴스별 뮤텍스를 사용해 동기화하는 것으로 파악됩니다. - IO 객체별 논블로킹(O_NONBLOCK) 동작 불일치:
- 파일 및 표준 I/O는 블로킹 모드입니다.
- 파이프, 소켓, OpenSSL 소켓은 논블로킹 모드입니다.
io_uring은 블로킹 모드의 파일 디스크립터를 요구하므로,Fiber::Scheduler구현 시reset_nonblock메서드를 통해IO인스턴스를 블로킹 모드로 강제 설정하는 코드를 추가했습니다.
-
다중 파이버 I/O 상황에서
EINTR예외가 발생하는 현상을 관찰했으며, 이는 시그널에 의한 I/O 작업 중단을 의미하나 정확한 원인은 아직 파악 중입니다. - `IO
close 호출 시 뮤텍스가 관여하며 blocking_operation_wait 및 block 스케줄러 훅이 호출되는 복잡한 메커니즘을 확인했으며, UringMachine의 비동기 close_async` 메서드와 비교하며 추가 분석이 필요합니다.
Fiber Scheduler 인터페이스 개선 및 확장
-
IO닫기 훅이나splice훅 추가 등Fiber::Scheduler인터페이스 확장에 대해 Samuel Williams와 논의했습니다. -
pidfd_open을 활용한 자식 프로세스 대기 시 경쟁 조건 방지 방안을 모색했습니다. -
io_uring_prep_waitidAPI를 사용하여 자식 프로세스를 대기하는 방식을 Samuel의io-eventgem에 적용할 것을 제안했으며, 이는Process.wait와 더 나은 호환성을 제공합니다. -
Fiber::Scheduler의process_wait훅이Process::Status인스턴스를 반환해야 하지만, 이 클래스는 직접 인스턴스화할 수 없다는 문제점을 발견하고,Process::Status객체 생성을 가능하게 하는 PR을 Ruby 4.0 릴리스 전 병합 목표로 제출했습니다. 관련 변경 사항을io-eventgem에도 PR로 제출했습니다.