Слишком много открытых файлов при использовании NodeJS child_processes.spawn для запуска скриптов

Сценарий:

Использование основного сценария для порождения переменного количества дочерних процессов разное количество раз для выполнения нагрузочного тестирования на сервере.

Основной сценарий сначала порождает всех дочерних процессов, которых он может (в соответствии с настройками его конфигурации), а затем, когда дочерние процессы завершаются, если конфигурация запрашивает больше запусков, запускаются новые дочерние процессы.

Я вижу немедленный сбой при попытке запустить 83-й дочерний процесс. 83?

Я ничего не делаю, чтобы явно закрыть файлы, открытые как часть процесса создания дочерних элементов, но, по-видимому, это не работа кода открытия, а кода модуля child_processes?

Мне очень любопытно магическое число 82 дочерних процессов. Кажется, это указывает на что-то либо на ограничение узла, либо на какую-то комбинацию узлов в моей системе?

В идеале, мне не хватает знаний, чтобы ответить на этот вопрос, или кто-то может предложить альтернативный способ запуска дочерних процессов сценариев, которые не будут страдать от этой проблемы?

Мне также интересно узнать о статусе API Web Worker, который появится в NodeJS. Кто-нибудь знает что-нибудь об этом?

Детали:

  • NodeJS v0.4.7
  • Mac OS X v10.6.7
  • улимит -n = 256
  • магическое число порожденных дочерних процессов, которые будут успешно запущены = 82 (это означает, что › 82 порожденных процесса вызовут ошибку слишком много открытых файлов)

Спасибо за любую помощь.


person bcarson    schedule 17.05.2011    source источник
comment
а) это звучит как проблема с конфигурацией системы, б) сколько файлов каждый экземпляр узла пытается открыть одновременно, в) ... да, 82 — это немного.   -  person jcolebrand    schedule 18.05.2011


Ответы (1)


Я предполагаю, что система делает именно то, что вы ей говорите. 82 процесса - это 3 открытых файла на процесс. STDIN, STDOUT, STDERR. Хлопнуть. Вы достигли своего ulimit только со стандартными 3 файловыми дескрипторами. Запустите с ulimit -n 512, и я уверен, вы сможете запускать в два раза больше детей.

person Peter Lyons    schedule 18.05.2011
comment
интересно. я понятия не имел, что stdin, stdout, stderr считаются файлами. мое отсутствие знаний Unix возвращается, чтобы укусить меня за задницу. - person bcarson; 18.05.2011
comment
извините, ушел в вихрь планирования. Я скоро вернусь к этому и дам вам знать. Это объяснение имеет смысл, и я надеялся, что ответ будет именно таким. Мне нравится узнавать, что ответ прост, я просто еще не знал его. Спасибо. - person bcarson; 20.05.2011