fs.writeFileSync gives Error:UNKNOWN, correct way to make synchronous file write in nodejs

fs.writeFileSync gives Error:UNKNOWN, correct way to make synchronous file write in nodejs

我有一个 NodeJS 服务器应用程序。我的日志记录有这行代码:

fs.writeFileSync(__dirname + "/../../logs/download.html.xml", doc.toString());

有时它可以正常工作,但在重负载下会出现此异常:

Error: UNKNOWN, unknown error 'download.html.xml'

PS:我在这里找到了 link:http://www.daveeddy.com/2013/03/26/synchronous-file-io-in-nodejs/ Blogger 描述 writeFileSync 并没有真正完成 return 上的写入。有没有正确的同步方式,即没有回调?

当您执行 writeFileSync 时,您会获得文件的文件描述符。 OS 限制在给定时间可以打开的文件描述符的数量。因此,在大量使用下,您实际上可能已达到极限。找出这种情况的一种方法是使用 ulimit 并将其设置为无限制。

还有一种可能是IO错误。例如,如果发生 IO 错误,关闭文件描述符将失败。

OP似乎很欣赏这个评论,我把它放在一个回复中,希望它能帮助其他用户。

在我看来,问题是由于调用 writeFileSync 用完了很多描述符。问题中发布的 link 似乎也证实了这个想法。

实际上,我仍在尝试弄清楚是否存在一种方法来了解写入何时真正在幕后完成,而不仅仅是从 nodejs 的角度来看。 也许 this 参数可以提供帮助,但我想它也会遇到同样的问题。

无论如何,可以通过实施 作者 池和一个队列来解决这个问题,在该队列上放置他的写请求。

优点是可以控制打开的描述符的数量。不完全是,确实,因为OP发布的link中提到的问题,但当然可以避免用完系统的所有资源。

另一方面,不幸的是,这个解决方案往往会占用更多的内存(因为一个人实际上是在等待可用的工作人员时将他的文件停在那里)。

当然,对于在时间上分离的突发请求,它可能是一个合适的解决方案,但它可能不太适合时间固定的负载。