2

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

似乎如果这些读取请求中的 5 个堆积起来,则该进程将不再从任何文件中读取。另外,我不确定如何在必要时终止这些挂起的读取。

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

4

2 回答 2

2

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

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

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

  1. 使用 UV_THREADPOOL_SIZE 环境变量增加底层 libuv 线程池的大小。这通过简单地在 Node 进程开始受苦之前允许更多的阅读机会来掩盖这个问题。

  2. 使用最近导出的 O_NONBLOCK 标志打开阻塞文件。此更改是 Node 0.10 代码流的一部分,我已确认它按预期工作(已从源代码编译 Node 并设置了 _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
        }
    });
});
于 2014-06-05T01:16:57.090 回答
0

你是readFileSync用来读取这些文件的吗?如果是这样,那就是你的问题。

节点应该能够在服务请求的同时等待大量资源。向我们展示您的代码以从文件中读取。

于 2014-05-06T15:29:40.463 回答