Javascript Nodejs进程锁定从阻塞FUSE文件的读取
我有一个nodejs Web服务器,它读取文件并提供内容。有些文件是FUSE虚拟文件,当其备份服务等待数据提供时,可能会长时间阻止读取 如果这些读取请求中有5个累积起来,进程将不再读取任何文件。此外,我不确定如果需要,如何终止这些挂起的读取Javascript Nodejs进程锁定从阻塞FUSE文件的读取,javascript,node.js,fuse,libuv,Javascript,Node.js,Fuse,Libuv,我有一个nodejs Web服务器,它读取文件并提供内容。有些文件是FUSE虚拟文件,当其备份服务等待数据提供时,可能会长时间阻止读取 如果这些读取请求中有5个累积起来,进程将不再读取任何文件。此外,我不确定如果需要,如何终止这些挂起的读取 这是nodejs的限制还是FUSE文件系统的行为方式与FUSE的预期不一致?您是否使用readFileSync读取这些文件?如果是这样,那就是你的问题 节点应该能够在仍为请求提供服务的同时等待大量资源。向我们显示要从文件中读取的代码 根据,如果底层libuv
这是nodejs的限制还是FUSE文件系统的行为方式与FUSE的预期不一致?您是否使用
readFileSync
读取这些文件?如果是这样,那就是你的问题
节点应该能够在仍为请求提供服务的同时等待大量资源。向我们显示要从文件中读取的代码 根据,如果底层libuv I/O线程池中的线程试图读取阻塞的文件,则该线程将挂起,直到支持目标文件的设备或进程将控制权让给该线程,即读取调用返回
此外,据介绍,*nix系统上的NodeJS v0.10依赖于默认大小为4的固定大小线程池。这就解释了为什么系统在5次读取尝试后出现锁定
这种情况可以通过几种方式解决:
我没有使用同步文件操作。这里是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
}
});
});