নোড এবং ত্রুটি: EMFILE, অনেক বেশি খোলার ফাইল


166

কিছু দিন ধরে আমি একটি ত্রুটির কার্যকারী সমাধান অনুসন্ধান করেছি

Error: EMFILE, too many open files

দেখে মনে হচ্ছে অনেকের একই সমস্যা রয়েছে। সাধারণ উত্তরে ফাইল বর্ণনাকারীর সংখ্যা বাড়ানো জড়িত। সুতরাং, আমি এটি চেষ্টা করেছি:

sysctl -w kern.maxfiles=20480,

ডিফল্ট মানটি 10240 my এটি আমার দৃষ্টিতে কিছুটা অদ্ভুত, কারণ আমি ডিরেক্টরিতে যে ফাইলগুলি পরিচালনা করছি তার সংখ্যা 10240 এর নিচে ran ।

দ্বিতীয় প্রশ্ন:

বেশ কয়েকটি অনুসন্ধানের পরে আমি "অনেকগুলি মুক্ত ফাইল" সমস্যার জন্য একটি কাজ খুঁজে পেয়েছিলাম:

var requestBatches = {};
function batchingReadFile(filename, callback) {
  // First check to see if there is already a batch
  if (requestBatches.hasOwnProperty(filename)) {
    requestBatches[filename].push(callback);
    return;
  }

  // Otherwise start a new one and make a real request
  var batch = requestBatches[filename] = [callback];
  FS.readFile(filename, onRealRead);

  // Flush out the batch on complete
  function onRealRead() {
    delete requestBatches[filename];
    for (var i = 0, l = batch.length; i < l; i++) {
      batch[i].apply(null, arguments);
    }
  }
}

function printFile(file){
    console.log(file);
}

dir = "/Users/xaver/Downloads/xaver/xxx/xxx/"

var files = fs.readdirSync(dir);

for (i in files){
    filename = dir + files[i];
    console.log(filename);
    batchingReadFile(filename, printFile);

দুর্ভাগ্যক্রমে আমি এখনও একই ত্রুটিটি পেলাম। এই কোডটিতে কী ভুল?

একটি শেষ প্রশ্ন (আমি জাভাস্ক্রিপ্ট এবং নোডে নতুন), আমি প্রায় 5000 ব্যবহারকারীদের জন্য প্রচুর অনুরোধ সহ একটি ওয়েব অ্যাপ্লিকেশন বিকাশের প্রক্রিয়াধীন। পাইথন ও জাভা অন্যান্য ভাষার মতো প্রোগ্রামিংয়ে আমার অনেক বছরের অভিজ্ঞতা আছে। তাই মূলত আমি ভেবেছিলাম এই অ্যাপ্লিকেশনটি জ্যাঙ্গো বা প্লে ফ্রেমওয়ার্ক সহ বিকাশ করব। তারপরে আমি নোড আবিষ্কার করেছি এবং আমার অবশ্যই বলতে হবে যে I / O মডেলটি অ-ব্লক করার ধারণাটি সত্যিই দুর্দান্ত, প্রলোভনসঙ্কুল এবং বেশিরভাগ ক্ষেত্রে খুব দ্রুত!

তবে নোডের সাথে আমার কী ধরণের সমস্যা আশা করা উচিত? এটি কি প্রোডাকশন প্রমাণিত ওয়েব সার্ভার? আপনার অভিজ্ঞতা কি?

উত্তর:


83

কারণ যখন গ্রেফুল-এফএস কাজ করে না ... বা আপনি কেবল বুঝতে চান যে ফাঁসটি কোথা থেকে আসছে। এই প্রক্রিয়া অনুসরণ করুন।

(উদাহরণস্বরূপ গ্রেফুল-এফএস আপনার সমস্যাটি যদি সকেটগুলির সাথে থাকে তবে তা আপনার ওয়াগন ঠিক করতে পারবে না))

আমার ব্লগ নিবন্ধ থেকে: http://www.blakerobertson.com/devlog/2014/1/11/how-to-determine-what-caasing-error-connect-emfile-nodejs.html

কীভাবে বিচ্ছিন্ন করা যায়

এই কমান্ডটি নোডেজ প্রক্রিয়াগুলির জন্য মুক্ত হ্যান্ডলগুলির সংখ্যা আউটপুট দেবে:

lsof -i -n -P | grep nodejs
COMMAND     PID    USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
...
nodejs    12211    root 1012u  IPv4 151317015      0t0  TCP 10.101.42.209:40371->54.236.3.170:80 (ESTABLISHED)
nodejs    12211    root 1013u  IPv4 151279902      0t0  TCP 10.101.42.209:43656->54.236.3.172:80 (ESTABLISHED)
nodejs    12211    root 1014u  IPv4 151317016      0t0  TCP 10.101.42.209:34450->54.236.3.168:80 (ESTABLISHED)
nodejs    12211    root 1015u  IPv4 151289728      0t0  TCP 10.101.42.209:52691->54.236.3.173:80 (ESTABLISHED)
nodejs    12211    root 1016u  IPv4 151305607      0t0  TCP 10.101.42.209:47707->54.236.3.172:80 (ESTABLISHED)
nodejs    12211    root 1017u  IPv4 151289730      0t0  TCP 10.101.42.209:45423->54.236.3.171:80 (ESTABLISHED)
nodejs    12211    root 1018u  IPv4 151289731      0t0  TCP 10.101.42.209:36090->54.236.3.170:80 (ESTABLISHED)
nodejs    12211    root 1019u  IPv4 151314874      0t0  TCP 10.101.42.209:49176->54.236.3.172:80 (ESTABLISHED)
nodejs    12211    root 1020u  IPv4 151289768      0t0  TCP 10.101.42.209:45427->54.236.3.171:80 (ESTABLISHED)
nodejs    12211    root 1021u  IPv4 151289769      0t0  TCP 10.101.42.209:36094->54.236.3.170:80 (ESTABLISHED)
nodejs    12211    root 1022u  IPv4 151279903      0t0  TCP 10.101.42.209:43836->54.236.3.171:80 (ESTABLISHED)
nodejs    12211    root 1023u  IPv4 151281403      0t0  TCP 10.101.42.209:43930->54.236.3.172:80 (ESTABLISHED)
....

লক্ষ্য করুন: 1023u (শেষ লাইন) - এটি 1024 তম ফাইল হ্যান্ডেল যা ডিফল্ট সর্বাধিক।

এখন, শেষ কলামটি দেখুন। এটি নির্দেশ করে যে কোন উত্স উন্মুক্ত। আপনি সম্ভবত একই উত্স নামের সমস্ত লাইন দেখতে পাবেন। আশা করি, এটি এখন আপনাকে বলবে যে ফাঁসের জন্য আপনার কোডটি কোথায় সন্ধান করবেন।

আপনি যদি একাধিক নোড প্রক্রিয়াগুলি না জানেন তবে প্রথমে কোন প্রক্রিয়াটি পিড করেছে তা 12211 দেখুন That এটি আপনাকে প্রক্রিয়াটি বলবে।

উপরের আমার ক্ষেত্রে, আমি লক্ষ্য করেছি যে সেখানে খুব অনুরূপ আইপি অ্যাড্রেসগুলির একটি গুচ্ছ ছিল। তারা সবাই ছিল 54.236.3.### আইপি ঠিকানার অনুসন্ধানের মাধ্যমে, আমার ক্ষেত্রে এটি নির্ধারণ করতে সক্ষম হয়েছিল যে এটি পাবুনব সম্পর্কিত ছিল।

কমান্ড রেফারেন্স

কোনও প্রক্রিয়া কতগুলি উন্মুক্ত হ্যান্ডলগুলি নির্ধারণ করতে এই সিনট্যাক্সটি ব্যবহার করুন ...

একটি নির্দিষ্ট পিডের জন্য খোলা ফাইলগুলির একটি গণনা পেতে

আমি এই কমান্ডটি আমার অ্যাপ্লিকেশনে বিভিন্ন ইভেন্ট করার পরে খোলা ফাইলগুলির সংখ্যা পরীক্ষা করতে ব্যবহার করেছি।

lsof -i -n -P | grep "8465" | wc -l
# lsof -i -n -P | grep "nodejs.*8465" | wc -l
28
# lsof -i -n -P | grep "nodejs.*8465" | wc -l
31
# lsof -i -n -P | grep "nodejs.*8465" | wc -l
34

আপনার প্রক্রিয়া সীমা কি?

ulimit -a

আপনি যে লাইনটি চান তা দেখতে এটি দেখতে পাবেন:

open files                      (-n) 1024

স্থায়ীভাবে সীমা পরিবর্তন করুন:

  • উবুন্টু 14.04 এ পরীক্ষিত, নোডেজ বনাম 7.9

আপনি যদি অনেকগুলি সংযোগ খোলার প্রত্যাশা করে থাকেন (ওয়েবসকেটগুলি একটি ভাল উদাহরণ) তবে আপনি স্থায়ীভাবে সীমাটি বাড়িয়ে দিতে পারেন:

  • ফাইল: /etc/pam.d/common-session (শেষ যোগ করুন)

    session required pam_limits.so
  • ফাইল: /etc/security/limits.conf (শেষ যোগ করুন, বা ইতিমধ্যে উপস্থিত থাকলে সম্পাদনা করুন)

    root soft  nofile 40000
    root hard  nofile 100000
    
  • আপনার নোডেজ পুনরায় আরম্ভ করুন এবং ssh থেকে লগআউট / লগইন করুন।

  • এটি পুরানো নোডজেএসের জন্য কাজ নাও করতে পারে আপনাকে সার্ভার পুনঃসূচনা করতে হবে
  • আপনার নোড বিভিন্ন uid দিয়ে চললে পরিবর্তে ব্যবহার করুন।

1
আপনি কিভাবে ওপেন ফাইলের সীমা পরিবর্তন করতে পারেন?
Om3ga

13
ulimit -n 2048 টি 2048 ফাইল খোলার অনুমতি দেওয়ার জন্য
গাল বার্বিন

1
এটি সর্বাধিক বর্ণনামূলক এবং সঠিক উত্তর। ধন্যবাদ!
কোস্টানোস

আমার সংখ্যা বিরল। lsof -i -n -P | grep "12843" | wc -l== 4085 তবে ulimit -a | grep "open files"== (-n) 1024 কোনও ক্লু কীভাবে আমি সীমাবদ্ধতার চেয়ে বেশি ফাইল খুলতে পারি?
Kostanos

1
যেহেতু @ ব্লেক 3 টির ব্লগটি ডাউন বলে মনে হচ্ছে, ওয়েবব্যাক মেশিনে তার নিবন্ধের লিঙ্কটি এখানে। web.archive.org/web/20140508165434/http://… সুপার সহায়ক এবং সত্যিই দুর্দান্ত পড়া!
জেমস

72

graceful-fsআইজাক শ্লুয়েটার (নোড.জেএস রক্ষণাবেক্ষণকারী) দ্বারা মডিউলটি ব্যবহার করা সম্ভবত সবচেয়ে উপযুক্ত সমাধান। এটি যদি এমএমএফিলের সম্মুখীন হয় তবে এটি ইনক্রিমেন্টাল ব্যাক-অফ করে। এটি অন্তর্নির্মিত fsমডিউলটির জন্য একটি ড্রপ-ইন প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে ।


2
আমাকে বাঁচালেন, কেন এটি নোড ডিফল্ট নয়? সমস্যাটি সমাধান করার জন্য আমাকে তৃতীয় পক্ষের প্লাগইন কেন ইনস্টল করতে হবে?
অ্যান্টনি ওয়েব

7
আমি মনে করি, সাধারণভাবে বলতে গেলে নোড যতটা সম্ভব ব্যবহারকারীর কাছে প্রকাশ করার চেষ্টা করে। এটি প্রত্যেককে (কেবল নোড কোর বিকাশকারী নয়) এই তুলনামূলকভাবে কাঁচা ইন্টারফেস ব্যবহার করে যে কোনও সমস্যা সমাধানের সুযোগ দেয়। একই সময়ে, সমাধান প্রকাশ করা সত্যিই সহজ, এবং অন্যদের দ্বারা প্রকাশিত এনপিএমের মাধ্যমে ডাউনলোড করুন। নোড থেকে নিজেই প্রচুর স্মার্ট আশা করবেন না। পরিবর্তে, এনএমপি প্রকাশিত প্যাকেজগুলিতে স্মার্টগুলি সন্ধান করার প্রত্যাশা করুন।
মায়ার্ন স্টল

5
এটি আপনার নিজস্ব কোড যদি ঠিক থাকে তবে এনটিএম প্রচুর পরিমাণে মডিউল এটি ব্যবহার করে না।
আপক্রিক 19

1
এই মডিউলটি আমার সমস্ত সমস্যার সমাধান! আমি সম্মত হই যে নোডটি এখনও কিছুটা কাঁচা বলে মনে হচ্ছে তবে মূলত কারণ এতটা ছোট ডকুমেন্টেশন এবং জ্ঞাত সমস্যাগুলির সঠিক সমাধানগুলি গ্রহণ করে কী ভুল হচ্ছে তা বোঝা সত্যিই কঠিন।
সিডোনাল্ডসন

আপনি কিভাবে এটি এনপিএম করবেন ? আমি কীভাবে এটি নিয়মিত fs এর পরিবর্তে আমার কোডে সংযুক্ত করব?
আভিরাম নেটানেল

11

আমি নিশ্চিত না যে এটি কারও সাহায্য করবে কিনা, আমি অনেকগুলি নির্ভরশীলতা নিয়ে একটি বড় প্রকল্পে কাজ শুরু করেছি যা আমাকে একই ত্রুটি ছুঁড়ে ফেলেছে। আমার সহকর্মী watchmanমদ ব্যবহার করে ইনস্টল করার পরামর্শ দিয়েছিলেন এবং এটি আমার জন্য এই সমস্যাটি স্থির করে।

brew update
brew install watchman

26 জুন 2019 এ সম্পাদনা করুন: প্রহরীকে গিথুব লিঙ্ক


এটি আমাকে অন্তত সহায়তা করেছিল। একটি প্রতিক্রিয়া-নেটিভ প্রকল্পে বান্ডিলারটি হয় হয় স্থানীয়ভাবে ফাইলগুলি খুলতে পারে বা (এটি ইনস্টল করা থাকলে) অপারেটিং সিস্টেমের নিকটতর সুন্দর এমন উপায়ে ওয়াচম্যান ব্যবহার করতে পারেন। সুতরাং এটি একটি বড় সহায়তা হতে পারে - এটি ম্যাকওএসের জন্য প্রতিক্রিয়াভিত্তিক সিএলআই কুইকস্টার্টেও নথিভুক্ত করা হয়েছে: facebook.github.io/react-native/docs/getting-st সূত্র html - চিয়ার্স!
মাইক হার্ডি

7

আমি আজ এই সমস্যায় পড়েছি এবং এর কোনও ভাল সমাধান খুঁজে পাচ্ছি না, আমি এটির সমাধানের জন্য একটি মডিউল তৈরি করেছি। আমি @ fbartho এর স্নিপেট দ্বারা অনুপ্রাণিত হয়েছি, তবে fs মডিউলটি ওভাররাইট করা এড়াতে চেয়েছিলাম।

আমি যে মডিউলটি লিখেছি তা হ'ল ফাইলকিউ এবং আপনি এফএস এর মতো ব্যবহার করেন:

var Filequeue = require('filequeue');
var fq = new Filequeue(200); // max number of files to open at once

fq.readdir('/Users/xaver/Downloads/xaver/xxx/xxx/', function(err, files) {
    if(err) {
        throw err;
    }
    files.forEach(function(file) {
        fq.readFile('/Users/xaver/Downloads/xaver/xxx/xxx/' + file, function(err, data) {
            // do something here
        }
    });
});

7

আপনি অনেকগুলি ফাইল পড়ছেন। নোড ফাইলগুলি অবিচ্ছিন্নভাবে পড়ে, এটি একবারে সমস্ত ফাইল পড়বে। সুতরাং আপনি সম্ভবত 10240 সীমাটি পড়ছেন।

এটি কাজ করে কিনা দেখুন:

var fs = require('fs')
var events = require('events')
var util = require('util')
var path = require('path')

var FsPool = module.exports = function(dir) {
    events.EventEmitter.call(this)
    this.dir = dir;
    this.files = [];
    this.active = [];
    this.threads = 1;
    this.on('run', this.runQuta.bind(this))
};
// So will act like an event emitter
util.inherits(FsPool, events.EventEmitter);

FsPool.prototype.runQuta = function() {
    if(this.files.length === 0 && this.active.length === 0) {
        return this.emit('done');
    }
    if(this.active.length < this.threads) {
        var name = this.files.shift()

        this.active.push(name)
        var fileName = path.join(this.dir, name);
        var self = this;
        fs.stat(fileName, function(err, stats) {
            if(err)
                throw err;
            if(stats.isFile()) {
                fs.readFile(fileName, function(err, data) {
                    if(err)
                        throw err;
                    self.active.splice(self.active.indexOf(name), 1)
                    self.emit('file', name, data);
                    self.emit('run');

                });
            } else {
                self.active.splice(self.active.indexOf(name), 1)
                self.emit('dir', name);
                self.emit('run');
            }
        });
    }
    return this
};
FsPool.prototype.init = function() {
    var dir = this.dir;
    var self = this;
    fs.readdir(dir, function(err, files) {
        if(err)
            throw err;
        self.files = files
        self.emit('run');
    })
    return this
};
var fsPool = new FsPool(__dirname)

fsPool.on('file', function(fileName, fileData) {
    console.log('file name: ' + fileName)
    console.log('file data: ', fileData.toString('utf8'))

})
fsPool.on('dir', function(dirName) {
    console.log('dir name: ' + dirName)

})
fsPool.on('done', function() {
    console.log('done')
});
fsPool.init()

6

আমাদের সকলের মতো আপনিও অ্যাসিঙ্ক্রোনাস আই / ও এর অন্য শিকার। অ্যাসিঙ্ক্রোনাস কলগুলির সাহায্যে, আপনি যদি প্রচুর ফাইল লুপ করেন তবে নোড.জেএস প্রতিটি ফাইল পড়ার জন্য একটি ফাইল বর্ণনাকারী খুলতে শুরু করবে এবং তারপরে এটি বন্ধ না হওয়া পর্যন্ত ক্রিয়াটির জন্য অপেক্ষা করবে।

ফাইল বর্ণনাকারী এটি পড়ার জন্য আপনার সার্ভারে উপলব্ধ না হওয়া অবধি খোলা থাকে। এমনকি যদি আপনার ফাইলগুলি ছোট হয় এবং পড়া বা আপডেট করা দ্রুত হয় তবে এটি কিছুটা সময় নেয় তবে একই সময়ে আপনার লুপ নতুন ফাইলগুলি ডেস্ক্রিপ্টার খুলতে থামায় না। সুতরাং আপনার যদি খুব বেশি ফাইল থাকে তবে শীঘ্রই এই সীমাটি পৌঁছে যাবে এবং আপনি একটি সুন্দর ইমফাইল পাবেন

এই প্রভাব এড়ানোর জন্য একটি সারি তৈরি করার একটি সমাধান রয়েছে।

যারা Async লিখেছেন তাদের জন্য ধন্যবাদ , এটির জন্য একটি খুব দরকারী কার্য রয়েছে। Async.queue নামে একটি পদ্ধতি রয়েছে , আপনি একটি সীমাবদ্ধতা সহ একটি নতুন সারি তৈরি করেন এবং তারপরে ফাইলের নামগুলি সারিতে যুক্ত করুন।

দ্রষ্টব্য: আপনার যদি অনেকগুলি ফাইল খুলতে হয় তবে বর্তমানে কোন ফাইলগুলি খোলা আছে এবং সেগুলি অনন্তরূপে পুনরায় খোলা হবে না সেগুলি সংরক্ষণ করা ভাল ধারণা।

const fs = require('fs')
const async = require("async")

var q = async.queue(function(task, callback) {
    console.log(task.filename);
    fs.readFile(task.filename,"utf-8",function (err, data_read) {
            callback(err,task.filename,data_read);
        }
    );
}, 4);

var files = [1,2,3,4,5,6,7,8,9,10]

for (var file in files) {
    q.push({filename:file+".txt"}, function (err,filename,res) {
        console.log(filename + " read");
    });
}

আপনি দেখতে পাচ্ছেন যে প্রতিটি ফাইল কাতারে যুক্ত হয়েছে (কনসোল.লগ ফাইলের নাম), তবে কেবলমাত্র যখন বর্তমান সারিটি আপনি পূর্ব নির্ধারণ করেছেন সীমাতে থাকবে তখনই।

async.queue একটি কলব্যাকের মাধ্যমে সারিটির প্রাপ্যতা সম্পর্কে তথ্য পান, এই কলব্যাকটি তখনই ডাকা হয় যখন ডেটা ফাইলটি পড়া হয় এবং আপনার যে কোনও ক্রিয়াকলাপ সম্পাদন করতে হয়। (ফাইল পড়ার পদ্ধতি দেখুন)

সুতরাং আপনি ফাইল বর্ণনাকারী দ্বারা অভিভূত করা যাবে না।

> node ./queue.js
0.txt
    1.txt
2.txt
0.txt read
3.txt
3.txt read
4.txt
2.txt read
5.txt
4.txt read
6.txt
5.txt read
7.txt
    1.txt read (biggest file than other)
8.txt
6.txt read
9.txt
7.txt read
8.txt read
9.txt read

3

আমি নিজেই এই সমস্যাটি সমাধান করার জন্য কোডের একটি ছোট্ট স্নিপেট লিখতে শেষ করেছি, অন্য সমস্ত সমাধানের দিক থেকে খুব বেশি ভারী ওজন দেখা যায় এবং আপনাকে আপনার প্রোগ্রামের কাঠামো পরিবর্তন করতে হবে।

এই সমাধানটি কেবলমাত্র কোনও fs.readFile বা fs.writeFile কলগুলিকে স্টল করে যাতে কোনও নির্দিষ্ট সময়ে ফ্লাইটে কোনও সেট সংখ্যার চেয়ে বেশি না থাকে।

// Queuing reads and writes, so your nodejs script doesn't overwhelm system limits catastrophically
global.maxFilesInFlight = 100; // Set this value to some number safeish for your system
var origRead = fs.readFile;
var origWrite = fs.writeFile;

var activeCount = 0;
var pending = [];

var wrapCallback = function(cb){
    return function(){
        activeCount--;
        cb.apply(this,Array.prototype.slice.call(arguments));
        if (activeCount < global.maxFilesInFlight && pending.length){
            console.log("Processing Pending read/write");
            pending.shift()();
        }
    };
};
fs.readFile = function(){
    var args = Array.prototype.slice.call(arguments);
    if (activeCount < global.maxFilesInFlight){
        if (args[1] instanceof Function){
            args[1] = wrapCallback(args[1]);
        } else if (args[2] instanceof Function) {
            args[2] = wrapCallback(args[2]);
        }
        activeCount++;
        origRead.apply(fs,args);
    } else {
        console.log("Delaying read:",args[0]);
        pending.push(function(){
            fs.readFile.apply(fs,args);
        });
    }
};

fs.writeFile = function(){
    var args = Array.prototype.slice.call(arguments);
    if (activeCount < global.maxFilesInFlight){
        if (args[1] instanceof Function){
            args[1] = wrapCallback(args[1]);
        } else if (args[2] instanceof Function) {
            args[2] = wrapCallback(args[2]);
        }
        activeCount++;
        origWrite.apply(fs,args);
    } else {
        console.log("Delaying write:",args[0]);
        pending.push(function(){
            fs.writeFile.apply(fs,args);
        });
    }
};

আপনার গিথুব এ একটি রেপো করা উচিত।
নিক

গ্রেফুল-এফএস আপনার পক্ষে কাজ না করে থাকলে এটি খুব ভাল কাজ করে।
Ceekay

3

আমি একই সমস্যার জন্য উল্লিখিত সমস্ত জিনিসগুলি করেছি তবে কিছুই কার্যকর হয়নি। আমি এটি চেষ্টা করেছি নীচে 100%। সাধারণ কনফিগারেশন পরিবর্তন।

বিকল্প 1 সেট সীমা (এটি বেশিরভাগ সময় কাজ করবে না)

user@ubuntu:~$ ulimit -n 65535

উপলব্ধ সীমা পরীক্ষা করুন

user@ubuntu:~$ ulimit -n
1024

বিকল্প 2 65535 বলার জন্য উপলব্ধ সীমাটি বাড়ানোর জন্য

user@ubuntu:~$ sudo nano /etc/sysctl.conf

এটিতে নিম্নলিখিত লাইনটি যুক্ত করুন

fs.file-max = 65535

নতুন কনফিগারেশনের সাথে রিফ্রেশ করতে এটি চালান

user@ubuntu:~$ sudo sysctl -p

নিম্নলিখিত ফাইলটি সম্পাদনা করুন

user@ubuntu:~$ sudo vim /etc/security/limits.conf

এটিতে নিম্নলিখিত লাইনগুলি যুক্ত করুন

root soft     nproc          65535    
root hard     nproc          65535   
root soft     nofile         65535   
root hard     nofile         65535

নিম্নলিখিত ফাইলটি সম্পাদনা করুন

user@ubuntu:~$ sudo vim /etc/pam.d/common-session

এটি এই লাইন যোগ করুন

session required pam_limits.so

লগআউট এবং লগইন এবং নিম্নলিখিত কমান্ড চেষ্টা করুন

user@ubuntu:~$ ulimit -n
65535

বিকল্প 3 কেবল লাইনের নীচে যুক্ত করুন

DefaultLimitNOFILE=65535

/etc/systemd/system.conf এবং /etc/systemd/user.conf এ


বিকল্প 2 বরং দীর্ঘ, এবং আশা 3 বিকল্প কাজ, কিন্তু এটি আমার উবুন্টুর 18
ইউজেন

1

ব্যাগ পাইপ সহ আপনার কেবল পরিবর্তন দরকার

FS.readFile(filename, onRealRead);

=>

var bagpipe = new Bagpipe(10);

bagpipe.push(FS.readFile, filename, onRealRead))

ব্যাগপাইপ আপনাকে সমান্তরাল সীমাবদ্ধ করতে সহায়তা করে। আরও বিশদ: https://github.com/JacksonTian/bagpipe


এটি সবই চাইনিজ বা অন্যান্য এশিয়ান ভাষায়। ইংরেজিতে কোন ডকুমেন্টেশন লেখা আছে কি?
ফাতেহ আরসলান

@ ফাতিআরসান ইংরেজি ডক এখন উপলভ্য now
ব্যবহারকারী 1837639

1

যখন চলমান একই সমস্যা ছিল nodemon কমান্ড তাই আমি নাম কমে ফাইল না খোলা পর্যন্ত মহিমান্বিত টেক্সট এবং ত্রুটি dissappeared।


আমিও EMFILEত্রুটি পাচ্ছিলাম এবং পরীক্ষার এবং ত্রুটির মধ্য দিয়ে লক্ষ্য করেছি যে কিছু সাব্লাইম উইন্ডো বন্ধ করার ফলে সমস্যাটি সমাধান হয়েছে। আমি এখনও জানি না কেন। আমি ulimit -n 2560আমার .বাশ_ প্রোফাইলে যুক্ত করার চেষ্টা করেছি, তবে এটি সমস্যার সমাধান করেনি। এটি কি পরিবর্তে পরমাণুতে পরিবর্তিত হওয়া দরকার?
কোডস্মিথ

1

@ ব্লাক 3 এর উত্তরের ভিত্তিতে বিল্ডিং, এটি অন্য রোগ নির্ণয় করতে সহায়তা করার ক্ষেত্রে আমি এখানে সামান্য কিছু সংক্ষিপ্ত ব্যবহার করছি:

আপনি যদি নোড.জেএস স্ক্রিপ্টটি ডিবাগ করার চেষ্টা করছেন যা ফাইল বর্ণনাকারীর বাইরে চলেছে তবে আপনাকে lsofপ্রশ্নে নোড প্রক্রিয়া দ্বারা ব্যবহৃত আউটপুট দেওয়ার জন্য এখানে একটি লাইন রয়েছে :

openFiles = child_process.execSync(`lsof -p ${process.pid}`);

এটি সমকালীনভাবে চলবে lsof চলমান নোড.জেএস প্রক্রিয়া দ্বারা ফিল্টার করা এবং বাফারের মাধ্যমে ফলাফলগুলি ফিরিয়ে দেবে।

তারপরে console.log(openFiles.toString())বাফারটিকে একটি স্ট্রিংয়ে রূপান্তর করতে এবং ফলাফলগুলিতে লগ করুন।


0

cwaitপ্রতিশ্রুতি ফিরিয়ে দেয় এমন কোনও ক্রিয়াকলাপের একযোগে মৃত্যুদণ্ড কার্যকর করার ক্ষেত্রে সীমাবদ্ধ করার জন্য একটি সাধারণ সমাধান।

আপনার ক্ষেত্রে কোডটি এমন কিছু হতে পারে:

var Promise = require('bluebird');
var cwait = require('cwait');

// Allow max. 10 concurrent file reads.
var queue = new cwait.TaskQueue(Promise, 10);
var read = queue.wrap(Promise.promisify(batchingReadFile));

Promise.map(files, function(filename) {
    console.log(filename);
    return(read(filename));
})


0

সর্বশেষ ব্যবহার করুন fs-extra

Ubuntuপ্রচুর ফাইল / সকেট-বর্ণনকারী স্থান (গণনা) সহ আমার (16 এবং 18) সমস্যা ছিল lsof |wc -l। ব্যবহৃত fs-extraসংস্করণ 8.1.09.0.0"ত্রুটি: EMFILE, অনেক বেশি উন্মুক্ত ফাইল" এ আপডেট হওয়ার পরে নিখোঁজ।

নোড হ্যান্ডলিং ফাইল সিস্টেমের সাহায্যে বৈচিত্র্যময় ওএস-এ বিবিধ সমস্যা আমি পেয়েছি। ফাইল সিস্টেমগুলি অবশ্যই তুচ্ছ নয়।


0

আমার এই সমস্যাটি ছিল এবং আমি এটি চালিয়ে সমাধান করেছি npm updateএবং এটি কার্যকর হয়েছে।

কিছু ক্ষেত্রে আপনার নোড_মডিউলগুলি অপসারণ করতে হবে rm -rf node_modules/


0

আমি প্রহরী স্থাপন, সীমা পরিবর্তন ইত্যাদি করেছি এবং এটি গুল্পে কাজ করে না।

এটিরર્મ 2 পুনরায় চালু করা আসলে যদিও সহায়তা করেছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.