Есть ли способ для Apache контролировать, сколько памяти он резервирует?

Apache, похоже, не контролирует, сколько памяти он резервирует. В prefork MPM вы управляете максимальным числом процессов, которое вы хотите разрешить, но независимо от того, какое число вы там используете, всегда существует риск, что существующим процессам потребуется больше памяти, чем физически доступно. Если условие, требующее большого объема памяти, не изменится, убийца OOM начнет убивать случайные процессы Apache, ничего не решая, и Apache продолжит создавать новые процессы, приводя к сбою сервера. Итак, два вопроса:

  1. Разве Apache не должен контролировать, сколько памяти он выделяет?

  2. Разве нет способа предотвратить создание новых процессов в Apache, если не доступно больше памяти независимо от MaxClients или ServerLimit?

  3. Если нет, может ли кто-нибудь подтвердить, имеет ли nginx такой же риск? Мне кажется, что nginx не будет запускать OOM-Killer до точки сбоя так же легко, как apache, потому что я читал, что у него небольшое количество запущенных процессов и более или менее стабильное потребление памяти. Чего я здесь не знаю, так это того, что nginx может прекратить создавать потоки после исчерпания памяти, и просто ставить эти запросы в очередь, пока не станет больше памяти.

Для тех, кто отклонил вопрос: исследование было выполнено, но оно предложило ответы на вопросы 1 и 2, где именно так, как указано в комментарии Вомбла: да на вопрос № 1 и нет на вопрос № 2. Возможно, эти ответы были слишком очевидны для многих людей, но мне было трудно в них поверить, поэтому я решил спросить их здесь.

1 ответ

Чтобы ответить на прямые вопросы, которые вы задали:

Разве Apache не должен контролировать, сколько памяти он выделяет?

Да, так и должно быть. И это так.

Разве нет способа предотвратить создание новых процессов в Apache, если не доступно больше памяти независимо от MaxClients или ServerLimit?

Нет, нет.

Кто-нибудь может подтвердить, если Nginx имеет такой же риск?

Да, это так, поскольку у него нет способа помешать nginx создавать новые процессы перед лицом нехватки памяти.

Ниже приведен более широкий ответ, который может быть более полезен для людей, которые приезжают сюда в поисках информации по этой теме.

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

  • Знайте, что на самом деле делают ваши процессы Apache.
  • Не используйте негерметичные модули.
  • Не встраивайте полное время выполнения языка программирования в процессы, о которых вы не хотите сходить с ума по потреблению памяти.

Этот последний момент заслуживает особого внимания: махинации Apache почти исключительно вызваны mod_phpЭто была плохая идея, когда она была создана, и со временем она только ухудшилась. Однако дело в том, что если вы перенесете выполнение PHP в отдельный процесс, скажем, с помощью php-fpm, у вас все еще есть возможность того, что эти процессы могут выйти из строя и съесть всю вашу оперативную память, если у вас нет соответствующие средства управления ресурсами (в основном те же кнопки, что и у вас внутри Apache). Единственная выгода, которую вы получаете, от потребления памяти PoV, если запустить php-fpm mod_php в том, что есть всего несколько работников php-fpm, относительно количества работников Apache (в prefork), которые вам нужны для обслуживания типичной рабочей нагрузки, поэтому вы не получите большое количество больших процессов, а только небольшое количество больших процессы.

Другие вопросы по тегам