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