Я не могу запустить более 100 процессов - PullRequest
3 голосов
/ 23 августа 2009

У меня огромное количество команд оболочки, выполняемых с привилегиями root / admin с помощью вызова AuthorizationExecuteWithPrivileges службы авторизации. Проблема в том, что через некоторое время (10-15 секунд, может быть, 100 команд оболочки) программа перестает отвечать на эту ошибку в отладчике:

не удалось форк: errno 35

А потом, пока приложение работает, я не могу больше запускать приложения. Я исследовал эту проблему, и, по-видимому, это означает, что больше нет доступных потоков для использования системой. Однако я проверил с помощью Activity Monitor, и мое приложение использует только 4-5 потоков.

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

Спасибо

Ответы [ 2 ]

7 голосов
/ 23 августа 2009

Как уже указал Луи Гербарг, ваш вопрос не имеет никакого отношения к темам. Я соответственно отредактировал ваш заголовок и теги.

У меня огромное количество команд оболочки, выполняемых с привилегиями root / admin с помощью вызова AuthorizationExecuteWithPrivileges службы авторизации.

Не делай этого. Эта функция существует только для того, чтобы вы могли восстановить права root: admin и бит режима setuid для инструмента, который вы хотите запустить от имени root.

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

Пример кода приведен в Руководство по программированию служб авторизации .

Проблема в том, что через некоторое время (10-15 секунд, может быть, 100 команд оболочки) программа перестает отвечать на эту ошибку в отладчике:

couldn't fork: errno 35

Да. Вы можете запустить только пару сотен процессов одновременно. Это установленное ОС ограничение.

Это мягкий предел, который означает, что вы можете поднять его, но только до жесткого предела, который вы не можете поднять. Смотрите вывод limit и limit -h (в zsh; я не знаю о других оболочках).

Вам нужно дождаться завершения процессов, прежде чем запускать больше процессов.

А потом, пока приложение работает, я не могу больше запускать приложения.

Потому что вы уже запускаете столько процессов, сколько вам разрешено. Это ограничение x-сотни процессов для каждого пользователя, а не для процесса.

Я исследовал эту проблему и, по-видимому, это означает, что больше нет доступных потоков для использования системой.

Нет, это не так.

Коды ошибок errno используются для многих вещей. EAGAIN (35, «ресурс временно недоступен») может не означать больше потоков при установке системным вызовом, запускающим поток, но это не означает, что при установке другим системным вызовом или функцией.

В сообщении об ошибке, которое вы явно указали, говорится, что оно было установлено fork, то есть системным вызовом для запуска нового процесса , а не нового потока . В этом контексте EAGAIN означает «вы уже запускаете столько процессов, сколько можете». См. справочную страницу .

.

Однако я проверил с помощью Activity Monitor, и мое приложение использует только 4-5 потоков.

См

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

Запуск одного процесса на поток поможет вам только быстрее завершить процессы.

Я никогда раньше не использовал потоки ...

Похоже, что вы до сих пор этого не сделали, поскольку функция, на которую вы ссылаетесь, запускает процесс, а не поток.

3 голосов
/ 23 августа 2009

Это не о потоках (по крайней мере, не темы в вашем приложении). Это о системных ресурсах. Каждый из этих разветвленных процессов потребляет как минимум 1 поток ядра (может быть больше), несколько vnode и ряд других вещей. Со временем система не позволит вам создавать больше процессов.

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

Вероятность того, что повышение этих лимитов не исправит ваши проблемы. В то время как корректировка этих лимитов может заставить вас работать немного дольше, для того, чтобы действительно это исправить, вам нужно выяснить, почему ресурсы не возвращаются в систему. Исходя из того, что вы описали выше, я бы предположил, что ваши разветвленные процессы никогда не завершаются.

...