CS Insights

커널 유저 스페이스 우회의 극의: sendfile() 시스템 콜 기반의 Zero-Copy 스루풋 혁명

커널 유저 스페이스 우회의 극의: sendfile() 시스템 콜 기반의 Zero-Copy 스루풋 혁명
CDN 엣지 노드의 이미지 배포 서버를 튜닝하면서, 이상하게 파일 전송량 피크 타임에 서버 CPU의 System I/O %가 치명적으로 치솟는 병목이 발생했습니다. 디스크와 네트워크 대역폭은 텅텅 비어 있는데, 프로세스가 병목의 주범이었던 까닭은 전통적인 파일 전송 구조의 구조적 무식함에 있었습니다. 보통의 서버 코드(Nginx나 Node.js의 기본 읽기)는 하드디스크에서 유저 공간의 버퍼 메모리로 파일 청크를 읽어들인 뒤(read 시스템 콜), 다시 이것을 NIC 네트워크 소켓으로 밀어 넣습니다(send 시스템 콜). 유저 스페이스 프로그램이 단순히 데이터의 중계 배달부가 되기 위해 파일 데이터를 커널의 문턱을 넘어왔다 되돌아가는 끔찍한 컨텍스트 스위칭 낭비(2번의 메모리 복사와 이동)가 발생하고 있었습니다. 이를 원천 삭제하기 위해 커널 2.2에서 등장한 초월적 마법인 sendfile() 시스템 콜, 일명 'Zero-Copy' 아키텍처를 강제 활성화시켰습니다. 어플리케이션은 아예 데이터 본문을 보지도 않고 오직 커널에게 "A 파일의 FD(File Descriptor)를 B 소켓 FD로 직통 연결하라"는 메타 지시만 내립니다. OS 커널은 커널 스페이스의 파일 읽기 버퍼 메모리를 유저 공간으로 길어 올리지 않고, 곧바로 하드웨어 DMA 제어기를 통해 이더넷 카드 버퍼로 데이터를 미끄러뜨려 버립니다. CPU는 그저 신호등 역할만 할 뿐, 메모리 복사 작업에서 완전히 해방되었습니다. 이 단 하나의 플래그 전파를 통해 정적 자산 로딩 I/O 스레드의 타임아웃 레이트를 0%로 만들면서, OS 레이어의 추상화를 깨부수고 하부 매커니즘을 찌르는 개발자만이 낼 수 있는 성능의 극치를 맛보았습니다.

Related Posts