io_uring
io_uring (wcześniej znany jako aioring ) to interfejs wywołań systemowych jądra Linuksa dla asynchronicznych operacji we/wy urządzeń pamięci masowej, rozwiązujący problemy z wydajnością z podobnymi interfejsami zapewnianymi przez funkcje takie jak read()
/ write()
lub aio_read()
/ aio_write()
itp. dla operacje na danych, do których dostęp mają deskryptory plików .
Rozwój jest w toku, nad którym pracował głównie Jens Axboe z Meta.
Interfejs
Działa poprzez tworzenie dwóch cyklicznych buforów , zwanych „pierścieniami kolejek”, służących odpowiednio do przechowywania przedłożonych i zakończonych żądań we/wy. W przypadku urządzeń pamięci masowej są one nazywane kolejką przesyłania (SQ) i kolejką zakończenia (CQ). Utrzymywanie tych buforów współużytkowanych przez jądro i aplikację pomaga zwiększyć wydajność operacji we/wy , eliminując konieczność wydawania dodatkowych i kosztownych wywołań systemowych w celu skopiowania tych buforów między nimi. Zgodnie z dokumentem projektowym io_uring, bufor SQ jest zapisywalny tylko przez aplikacje konsumenckie, a bufor CQ jest zapisywalny tylko przez jądro.
Historia
Interfejs jądra został przyjęty w jądrze Linuksa w wersji 5.1. Biblioteka liburing
zapewnia interfejs API do łatwej interakcji z interfejsem jądra z przestrzeni użytkownika . Jądro Linuksa obsługuje asynchroniczne operacje we/wy od wersji 2.5, ale uznano je za trudne w użyciu i nieefektywne. Ten starszy interfejs API obsługiwał tylko niektóre niszowe przypadki użycia .
Linki zewnętrzne
- Efektywne I/O z io_uring , szczegółowy opis motywacji stojących za io_uring, interfejs (struktury danych itp.) oraz ocena wydajności
liburing
repozytorium źródełio_uring
katalog źródłowy w repozytorium jądra Linux