리눅스용 비동기 I/O API로 기존 시스템 호출을 하던 epoll과 달리 제한없이 API를 제공하는데 목적이 있다. io_uring은 kernel과 user mode에서 작동하는 시스템 호출이 아닌 링 버퍼로 주로 통신한다. 그렇기 때문에 기존 시스템보다 더 빠르고 효율적으로 데이터를 처리할 수 있다.
Created by Donald Hunter
Figure 1: A visual representation of the io_uring submission and completion queues.
io_uring은 총 두 개의 링 버퍼를 사용한다.
프로그램이 작업을 요청할 때 커널이 작업을 처리하고 작업이 끝나면 결과를 알려준다.
과거 epoll의 경우 많은 수의 시스템 콜이 필요했으며 성능 제한이 있었다. aio의 경우 여러 작업을 동시에 처리하는 것은 가능했지만 디스크 I/O만 지원한다는 한계가 있었다. 하지만 io_uring은 여러 작업을 동시에 요청하더라도 동시에 처리가 가능하다. 또한, polling mode로 더 빠른 처리가 가능하다. 하지만 이것이 무조건적으로 io_uring을 사용해야한다는 것은 아니다.
성능에 영향을 주는 요소는 총 4가지가 있다.
성능을 비교한 결과는 다음과 같다
s + w = 각 요청마다 한 번의 시스템 콜을 필요로 한다
(s + t) / n = t는 커널 처리 비용과 io_uring 프레임워크 비용의 함이며 n은 한번에 처리할 수 있는 요청 수다
결과적으로 적게 연결할 경우 epoll이 더 좋으며 1000개 이상의 연결에서는 io_uring의 성능이 더 좋았다.
epoll 성능이 더 좋음
시스템 콜 전환 비용이 적음 (약 230ns)
적은 연결에서는 epoll이 더 좋음
많은 연결(1000개 이상)에서는 io_uring이 약 10% 더 좋은 성능
시스템 콜 전환 비용이 큼 (약 700ns)
많은 동시 연결이 필요한 경우: io_uring 유리
적은 연결이나 간단한 처리: epoll 유리
실제 사용 환경에서 테스트해보고 결정하는 것이 best
CPU 보안 설정, 연결 수, 데이터 크기 등이 성능에 영향
ref.
https://developers.redhat.com/articles/2023/04/12/why-you-should-use-iouring-network-io
https://www.alibabacloud.com/blog/io-uring-vs--epoll-which-is-better-in-network-programming_599544
https://unixism.net/loti/what_is_io_uring.html