#libuv

К вопросу использования #epoll вместо хорошо знакомых и «традиционных» select & poll. Т.е. асинхронной работы с чем-либо посредством polling’а и мультиплексирования.

Недавно пришлось заниматься реализацией очереди событий для AMQP-CPP. В одном из продуктов решено сделать связь агентских частей с основным «контроллером» через #AMQP, в качестве брокера #RabbitMQ (всё стандартно, обычный кластер и TLS-соединения).

Вот только агенты продукта активно используют асинхронно-реактивное программирование с хорошей «горизонтальной масштабируемостью». Когда достигнуто полноценное sharing nothing, не просто горизонтальная масштабируемость через lock-free или wait-free и закон Амдала. Исключается много всего и сразу, как старый-добрый cache ping-pong, так и печаль с false sharing.

Отсюда внутри агентов и своё управление потоками с выделениями памяти. Не только в плане heap (динамической памяти, со своими аллокаторами а-ля #jemalloc от #Facebook), но и приколы вокруг узлов #NUMA и даже huge pages (снижающих «давление» на #TLB, меньше промахов).

Первая же проблема выплыла почти сразу — не реально использовать библиотеку AMQP-CPP с уже предоставляющейся поддержкой #libev, #libuv, #libevent. Несовместимы эти очереди сообщений с имеющейся моделью управления потоками и организации задач на агентах.

Почему был взят epoll

Подход используемый в #epoll выглядит более современно, меньше копирований памяти между user space и kernel space. А при появлении данных в отслеживаемом файловом дескрипторе можно напрямую перейти по указателю на объект класса или структуру данных. Тем самым обходиться без поиска дескриптора по индексным массивам/контейнерам. Сразу же работать с экземплярами объектов оборачивающих нужное #tcp -соединение, того самого, в которое и пришли данные.

И тут обозначилась вторая проблема, что используема AMQP-библиотека не вычитывает данные целиком из потока сокета. Например, забирает данные лишь до тех пор, пока не насытится автомат состояний (finite-state machine), выполняющий парсинг сущностей AMQP-протокола.

Используя #epoll приходится выбирать на какой вариант обработки событий ориентироваться:

  • срабатывание оповещений «по уровню» (level-triggered),
  • выбрасывания событий «по фронту» (edge-triggered).

И беда с библиотекой в очередной раз показала, что нельзя использовать работу «по фронту» (edge-triggered) не изучив досконально работу подсистемы отвечающей за вычитывание данных из файловых дескрипторов. И появление флага EPOLLET в коде является маркером, о том, чтобы проводить аудит использовавшихся решений.

Про Edge Triggered Vs Level Triggered interrupts можно почитать в https://venkateshabbarapu.blogspot.com/2013/03/edge-triggered-vs-level-triggered.html)

#programming #linux #трудовыебудни

Pelle Wessmanvoxpelli
2024-10-11

At a very basic core level, a comparison between @deno_land 2.0 and @nodejs could probably be summarised as:

- JS-runtime: Both uses V8
- Asynchronous I/O: Node.js uses , Deno uses
- Native code: Node.js uses C++, Deno uses Rust

So essentially it boils down to libuv vs tokio and C++ vs rust

If one ignore everything else about Node.js and Deno, the winner is clear to me.

2024-09-01

Красно-черные сигналы в node.js

Что происходит, когда мы отправляем сигнал приложению на node.js? Когда вызываются обработчики? А где хранятся? Во всем этом мы разберемся в данной статье, начиная от пользовательского кода на javascript и до встречи с операционной системой.

habr.com/ru/articles/840108/

#javascript #nodejs #libuv #красночерное_дерево #epoll #linux #сигналы

2024-07-22

Куча таймеров в node.js

А знаете ли вы, как на самом деле работают таймеры в node.js? В этой статье мы разберемся, как хранятся таймеры, когда запускаются и как в целом все работает вплоть до системных вызовов.

habr.com/ru/articles/830644/

#javascript #nodejs #libuv #куча #очередь #epoll #linux #таймеры

often frowned uponvirtulis@loud.computer
2024-05-22

Funsies: node-gyp is broken on latest kernel.

Likely some other libuv stuff as well. In case you're experiencing more weirdness than usual, consider a downgrade :blobcatthumbsup:​

github.com/nodejs/node/issues/

#nodejs #linux #libuv

2023-06-14

Does anyone know what a #libuv / #nodejs uv_write_cb status of -89 means? I'm seeing:

STREAM 18901: do read
STREAM 18901: onWriteComplete -89 undefined
Error: ERR_STREAM_DESTROYED: Error [ERR_STREAM_DESTROYED]: Cannot call write after a stream was destroyed

In my logs with NODE_DEBUG=stream enabled, full stacktrace at: github.com/websockets/ws/issue

GripNewsGripNews
2023-05-28

🌖 libuv引入io_uring支援
➤ 提升Linux系統下檔案操作效能
github.com/libuv/libuv/pull/39
libuv是一個跨平台的C庫,提供事件驅動的非同步I/O操作。最近,libuv引入了io_uring支援,這是一種新的Linux內核機制,可以提升檔案操作的效能。當內核版本足夠新時,libuv會使用io_uring進行非同步的檔案操作,否則會回退到線程池。這項工作由ISC(Internet Systems Consortium)贊助,效能提升高達8倍。
+ 這是一個非常好的消息,尤其對於需要高效率檔案操作的應用程式來說。期待看到更多的庫和工具支援io_uring。
+ 這個新的支援對於Linux系統下的開發者來說非常有用。希望能夠看到更多的庫和工具跟進,提供更好的效能和使用體驗。

2023-03-01

The biggest complaint people have about #webview is the filesystem api is inconsistent.

This is absolutely true, and sockets.sh completely replaces it.

Our file system api should be instantly familiar to #nodejs developers, it uses #libuv under the hood😎

See: @cjd@pkteerium.xyzcjd
2022-02-20

WOOOOOOO finally runs for more than 30 seconds with the timer infrastructure rewritten with / rather than .
😅

2019-04-01

trying to get #NodeJS to talk to netlink, to listen for changes to network interfaces. thought it was gonna be pretty easy. ended up down the rabbit hole, adding tests to someone else's old #libuv PR.
github.com/libuv/libuv/pull/22

2018-06-20

#Lua on #wasm would be a fabulous bonkers cross over. Also let me just quote,
"hWHAT github.com/jvburnes/node9"
@k 🔗 cybre.space/users/k/statuses/1

"Node9 is a hosted 64-bit operating system based on Bell Lab's Inferno OS, but using the Lua scripting language instead of Limbo and the LuaJIT high performance virtual machine instead of the Dis virtual machine. It also uses the libuv I/O library for maximum portability, efficient event processing and thread management.

#plan9" indeed. #9p #luajit #libuv #node9

2018-04-14

take: #libuv is not very good

2018-01-22
Marcin Cieślaksaper
2017-11-12

Oh @rysiek I think you know me long enough to know I am never excited about package management :) It seriously didn't cross my mind at all when I was writing this ( who?:) @charlag

ftw!

Client Info

Server: https://mastodon.social
Version: 2025.04
Repository: https://github.com/cyevgeniy/lmst