Confusion about node.js internal asynchronous I/O mechanism
Asked Answered
O

2

25
  1. I have learned that node.js use libeio internally to perform async file I/O, with thread pool, on *nix platform, am I right?
  2. What about async network I/O? Is it done by libev? Is there also a thread pool?
  3. If there is thread pool inside, how could it be more efficient than traditional one-thread-per-request model? And is it one thread per I/O request?
  4. And what's the mechanism on windows? I know it's done by IOCP, and there's a kernel level thread pool, right?
  5. Why linux doesn't have a native completely AIO mechanism like windows IOCP yet? Will it have in future?

Update according to changchang's answer:

  1. I took a quick view at the source code @changchang have given, found that the default thread pool size can be reset by UV_THREADPOOL_SIZE, I'm wondering in which case this will be used?
  2. I also found getaddrinfo use this thread pool, is there any more except fs? And if all sync jobs will be done in this thread pool, is the default size '4' enough?
  3. As my understanding now, there will be 6 basic threads in node.js process: 1 V8 thread(event loop, where user javascript codes runs), 1 libuv event loop, and 4 in thread pool, am I right?
  4. And how can I see these threads in my shell(Ubuntu)? I use ps -eLf | grep node | grep -v grep only saw two:

    root 16148 7492 16148 0 2 20:43 pts/26 00:00:00 ./bin/node /home/aaron/workspace/test.js
    root 16148 7492 16149 0 2 20:43 pts/26 00:00:00 ./bin/node /home/aaron/workspace/test.js

Ordure answered 20/3, 2013 at 14:36 Comment(4)
See here https://mcmap.net/q/158062/-nodejs-event-loopNervous
node.js actually uses libuv to abstract asynchronous IO for all supported platformsKhalif
@Nervous I have read that, but cant't get straight answer from it, actually, unclear expression confuse me more. It mentioned that libeio 'perform input output asynchronously' including sockets, I doubt that. I learned this from somewhere that: because can't use epoll on regular files, so here comes libeio to perform aio with threads.Ordure
@simfoo Yeah, I know libuv, I'm wondering the mechanism under it, both *nix and windows.Ordure
K
31
  1. First of all, libuv has removed the libeio from it. But it does perform async file I/O with a thread pool like libeio just as you mentioned.

  2. libuv also removes libev. It does the async network I/O based on the async I/O interfaces in different platforms, such as epoll, kqueue and IOCP, without a thread pool. There is a event loop which runs on the main thread of uv which polls the I/O events and processes them.

  3. The thread pool inside libuv is a fixed size thread pool (4 in uinx like system). It performs a task queue role and avoids the exhaustion of the system resources by generating threads indefinitely when the requests increase.

Karolekarolina answered 21/3, 2013 at 8:39 Comment(5)
Tanks a lot, a lot resources out there is out of date, you just saved me!Ordure
@AaronWang you should accept this if it answered your question.Confection
First: libuv [...] does the async network I/O [...] without a thread pool. Later: The thread pool inside libuv [...]. It seems contradictory to me.Platitudinous
Isn't 4 a very small number, especially for io bound tasks. Does node allows to change the pool size?Peccable
^ Yes it does, through UV_THREADPOOL_SIZEWasteful
N
2

Uptil version 0.6 node used libev to run event-loop and libeio for asynchronous I/O, (Unix backend sits heavily on these two libraries). But libuv has started replacing libev and libeio in version 0.8. It performs, mantains and manages all the io and events in the event pool. libuv is the choice in cross-platform asynchronous IO libraries.

  1. Yes, upto node 0.6, deprecated in 0.8 and uses thread pool
  2. Yes, but libev does not use thread pool. See here

    Clarification : According to the link in the question I posted, libeio does support all POSIX functions dealing with I/O (which includes socket). But node author decided to use it for async file I/O only, and uses libev for network I/O. I dont know where you heard it from but you can use epoll on regular files.

  3. libev uses event loop so no problems here.

  4. Yes IOCP handles async I/O in windows, kernel does use thread pools.
  5. New linux kernel has epoll, kqueue in new BSD kernel. libev and libeio were for linux environment and provides event loop/async IO for all kernel (supports select, poll, epoll, kqueue).

Update questions:

  1. dont know much about libuv
  2. maybe enough (dont know)
  3. Here are my findings on Windows 8, checked it via Process Explorer. Showed 4 threads, 1 DLL, 1 File and 1 Section (total 7 entries) for a node application process.

  4. ps -eLf does show all threads and processes, maybe you are over-filtering it, just look for the node process pid like ps -eLf | grep x where x is pid for node process.

Nervous answered 22/3, 2013 at 20:37 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.