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


    • 前端进阶之旅:https://interview2.poetries.top
    • 博客:https://blog.poetries.top
    • 公众号/小程序:「前端进阶之旅」 每天分享技术干货,学前端不迷路
    • 作者:程序员poetry

    大家好,我是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);
        });
    }
    • 1

    以上导致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
    • 1
    alt

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

    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 
    • 1
    • 由于 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(100true);

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

    filequeue支持以下方法

    readFile
    writeFile
    readdir
    rename
    symlink
    mkdir
    stat
    exists
    createReadStream
    createWriteStream
    • 1

    使用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);
        });
    }
    • 1

    本文由 mdnice 多平台发布

  • 相关阅读:
    星际争霸之小霸王之小蜜蜂(十四)--资本家的眼泪
    某电商网站的数据库设计(3)
    docker通过dockerfile安装sftp教程。
    从事电力行业施工需要什么资质,电力工程资质有什么作用
    PHP集成环境XAMPP中Apache无法启动问题解决方案
    磁盘被未知资源耗尽lsof -n|grep deleted
    wsl-系统迁移-非系统盘
    JAVA--企业级分层开发模式
    纳瓦尔宝典读书笔记
    微信公众号菜单栏规划怎么设置?
  • 原文地址:https://blog.csdn.net/jingguanliuye/article/details/126050241