我有一个nodejs webserver,它读取文件并提供内容。某些文件是FUSE虚拟文件,它们可能会在其支持服务等待数据提供时长时间阻止读取。
似乎如果其中5个读取请求堆积,则该进程将不再从任何文件读取。此外,如果有必要,我不确定如何终止这些待处理的读取。
这是nodejs的限制还是FUSE文件系统的行为方式与FUSE的期望不一致?
答案 0 :(得分:2)
根据this NodeJS issue report #7256,如果底层libuv I / O线程池中的线程试图从阻塞的文件中读取,则该线程将挂起,直到支持目标文件的设备或进程产生对该线程的控制权,即读取调用返回。
此外,根据this libuv issue report #649,* nix系统上的NodeJS v0.10依赖于固定大小的线程池,默认大小为4。这解释了为什么系统在约5次读取尝试后似乎锁定。
这种情况可以通过以下几种方式解决:
使用UV_THREADPOOL_SIZE环境变量增加底层libuv线程池的大小。通过在Node进程开始受到影响之前简单地允许更多机会读取来掩盖问题。
使用最近导出的O_NONBLOCK标志打开阻止文件。此更改是Node 0.10代码流的一部分,我已确认它按预期工作(从源代码编译节点)设置_XOPEN_SOURCE但不在本评论发布时的最新0.10.28版本中。认为非阻塞功能将成为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
}
});
});
答案 1 :(得分:0)
您使用readFileSync
来读取这些文件吗?如果是这样,那就是你的问题。
节点应该能够在仍然提供请求的同时等待大量资源。向我们展示您的代码以从文件中读取。