我有一个NodeJS服务器应用程序。我有这行代码用于我的日志记录:
fs.writeFileSync(__dirname + "/../../logs/download.html.xml", doc.toString());
有时候它可以正常工作,但在负载很重的情况下会出现这种情况:
Error: UNKNOWN, unknown error 'download.html.xml'
PS:我在这里找到了一个链接:http://www.daveeddy.com/2013/03/26/synchronous-file-io-in-nodejs/ Blogger描述了writeFileSync在返回时并没有真正完成写作。有没有正确的方法以同步方式进行,即没有回调?
答案 0 :(得分:2)
执行writeFileSync
时,您会获得文件的文件描述符。操作系统限制了在给定时间可以打开的文件描述符的数量。因此,在大量使用的情况下,您实际上可能会达到极限。找到答案的一种方法是使用ulimit
并将其设置为无限制。
另一种可能是IO错误。例如,如果发生IO错误,则关闭文件描述符将失败。
答案 1 :(得分:1)
对于OP似乎很赞赏评论,我把它放在回复中,希望它能帮助其他用户。
在我看来,问题是由于通过调用writeFileSync
来消耗大量描述符这一事实。问题中发布的链接似乎也证实了这个想法。
实际上,我还在试图弄清楚是否有一种方法可以知道写入何时实际完成,而不仅仅是从nodejs的角度来看。 也许this参数可以提供帮助,但我猜它会遇到同样的问题。
无论如何,人们可以通过实现一个编写器池来解决这个问题,该队列可以放置他的写请求。
专业人士可以控制打开的描述符的数量。确切地说,由于OP发布的链接中提到的问题,当然可以避免耗尽系统的所有资源。
另一方面,遗憾的是,这个解决方案往往会占用更多的内存(因为有一个实际上是在等待可用的工作人员时将文档停在那里)。
当然,它可能是一个适合于在时间上分离的请求突发的解决方案,但也许它不能很好地适应固定负载的时间。