Для приложений доступны многоплатформенные функции для работы с сетевыми соединениями TCP и UDP в асинхронном режиме, асинхронного разрешения имён DNS, асинхронной работой с файлами, отслеживании событий в файловой системе, организации IPC для совместного доступа к сокетам, организации пула потоков (Thread pool), обработки сигналов и использования высокоточных таймеров. Также библиотека включает примитивы для организации многопоточного выполнения и синхронизации потоков. В сочетании с циклом обработки событий применяются два базовых абстрактных высокоуровневых примитива: «дескрипторы» (handles) для реализации долгоживущих объектов, выполняющих несколько операций, и «запросы» (requests) для выполнения короткоживущих запросов.
Ключевым улучшением в новом выпуске стала реализация давно ожидаемой поддержки интерфейса асинхронного ввода/вывода io_uring, предоставляемого ядром Linux, начиная с выпуска 5.1, и примечательного поддержкой полинга (polling) ввода/вывода и возможностью работы как с буферизацией, так и без буферизации. В API io_uring разработчики ядра попытались устранить недостатки старого интерфейса aio. По производительности io_uring очень близок к SPDK и существенно опережает libaio при работе с включённым полингом.
В libuv интерфейс io_uring может применяться на платформах Linux с ядром 5.1+ в примитивах для асинхронной работы с файлами, таких как read, write, fsync, fdatasync, stat, fstat и lstat. На других ОС и системах со старым ядром продолжает использоваться пул потоков. Проведённые тесты производительности показали, что применение io_uring
в libuv позволяет добиться повышения пропускной способности в 8 раз. Работа по добавлению io_uring в libuv проведена при поддержке организации ISC (Internet Systems Consortium), применяющей рассматриваемую библиотеку в DNS-сервере BIND.
Из других улучшений в новой версии выделяется выставление единого размера стека в 8 МБ для пула потоков на всех архитектурах и платформах. Добавлен новый API uv_metrics_info() для сбора метрик, таких как счётчик итераций в цикле событий, общее число обработанных событий и число событий, ожидающих в очереди во время отправки запроса.
Источник: http://www.opennet.ru/opennews/art.shtml?num=59213