IO_URING 무엇인가요


IO_URING 무엇인가요

'io_uring'은 Facebook의 Jens Axboe가 만든 새로운 Linux용 비동기 I/O API입니다. 이는 이전 섹션에서 논의한 현재 select(2), poll(2), epoll(7) 또는 aio(7) 계열 시스템 호출의 제한 없이 API를 제공하는 것을 목표로 합니다. 비동기 프로그래밍 모델 사용자가 성능상의 이유로 이를 선택한다는 점을 고려하면 성능 오버헤드가 매우 낮은 API를 사용하는 것이 합리적입니다. io_uring 다음 섹션에서 이를 어떻게 달성하는지 살펴보겠습니다.

📦 The io_uring interface - io_uring 인터페이스

io_uring 이라는 이름은 인터페이스가 커널-사용자 공간(kernel-user space) 통신을 위한 기본 인터페이스로 링 버퍼를 사용한다는 사실에서 유래되었습니다.   관련 시스템 호출이 있지만 최소한으로 유지되며 시스템 호출의 필요성을 최대한 줄이기 위해 사용할 수 있는 폴링 모드가 있습니다.

See also: 예제 프로그램이 포함된 제출 대기열 폴링 튜토리얼 입니다.
Submission Queue Polling

📦 The mental model - 멘탈 모델

I/O를 비동기적으로 처리하는 프로그램을 구축하는 데 사용하기 위해 io_uring 구성해야 하는 멘탈 모델은 매우 간단합니다.     ⚛ 멘탈 모델이란 (chatgpt)

  • 2개의 링 버퍼가 있는데, 하나는 요청 제출용(제출 대기열 또는 SQ)이고 다른 하나는 요청 완료(완료 대기열 또는 CQ)를 알리는 것입니다.
  • 이러한 링 버퍼는 커널과 사용자 공간 간에 공유됩니다. 이를 설정한 io_uring_setup() 다음 2번의 mmap(2) 호출을 통해 사용자 공간에 매핑합니다.
  • 수행해야 할 작업(파일 읽기 또는 쓰기, 클라이언트 연결 허용 등)을 io_uring에 알려주고 이를 제출 대기열 항목(submission queue entry:SQE)의 일부로 설명하고 제출 링 버퍼의 꼬리에 추가합니다.
  • 그런 다음 제출 큐 링 버퍼에 SQE를 추가했음을 io_uring_enter() 시스템 호출을 통해 커널에 알립니다. 시스템 호출을 하기 전에 여러 SQE를 추가할 수도 있습니다.
  • 선택적으로 io_uring_enter()이 리턴되기 전에 커널이 여러 요청이 처리될 때까지 기다릴 수도 있으므로 완료 대기열에서 결과를 읽을 준비가 되었는지 알 수 있습니다.
  • 커널은 제출된 요청을 처리하고 완료 큐 링(completion queue ring) 버퍼의 꼬리에 완료 큐 이벤트(completion queue events:CQE)를 추가합니다.
  • 완료 큐 링 버퍼의 헤드에서 CQE를 읽습니다. 각 SQE에 해당하는 하나의 CQE가 있으며 여기에는 해당 특정 요청의 상태가 포함됩니다.
  • 필요에 따라 계속해서 SQE를 추가하고 CQE를 확보합니다.
  • 커널이 제출 대기열의 새 항목을 폴링하는 폴링 모드를 사용할 수 있습니다. 이렇게 하면 처리를 위해 항목을 제출할 때마다 호출하는 io_uring_enter() 시스템 호출 오버헤드가 방지됩니다 .

📦 io_uring performance - io_uring 성능

커널과 사용자 공간 사이의 공유 링 버퍼로 인해 io_uring은 제로 복사(zero-copy) 시스템이 될 수 있습니다.   커널과 사용자 공간 간에 데이터를 전송하는 시스템 호출이 관련되면 바이트 복사가 필요합니다.   그러나 io_uring에서 대부분의 통신은 커널과 사용자 공간 간에 공유되는 버퍼를 통해 이루어지기 때문에 이러한 엄청난 성능 오버헤드를 완전히 피할 수 있습니다.   시스템 호출(그리고 우리는 이를 많이 만드는 데 익숙함)이 상당한 오버헤드처럼 보이지 않을 수도 있지만, 고성능 애플리케이션에서는 시스템 호출을 많이 만드는 것이 중요해지기 시작할 것입니다.   또한 시스템 호출은 예전만큼 저렴하지 않습니다.   Specter 및 Meltdown을 처리하기 위해 운영 체제가 마련한 해결 방법을 사용하면 사소하지 않은(non-trivial) 오버헤드에 대해 이야기하고 있습니다.   Specter와 Meltdown을 처리하기 위해 운영 체제가 마련한 해결 방법을 고려하면, 이는 사소한 오버헤드가 아닙니다.   따라서 고성능 애플리케이션에서 시스템 호출을 최대한 피하는 것은 실제로 훌륭한 아이디어입니다.

Linux에서 동기 프로그래밍 인터페이스를 사용하거나 비동기 프로그래밍 인터페이스를 사용할 때에도 각 요청 제출에는 최소 하나의 시스템 호출이 포함됩니다.   io_uring에서는 원하는 I/O 작업을 각각 설명하는 여러 SQE 를 추가하고 'io_uring_enter()'를 한 번 호출하여 여러 요청을 추가할 수 있습니다.   초보자(starers)에게는 이것만으로도 충분합니다. 하지만 더 좋은 점이 있습니다.

커널 폴링을 수행하고 제출 대기열에 추가할 때 처리할 SQE를 선택할 수 있습니다.   이렇게 하면 SQE를 선택하도록 커널에 알리기 위해 필요한 io_uring_enter() 호출을 피할 수 있습니다.   고성능 애플리케이션의 경우, 이는 시스템 호출 오버헤드를 더욱 줄여줍니다.   자세한 내용은 제출 큐 폴링 튜토리얼을 참조하세요 .
예제 프로그램이 포함된 제출 대기열 폴링 튜토리얼 입니다.   Submission Queue Polling

공유 링 버퍼를 효과적으로 활용하면 io_uring 성능은 메모리에 크게 좌우됩니다. 폴링(polling) 모드에서는 시스템 호출을 완전히 없앨 수 있기 때문입니다.   성능 벤치마킹은 일종의 공통 기준점을 갖는 상대적인 프로세스라는 점을 기억하는 것이 중요합니다.   io_uring 논문에 따르면, 기준 머신에서 폴링 모드로 io_uring 170만 4k IOPS를 기록하는 반면, aio(7)는 608k를 기록했습니다.   두 배 이상이지만 aio(7)에는 폴링 모드가 없기 때문에 이것은 공정한 비교가 아닙니다.   하지만 폴링 모드가 비활성화된 경우에도 io_uring은 1.2M IOPS를 기록하며 이는 aio(7)의 두 배에 가깝습니다 .

인터페이스 io_uring의 원시 처리량을 확인하기 위해 no-op 요청 유형이 있습니다.   이를 통해 기준 시스템에서는 io_uring 초당 2천만 개의 메시지를 처리할 수 있습니다.   자세한 내용은 io_uring_prep_nop()을 참조하세요.   io_uring_prep_nop()

📦 An example using the low-level API - 저수준 API를 사용한 예

Unix 유틸리티가 수행하는 방식과 같이 파일을 읽고 콘솔에 인쇄하는 작은 프로그램을 작성하는 것은 cat io_uring API 에 익숙해지기 위한 좋은 출발점이 될 수 있습니다.   그러한 예를 보려면 다음 장을 참조하십시오.

📦 Just use liburing - 그냥 'liburing'을 사용하세요

낮은 레벨 io_uring API에 익숙해지는 것은 확실히 좋은 일이지만 실제 심각한 프로그램에서는 아마도 liburing에서 제공하는 고수준 인터페이스를 사용하고 싶을 것입니다.   'QEMU'와 같은 프로그램에서는 이미 이를 사용하고 있습니다.   liburing 이 존재하지 않았다면 낮은 레벨 io_uring 인터페이스 위에 추상화 계층을 구축했을 것입니다.   liburing 은 이를 수행하며 잘 고안된 인터페이스이기도 합니다.   즉, 낮은 레벨 io_uring 인터페이스가 어떻게 작동하는지 이해하기 위해 약간의 노력을 기울여야 하지만 기본적으로 당신의 프로그램에서 liburing 실제로 사용하고 있어야 합니다.

이에 대한 참조 섹션이 있지만 liburing 다음 장에서 볼 수 있는 몇 가지 예가 있습니다.


📦 The mental model - 멘탈 모델   (chatgpt)

"Mental model"이라는 용어는 특정 시스템이나 개념을 이해하기 위해 사람이 마음속에서 형성하는 심리적, 인지적 구조를 의미합니다.   이는 복잡한 시스템이나 개념을 이해하고 추론하는 데 도움을 주는 직관적인 방법으로, 사람이 시스템의 동작 방식을 쉽게 이해하고 예측할 수 있게 합니다.

⦿ "Mental model"의 의미
- 정의: 특정 시스템, 개념, 프로세스 등을 이해하고 설명하기 위해 사람들이 마음속에 형성하는 간단하고 직관적인 이해 구조.
- 목적: 복잡한 시스템을 단순화하여 이해하고, 예측하고, 문제를 해결하는 데 도움을 줌.
- 예시: 파일 시스템에서 디렉토리를 폴더로, 파일을 문서로 이해하는 것.

⦿ 전산학에서의 사용
"Mental model"은 전산학뿐만 아니라 다양한 학문 분야에서 사용됩니다.
특히 컴퓨터 과학에서는 다음과 같은 상황에서 자주 사용됩니다:
- 사용자 인터페이스 디자인: 소프트웨어나 시스템의 사용자 인터페이스를 설계할 때, 사용자가 시스템을 어떻게 이해할지에 대한 예상 모델을 만들어 사용자 친화적인 인터페이스를 설계함.
- 프로그래밍 및 시스템 설계: 복잡한 알고리즘이나 시스템 동작을 설명하거나 이해할 때, 개발자들이 "mental model"을 사용하여 직관적으로 이해하고 소통함.
- 교육 및 학습: 새로운 개념을 가르치거나 배울 때, 학습자가 쉽게 이해할 수 있도록 돕기 위해 사용.

⦿ io_uring 문서에서의 "The mental model"
io_uring 문서에서 "The mental model"이란, io_uring이라는 비동기 I/O 인터페이스의 동작 방식을 이해하기 위해 형성하는 직관적인 이해 방식을 의미할 가능성이 큽니다.
이는 io_uring의 복잡한 구조와 작동 방식을 쉽게 설명하고 이해하기 위해 사용되는 심리적 모델을 말합니다.

결론적으로, "mental model"은 전산학에서 특정 시스템이나 개념을 직관적으로 이해하고 설명하기 위해 자주 사용되는 용어입니다.   이는 특히 복잡한 시스템을 다루는 데 있어 중요한 도구로 사용됩니다.

⚛ 원문

Email 답글이 올라오면 이메일로 알려드리겠습니다.