NodeJS 正在读取相同的文件阻塞?

NodeJS is reading the same file blocking?

我们有一个后端 expressjs 服务器,只要前端客户端连接,它就会从磁盘读取许多文件。

在 OS 级别,这些读取是否阻塞?

即,如果两个人同时连接,第二个被安排的人是否必须等到当前正在阅读文件的第一个人完成后才能阅读文件?

我们只是使用 fs.readFile 来读取文件。

编辑:我正在实施缓存(这是一个遗留代码库,不要讨厌我),我只是好奇这些读取是否阻塞,这可能会缩短响应时间,而不必等到文件免费阅读。

fs.readFile() 不会阻塞 nodejs。这是一个 non-blocking,异步操作。当一个 fs.readFile() 操作正在进行时,其他 nodejs 代码可以 运行.

如果两个 fs.readFile() 调用同时运行,它们将并行进行。

Nodejs 本身使用原生 OS 线程池,文件操作的默认大小为 4,因此它将支持最多 4 个文件并行操作。超过 4 个,它将下一个操作排队,因此当 4 个中的一个完成时,下一个将开始执行。

在OS内,会对这些不同的线程进行时间分片,实现并行运行。但是,在旋转驱动器的磁盘控制器本身,一次只能发生一个特定的读取操作,因为磁盘头在给定时间只能在一个磁道上。因此,从旋转磁盘的不同部分读取的底层读取操作最终将在磁盘控制器上序列化,因为它移动磁盘头以从给定磁道读取。

但是,如果两次单独的读取尝试从同一个文件读取,OS 通常会缓存该信息,这样第二次读取就不必再次从磁盘读取,它只会获取来自 OS 缓存的数据。

I inherited this codebase and am going to implement some caching anyway, but was just curious if caching would also improve response time since we would be reading from non-blocking process memory instead of (potentially) blocking filesystem memory.

OS 文件缓存经过大量优化(这是操作系统花了数十年时间解决的问题)。在 OS 之上实施我自己的缓存级别并不是我认为您会发现提高性能的最高性价比的地方。虽然 OS 文件缓存中可能使用了一个临时锁,但该锁只会在从缓存到目标读取位置的内存复制期间存在,这真的非常非常短。可能什么都不会注意到。而且,那个临时锁根本不会阻塞 nodejs。