gpt4 book ai didi

javascript - Nodejs 进程锁定读取阻塞 FUSE 文件

转载 作者:行者123 更新时间:2023-11-29 22:01:29 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

此外,根据 this libuv issue report #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
}
});
});

关于javascript - Nodejs 进程锁定读取阻塞 FUSE 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23498333/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com