美文网首页
一次node文件操作过多排查过程总结

一次node文件操作过多排查过程总结

作者: 程序员poetry | 来源:发表于2022-07-29 10:22 被阅读0次

大家好,我是poetry。最近在优化公司内部的脚手架,遇到一个问题,Error: EMFILE, too many open files也就是nodejs打开文件过多会导致错误,一次次排查,最后找到了一个有效的方法,总结记录一下

当我尝试去操作大量文件的时候

for(var i=0; i<200000; i++) {
    fq.readFile('./somefile.txt', {encoding: 'utf8'}, function(err, somefile) {
        console.log("data from somefile.txt without crashing!", somefile);
    });
}

以上导致Error: EMFILE: too many open files错误。我不必关闭文件,因为显然可以fs.readFile对文件进行操作并为我关闭文件。我在Mac OS上,我的ulimit设置为8192

$ ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-v: address space (kbytes)          unlimited
-l: locked-in-memory size (kbytes)  unlimited
-u: processes                       1392
-n: file descriptors                256

可以通过修改系统配置,但是不太推荐

$ echo kern.maxfiles=65536 | sudo tee -a /etc/sysctl.conf
$ echo kern.maxfilesperproc=65536 | sudo tee -a /etc/sysctl.conf
$ sudo sysctl -w kern.maxfiles=65536
$ sudo sysctl -w kern.maxfilesperproc=65536
$ ulimit -n 65536 
  • 由于node.js的异步特性,因此会发生此错误。进程试图打开的文件超出允许的数量,因此会产生错误。
  • 可以通过创建打开文件队列来解决此问题,以使它们永远不会超过限制,以下是一些可以为您完成此操作的库:

我们可以使用文件队列来限制每次打开的文件数量

Instantiate Filequeue with a maximum number of files to be opened at once (default is 200)

how to use

var FileQueue = require('filequeue');
var fq = new FileQueue(100);

// additional instances will attempt to use the same instance (and therefore the same maxfiles)

var FileQueue2 = require('filequeue');
var fq2 = new FileQueue2(100);

console.log(fq === fq2); // => true

// you can force a new instance of filequeue with the `newQueue` parameter

var fq3 = new FileQueue(100, true);

console.log(fq === fq3); // => false

filequeue支持以下方法

readFile
writeFile
readdir
rename
symlink
mkdir
stat
exists
createReadStream
createWriteStream

使用filequeue就可以正常运行了

var FileQueue = require('filequeue');
var fq = new FileQueue(100); // 限制每次打开的文件数量

for(var i=0; i<200000; i++) {
    fq.readFile('./demo.txt', {encoding: 'utf8'}, function(err, somefile) {
        console.log("data from somefile.txt without crashing!", somefile);
    });
}

本文由mdnice多平台发布

相关文章

  • 一次node文件操作过多排查过程总结

    前端进阶之旅:https://interview2.poetries.top[https://interview2...

  • day11_python_文件操作与异常捕获

    总结 一.文件操作 1.基本过程:打开文件 - 操作 - 关闭文件 2.open(路径,打开方式,encoding...

  • 2018-09-03 day11-文件操作和异常捕获

    总结 一.文件操作 1.基本过程:打开文件 - 操作 - 关闭文件 2.open(路径,打开方式,encoding...

  • Node大内存应用

    在Node中,不可避免地还是会存在操作大文件的场景。由于Node的内存限制,操作大文件也需要小心,好在Node提供...

  • 12-NodeJS核心API-文件模块(fs)

    前言 文件操作是开发过程中并不可少的一部分。Node.js 中的 fs 模块是文件操作的封装,它提供了文件读取、写...

  • node文件操作

    缓存区、文件系统、路径 1. 课程介绍 Ø Buffer缓存区(了解) Ø fs文件模块(了解) Ø fs读取文件...

  • Nodejs学习第5天

    Node.js内置基础模块fs, Node.js 提供了基础的文件操作,并同时提供文件的同步和异步操作,如: .....

  • Node-核心模块(fs、path)

    一、核心模块fs 1、文件读取 使用 Node 中 提供的 文件操作API,读取指定 文件中的文本内容 Node ...

  • API - fs 文件操作

    Node.js 提供一组类似UNIX(POSIX)标准的文件操作API,Node.js中操作文件的模块是fs(Fi...

  • Node.js的文件系统

    Node.js的文件系统 JavaScript的是没有操作文件的能力,但是Node.js是可以做到的。Node.j...

网友评论

      本文标题:一次node文件操作过多排查过程总结

      本文链接:https://www.haomeiwen.com/subject/hfafwrtx.html