
libuv to wieloplatformowa biblioteka wspierająca, skupiająca się na asynchronicznych wejściach/wyjściach.
Niedawno stał się znany wydanie nowej wersji biblioteki libuv 1.45.0, który jest szeroko stosowany do multipleksowania połączeń i asynchronicznego przetwarzania we/wy w wielu projektach mających na celu wydajne przetwarzanie żądań plików i sieci, na przykład na platformie Node.js, BIND 9 i Knot.
Ci, którzy nie znają libuv, powinni wiedzieć, że to to międzyplatformowa biblioteka C, która zapewnia obsługę asynchronicznego wejścia/wyjścia w oparciu o pętle zdarzeń. Obsługuje epoll Windows kqueue IOCP, porty zdarzeń Solaris, aw systemie Linux jest jedną z bibliotek obsługujących io_uring.
O libuv
libacja jest przeznaczony przede wszystkim do użytku w Node.js, ale jest również używany przez inne projekty oprogramowania. Pierwotnie była to abstrakcja wokół libev lub Microsoft IOCP, ponieważ libev nie obsługuje IOCP w systemie Windows.
Biblioteka pozwala na zorganizowanie nieblokującej się pętli wydarzeń przy użyciu metod takich jak epoll w systemie Linux, kqueue w systemach BSD i macOS, IOCP w systemie Windows oraz porty zdarzeń w systemie Solaris
Z wyjątkowe cechy libuv:
- W pełni funkcjonalna pętla zdarzeń obsługiwana przez epoll, kqueue, IOCP, porty zdarzeń
- Asynchroniczne gniazda TCP i UDP
- Asynchroniczne rozpoznawanie DNS
- Operacje asynchroniczne plików i systemów plików
- Zdarzenia systemu plików
- Kod ucieczki ANSI kontrolowany przez TTY
- IPC z udostępnianiem gniazd, przy użyciu gniazd domeny Unix lub nazwanych potoków (Windows)
- Procesy wtórne
- pula wątków
- obsługa sygnału
- zegar o wysokiej rozdzielczości
- Prymitywy wątków i synchronizacji
Dla aplikacji dostępne są funkcje międzyplatformowe do pracy z połączeniami sieciowymi TCP i UDP w trybie asynchronicznym, asynchronicznym rozwiązywaniem DNS, asynchroniczną pracą z plikami, śledzeniem zdarzeń w systemie plików, organizacją IPC do współdzielenia gniazd, organizacją puli wątków, przetwarzaniem sygnału i wykorzystaniem precyzyjne zegary.
Biblioteka obejmuje również prymitywy do organizowania wykonywania wielowątkowego i synchronizację wątków. Wraz z pętlą zdarzeń używane są dwa abstrakcyjne podstawowe prymitywy wysokiego poziomu: „procedury obsługi” do implementacji długotrwałych obiektów, które wykonują wiele operacji, oraz „żądania” do wykonywania krótkotrwałych żądań.
Główne nowe funkcje libuv 1.45
Kluczowym ulepszeniem w nowej wersji jest tzw wdrożenie długo oczekiwanej obsługi asynchronicznego interfejsu I/O io_uring dostarczane przez jądro Linuksa od wersji 5.1.
Oprócz tego podkreśla również obsługa odpytywania I/O oraz możliwość pracy z buforowaniem i bez buforowania Za pomocą interfejsu API io_uring twórcy jądra próbowali zaradzić niedociągnięciom starego interfejsu aio. Pod względem wydajności io_uring jest bardzo zbliżony do SPDK i znacznie przewyższa libaio, gdy włączone jest odpytywanie.
w Libuwie, interfejs io_uring może być używany na platformach Linux z jądrem 5.1+ w asynchronicznych operacjach podstawowych manipulacji plikami takie jak odczyt, zapis, fsync, fdatasync, stat, fstat i lstat. W innych systemach operacyjnych i systemach ze starszymi jądrami pula wątków jest nadal używana.
Wspomniano, że testy wydajności wykazały, że użycie io_uring w libuv może osiągnąć 8-krotny wzrost wydajności. Prace nad dodaniem io_uring do libuv były wspierane przez ISC (Internet Systems Consortium), które korzysta z omawianej biblioteki na serwerze BIND DNS.
Inne ulepszenia w nowej wersji to m.in ustawienie pojedynczego rozmiaru sterty 8 MB dla puli wątków na wszystkich architekturach i platformy.
Podkreśla się również, że dodano nowe API uv_metrics_info() do zbierania metryk, takie jak liczba iteracji w pętli zdarzeń, łączna liczba przetworzonych zdarzeń oraz liczba zdarzeń oczekujących w kolejce w momencie wysłania żądania.
Wreszcie, Jeśli chcesz dowiedzieć się więcej na ten temat, powinieneś wiedzieć, że kod projektu jest napisany w C i jest rozpowszechniany na licencji MIT. Możesz sprawdzić szczegóły W poniższym linku.