2016-07-07 27 views
0

我读过几篇文章描述了如何在节点事件循环工作,以及如何异步操作可以从一个单一的“主”线程来实现,但我很清楚的一两件事 -所有的异步IO nodejs代码都使用libuv吗?

是否所有异步IO代码的NodeJS在引擎盖下使用libuv? 例如 - 通过Sequelize连接到DB /乏味

的目标,我的理解是,以确定是否增加process.env.UV_THREADPOOL_SIZE将打开一个潜在的瓶颈与我们的数据库连接。我在日志中看到超时,等待数据库连接,尽管数据库服务器从未显示任何性能问题。

这是我一直在阅读文章 -

https://www.future-processing.pl/blog/on-problems-with-threads-in-node-js/ http://abdelraoof.com/blog/2015/10/28/understanding-nodejs-event-loop/ https://nodesource.com/blog/understanding-the-nodejs-event-loop/
When is the thread pool used?

+0

libuv用于异步I/O。并非所有异步事件(例如'setTimeout')正在执行I/O操作。但考虑到libuv [最初是为Node.js开发的](https://github.com/libuv/libuv#overview),我想说所有的异步I/O都可以用它来处理。 –

+0

感谢您的意见。为了清晰起见,我更新了我的问题。 – Jeremy

回答

0

所有异步操作不使用libuv线程池。它们都可以通过libuv中的接口,但并不是所有的东西都使用libuv内部的线程。

例如,定时器不使用线程,网络调用不使用线程。它们都使用OS级别的异步功能。我的理解是,所有主要平台都使用线程池进行异步磁盘I/O(尽管某些平台中存在OS级别的异步磁盘I/O)。其他可以由给定库实现的异步操作,例如读取温度探测器或类似的东西,都可以使用他们自己的方法(无论他们觉得最合适)。它不受libuv或node.js的支配。

这将需要检查实现特定数据库的代码,以了解数据库瓶颈可能位于何处。它可能使用线程,或者它可能会限制同时连接数据库的数量。它可能有自己的内部连接池,可能需要增加。只有检查特定的代码以及它如何处理您观察到的特定情况才能确定地告诉您。没有“通用”的答案。这取决于db.json的db接口是如何编码的。