Nodejs进程locking从阻塞FUSE文件读取

我有一个nodejs webserver读取文件并提供内容。 其中一些文件是FUSE虚拟文件,这些文件在后台服务等待数据提供时可能会阻塞很长一段时间的读取。

看来,如果这些读取请求中的5个堆积起来,该过程将不再从任何文件读取。 此外,我不知道如何终止这些挂起的读取,如有必要。

这是nodejs的限制还是FUSE文件系统的行为方式与FUSE的期望不一致?

根据此NodeJS问题报告#7256 ,如果底层libuv I / O线程池中的线程尝试从阻塞的文件读取,线程将挂起,直到支持目标文件的设备或进程将控制权交给线程,即读取调用返回。

此外,根据libuv问题报告#649 ,* nix系统上的NodeJS v0.10依靠一个默认大小为4的固定大小的线程池。 这解释了为什么在5次读取尝试后系统似乎locking了。

这种情况可以通过几种方式解决:

  1. 使用UV_THREADPOOL_SIZE环境variables增加底层libuv线程池的大小。 通过简单地在节点进程开始受到影响之前允许更多的机会读取,这就掩盖了这个问题。

  2. 使用最近导出的O_NONBLOCK标志打开阻塞文件。 此更改是节点0.10代码stream的一部分,我已经确认它按预期方式工作(从具有_XOPEN_SOURCE设置的源代码编译节点),但在此注释时不在最新的0.10.28版本中。 看来有理由相信非阻塞function将成为0.10.29版本的一部分。 支持该文件的设备也必须遵守O_NONBLOCK标志才能正常工作。

一些代码来演示选项#2

var constants = process.binding('constants'); fs.open('/path/to/file', constants.O_NONBLOCK, function(err,fd){ fs.read(fd, buf, 0, 10, null, function(err, bytesRead, buffer){ // Read should return immediately if(err.code === 'EAGAIN'){ // Not ready to read, try again later } else { // Do something } }); }); 

您是否使用readFileSync从这些文件读取? 如果是这样,那你的问题就在那里。

节点应该能够在服务请求的同时等待大量的资源。 告诉我们你的代码从文件中读取。

Interesting Posts