Слишком много открытых файлов с использованием child_process - PullRequest
5 голосов
/ 08 марта 2011

Я получаю следующую ошибку только на моем экземпляре Rackspace Ubuntu Maverick ... но не на моей локальной виртуальной машине Ubuntu Lucid:

pipe(): Too many open files
pipe(): Too many open files

child_process.js:223
  var fds = this._internal.spawn(path,
                           ^
Error: Error spawning
    at ChildProcess.spawn (child_process.js:223:28)
    at child_process.js:10:15
    etc..etc..

Код, который его генерирует:

function getHeader(url, callback)
{
  var client = spawn('curl', ['-I', url]);
  client.stdout.on('data', function(data)
  {
    client.kill('SIGTERM');
    callback(data.toString('utf8'));
  });
}

1 Ответ

3 голосов
/ 08 марта 2011

Было бы полезно узнать, как низко ваш хостинг-провайдер установил ограничение на количество файлов: ulimit -n скажет вам, каково ограничение setrlimits(2) на количество дескрипторов открытых файлов на процесс. Типичные установки используют 1024. Возможно, они установили его намного ниже, чтобы ограничить использование памяти в ядре.

Существуют жесткие ограничения, которые вы можете повысить, только вежливо спросив Rackspace (если у вас нет прав на запись, например, /etc/security/limits.conf), и мягкие ограничения, которые можно повысить до жесткого предела. Возможно, они установили мягкие ограничения ниже, чтобы попытаться снизить использование ресурсов, но сохранили жесткие ограничения выше.

Также было бы полезно узнать, сколько файловых дескрипторов node используется в настоящее время. Когда вы вошли в систему, отметьте /proc/$(pidof node.js)/fd/, чтобы узнать, сколько файлов открыто. Возможно, вы не закрываете файлы, сокеты или каналы так быстро, как они могут быть закрыты?

...