Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add experimental support for io_uring #34388

Closed
puzpuzpuz opened this issue Jul 16, 2020 · 15 comments
Closed

Add experimental support for io_uring #34388

puzpuzpuz opened this issue Jul 16, 2020 · 15 comments
Labels
discuss Issues opened for discussions and feedbacks. feature request Issues that request new features to be added to Node.js. libuv Issues and PRs related to the libuv dependency or the uv binding. linux Issues and PRs related to the Linux platform. never-stale Mark issue so that it is never considered stale performance Issues and PRs related to the performance of Node.js. stale

Comments

@puzpuzpuz
Copy link
Member

puzpuzpuz commented Jul 16, 2020

Recent Linux kernel (5.1+) includes io_uring, a new non-blocking I/O subsystem, which might serve as a more efficient alternative to epoll. We could benefit from it and get a performance improvement in network I/O scenarios with high volume of concurrent connections and/or for fs operations.

Of course, in Node.js case we need changes made in libuv. There is an ongoing experiment aimed to add support for io_uring in libuv: libuv/libuv#2322

As this feature should be experimental (at least initially), io_uring mode could be activated under a new flag.

The goal of this issue is to improve visibility of the libuv experiment and gather some feedback.

@puzpuzpuz puzpuzpuz added linux Issues and PRs related to the Linux platform. libuv Issues and PRs related to the libuv dependency or the uv binding. performance Issues and PRs related to the performance of Node.js. labels Jul 16, 2020
@jasnell jasnell added discuss Issues opened for discussions and feedbacks. feature request Issues that request new features to be added to Node.js. labels Jul 16, 2020
@mcollina
Copy link
Member

I’m happy to benchmark this if we have a matching Node PR. It’s very interesting!

@puzpuzpuz
Copy link
Member Author

@mcollina no, we don't have a Node.js counterpart PR yet. But I hope to submit one once I find out status of the libuv PR. Will post any updates here.

@github-actions
Copy link
Contributor

There has been no activity on this feature request for 5 months and it is unlikely to be implemented. It will be closed 6 months after the last non-automated comment.

For more information on how the project manages feature requests, please consult the feature request management document.

@github-actions github-actions bot added the stale label Mar 22, 2022
@mcollina mcollina removed the stale label Mar 22, 2022
@github-actions
Copy link
Contributor

There has been no activity on this feature request for 5 months and it is unlikely to be implemented. It will be closed 6 months after the last non-automated comment.

For more information on how the project manages feature requests, please consult the feature request management document.

@github-actions github-actions bot added the stale label Sep 19, 2022
@mhdawson mhdawson removed the stale label Sep 23, 2022
@espoal
Copy link

espoal commented Oct 10, 2022

I was hoping to answer this issue with a PR, but unfortunately time has been lacking. The removal of QUIC was a disruption for some of my services, so I decided to reimplement it with IO_URING and WASM, via quinn_proto, to enable a faster implementation compared to a native NAPI approach. Unfortunately that code is owned by my previous employer, but I took a sabbatical year from work and I'm building a clean room implementation for my next gen database.

Some suggestions, coming from my personal experience:

I found implementing IO_URING via NAPI or libuv too difficult, instead I decided to take a different approach, by enabling syscalls via NAPI. You can then write a WASM module that setup io_uring and interact with it using shared memory. Once io_uring is setup you can use it for anything you want (network, disk IO, asynchronous crypto or DNS, ...)

This way you're not only extremely simplifying your work, but you are enabling code reuse across several WASM implementations (Node, Deno, ....). This approach marks almost a philosophical departure from the current Node.js monolithic architecture, in the sense that it looks a lot like a micro kernel with loaded modules.

I think this could be of interest for #44325. CC: @mcollina @jasnell

@mcollina mcollina added the never-stale Mark issue so that it is never considered stale label Oct 10, 2022
@espoal
Copy link

espoal commented Oct 12, 2022

For the future engineer who will have to implement this, I created awesome io_uring as a collection of articles, tutorials, libraries and examples to help implement this interface.

@github-actions
Copy link
Contributor

There has been no activity on this feature request for 5 months and it is unlikely to be implemented. It will be closed 6 months after the last non-automated comment.

For more information on how the project manages feature requests, please consult the feature request management document.

@github-actions github-actions bot added the stale label Apr 11, 2023
@bnoordhuis
Copy link
Member

I'm going to close this because it's not actionable for node. io_uring support will likely come to libuv soon (I'm working on it) but it will be a transparent change to node.

@bnoordhuis bnoordhuis closed this as not planned Won't fix, can't repro, duplicate, stale Apr 11, 2023
@espoal
Copy link

espoal commented Apr 19, 2023

io_uring support has been merged into node libuv!!! Thanks @bnoordhuis for your work

@mcollina
Copy link
Member

@espoal it was not merged into node.js just yet I guess. We'll need to wait for a libuv update here.

@espoal
Copy link

espoal commented Apr 19, 2023

@mcollina yes you're right :) Is there anything I can do to help with the process of integrating io_uring?

@mcollina
Copy link
Member

Once there is a new release of libuv, this will be updated

@adityapatadia
Copy link

https://github.com/libuv/libuv/releases/tag/v1.45.0 New version released! Hope we will get nodejs support soon.

@SebJansen
Copy link

Node v20 released with libuv 1.46 if I'm not mistaken, will we see support in v21?

* \[[`6199e1946c`](https://github.com/nodejs/node/commit/6199e1946c)] - **deps**: upgrade to libuv 1.46.0 (Santiago Gimeno) [#48618](https://github.com/nodejs/node/pull/48618)

@jdmarshall
Copy link

@bnoordhuis The commentary around this functionality in libuv implies that libuv users will need to rework their code to take full advantage of the io_uring support. So unless I'm reading that wrong, "there's nothing for us to do" is not correct. You might get some benefit without doing anything, but there's more to be had.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
discuss Issues opened for discussions and feedbacks. feature request Issues that request new features to be added to Node.js. libuv Issues and PRs related to the libuv dependency or the uv binding. linux Issues and PRs related to the Linux platform. never-stale Mark issue so that it is never considered stale performance Issues and PRs related to the performance of Node.js. stale
Projects
Status: Pending Triage
Development

No branches or pull requests

9 participants