Наскоро стана известно пускането на новата версия на библиотеката libuv 1.45.0, който се използва широко за мултиплексиране на връзки и асинхронна I/O обработка в много проекти, насочени към високопроизводителна обработка на файлови и мрежови заявки, например на платформата Node.js, BIND 9 и Knot.
За тези, които не знаят за libuv, трябва да знаят, че това е C библиотека за различни платформи, която осигурява поддръжка за асинхронен I/O въз основа на цикли на събития. Поддържа epoll Windows kqueue IOCP, портове за събития на Solaris и на Linux е една от библиотеките, които поддържат io_uring.
Относно libuv
libuv е предназначен основно за използване в Node.js, но се използва и от други софтуерни проекти. Първоначално това беше абстракция около libev или Microsoft IOCP, тъй като libev не поддържа IOCP в Windows.
Библиотека позволява да се организира неблокиращ цикъл от събития използване на методи като epoll на Linux, kqueue на BSD и macOS, IOCP на Windows и портове за събития на Solaris
От изключителни характеристики на libuv:
- Пълнофункционален цикъл на събития, поддържан от epoll, kqueue, IOCP, портове за събития
- Асинхронни TCP и UDP сокети
- Асинхронна DNS резолюция
- Асинхронни операции на файлове и файлови системи
- Събития на файловата система
- TTY контролиран ANSI изходен код
- IPC със споделяне на сокет, използване на Unix домейн сокети или именувани канали (Windows)
- Вторични процеси
- пул от нишки
- обработка на сигнали
- часовник с висока резолюция
- Нишки и примитиви за синхронизация
Налични са функции за различни платформи за приложения за работа с TCP и UDP мрежови връзки в асинхронен режим, асинхронна DNS резолюция, асинхронна работа с файлове, проследяване на събития във файловата система, IPC организация за споделяне на сокет, организация на обработка на сигнали в пул от нишки и използване на таймери с висока точност.
Библиотека също включва примитиви за организиране на многопоточно изпълнение и синхронизиране на нишки. Заедно с цикъла на събития се използват два абстрактни основни примитива на високо ниво: „манипулатори“ за внедряване на дълготрайни обекти, които изпълняват множество операции, и „заявки“ за изпълнение на краткотрайни заявки.
Основни нови характеристики на libuv 1.45
Ключово подобрение в новата версия е внедряване на дългоочакваната поддръжка за асинхронния I/O интерфейс io_uring предоставя се от ядрото на Linux от версия 5.1.
В допълнение към това, той също така подчертава поддръжка за I/O polling и възможност за работа с и без буфериране С API io_uring разработчиците на ядрото се опитаха да се справят с недостатъците на стария интерфейс aio. По отношение на производителността, io_uring е много близък до SPDK и значително превъзхожда libaio, когато анкетирането е активирано.
в libuv, интерфейсът io_uring може да се използва на Linux платформи с ядро 5.1+ в асинхронни примитиви за манипулиране на файлове като четене, запис, fsync, fdatasync, stat, fstat и lstat. В други операционни системи и системи с по-стари ядра все още се използва пулът от нишки.
Споменава се, че тестовете за производителност са показали, че използването на io_uring в libuv може да постигне 8x увеличение на производителността. Работата по добавянето на io_uring към libuv беше подкрепена от ISC (Internet Systems Consortium), който използва въпросната библиотека на BIND DNS сървъра.
Други подобрения в новата версия включват задаване на един размер на купчината от 8 MB за пула от нишки на всички архитектури и платформи.
Също така се подчертава, че добави нов API uv_metrics_info() за събиране на показатели, като броя на итерациите в цикъла на събитията, общия брой на обработените събития и броя на събитията, чакащи в опашката към момента на изпращане на заявката.
И накрая, Ако се интересувате да научите повече за това, трябва да знаете, че кодът на проекта е написан на C и се разпространява под лиценза на MIT. Можете да проверите подробностите В следващия линк.