io_uring_0204
IO_URING A web server with 'liburing'
'liburing'를 이용한 웹 서버 프로그램
우리는 select(2), poll(2) 및 epoll(7)이 로컬/일반 파일에 대한 작업을 항상 준비 상태로 보고하기 때문에
libuv(NodeJS를 지원하는 라이브러리)와 같은 라이브러리는 파일 I/O를 처리하기 위해 별도의 스레드 풀을 사용한다는 점을
소개 부분에서 논의했습니다.
'io_uring'의 가장 큰 장점 중 하나는 단일하고 깔끔한 통일성을 제공하며, 무엇보다도 다양한 유형의 I/O에 대해
효율적인 인터페이스를 제공한다는 것입니다.
이 예에서는 추가 작업인 accept()와 'io_uring'을 사용하여 이를 수행하는 방법을 살펴보겠습니다.
readv() 및 writev()에 대한 작업을 수행하면 간단한 웹 서버를 작성할 수 있습니다!
이 웹 서버는 다양한 Linux 프로세스 모델과 이들 모델의 성능을 서로 비교하기 위해 작성한 기사 시리즈에
포함된 프로그램인 ZeroHTTPd용으로 작성한 코드를 기반으로 합니다.
나는 'io_uring' 인터페이스만 사용하도록 ZeroHTTPd를 다시 작성했습니다.
다음은 ZeroHTTPd를 통해 제공되는 인덱스 페이지입니다.
📦 Running this program
이 프로그램을 사용하려면 index.html 파일과 함께 사용할 이미지가 있는 "public(공용)" 폴더가 포함된 디렉터리에서 실행해야 합니다.
예제 프로그램의 빌드 지침을 따랐다면 새로 빌드된 바이너리가 빌드(build) 디렉터리에 있어야 합니다.
"public" 폴더가 있는 git repo의 루트 디렉터리로 변경하여 실행해야 합니다.
모든 예제를 빌드하고 이 웹 서버 예제를 실행하는 샘플 세션은 다음과 같습니다.
📦 Program structure
무엇보다 먼저 main() 함수는 setup_listening_socket()을 호출하여 지정된 포트에서 수신 대기합니다.
그러나 실제로 연결을 수락하기 위해 accept()를 호출하지는 않습니다.
나중에 설명하겠지만 'io_uring'에 대한 요청을 통해 이를 수행합니다.
프로그램의 핵심은 'io_uring'에 대한 제출(자체 및 다른 함수를 통해)을 발행하고 완료 대기열 항목을 기다리고
이를 처리하는 server_loop() 함수입니다.
좀 더 자세히 살펴보겠습니다.
SQE를 얻고 'liburing'에서 io_uring_prep_accept()를 사용하여 제출할 accept() 작업을 준비합니다.
우리는 각 제출물을 추적하기 위해 구조체 요청을 사용합니다.
이러한 인스턴스에는 한 상태에서 다음 상태로 진행되는 각 요청의 컨텍스트가 있습니다.
구조체 요청을 살펴보겠습니다.
