Javascript Nodejs进程锁定从阻塞FUSE文件的读取

Javascript Nodejs进程锁定从阻塞FUSE文件的读取,javascript,node.js,fuse,libuv,Javascript,Node.js,Fuse,Libuv,我有一个nodejs Web服务器,它读取文件并提供内容。有些文件是FUSE虚拟文件,当其备份服务等待数据提供时,可能会长时间阻止读取 如果这些读取请求中有5个累积起来,进程将不再读取任何文件。此外,我不确定如果需要,如何终止这些挂起的读取 这是nodejs的限制还是FUSE文件系统的行为方式与FUSE的预期不一致?您是否使用readFileSync读取这些文件?如果是这样,那就是你的问题 节点应该能够在仍为请求提供服务的同时等待大量资源。向我们显示要从文件中读取的代码 根据,如果底层libuv

我有一个nodejs Web服务器,它读取文件并提供内容。有些文件是FUSE虚拟文件,当其备份服务等待数据提供时,可能会长时间阻止读取

如果这些读取请求中有5个累积起来,进程将不再读取任何文件。此外,我不确定如果需要,如何终止这些挂起的读取


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

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

节点应该能够在仍为请求提供服务的同时等待大量资源。向我们显示要从文件中读取的代码

根据,如果底层libuv I/O线程池中的线程试图读取阻塞的文件,则该线程将挂起,直到支持目标文件的设备或进程将控制权让给该线程,即读取调用返回

此外,据介绍,*nix系统上的NodeJS v0.10依赖于默认大小为4的固定大小线程池。这就解释了为什么系统在5次读取尝试后出现锁定

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

  • 使用UV\u THREADPOOL\u size环境变量增加底层libuv线程池的大小。这通过在节点进程开始出现问题之前允许更多的读取机会来掩盖问题

  • 使用最近导出的O_NONBLOCK标志打开阻塞文件。此更改是节点0.10代码流的一部分,我已确认它按预期工作(已使用_XOPEN_source set从源代码编译节点),但在发表此评论时不在最新的0.10.28版本中。似乎有理由相信非块功能将成为0.10.29版本的一部分。支持文件的设备还必须遵守O_NONBLOCK标志才能正常工作

  • 演示选项2的一些代码


    我没有使用同步文件操作。这里是read调用:
    fs.read(self.fd,self.pool,0,self.pool.length,null,onread)如果FUSE虚拟文件中的数据随时可用,或者如果文件描述符指向常规文件,则它可以正常工作并调用回调。如果虚拟文件阻塞,那么进程会明显变慢,直到它在5次未完成的读取时被占用。事实证明,FUSE是不相关的,因为该行为有效地模拟了从写入端尚未连接的命名管道读取。node.js是否支持这样读取命名管道?
    
    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
            }
        });
    });