- Вопрос или проблема
- Ответ или решение
- Как запустить bash-скрипт с помощью PHP с пониженным приоритетом или ограничить использование процессора
- 1. Установка пониженного приоритета с помощью nice
- 2. Ограничение использования CPU с помощью cpulimit
- 3. Использование ulimit для ограничения ресурсов
- 4. Какое решение выбрать?
- Заключение
Вопрос или проблема
У меня есть bash-скрипт, который запускает набор php-скриптов. Когда он выполняется, это занимает час и загружает процессор на 95-99%. Это вызывает проблемы в нашей LAMP-стеке (в основном в процессе Apache), и наш сайт на том же сервере начинает выдавать ошибки таймаута или 500.
Как я могу:
- Запустить bash-скрипт и все связанные задачи (php-скрипты, которые также обращаются к базе данных PostgreSQL) с низким приоритетом, чтобы задачи apache, php и базы данных для веб-сервера всегда имели приоритет, ИЛИ
- Ограничить использование процессора для скрипта и связанных задач, например, до 25% процессора
Я не уверен, какое решение лучше.
В дополнение к nice
стоит рассмотреть ограничение времени процессора, используя ulimit -t
(предполагая, что вы на платформе *nix)
Запускайте ваши команды через nice
.
nice запускает утилиту с измененным приоритетом планирования. Если задано увеличение,
оно используется; в противном случае предполагается увеличение на 10. Суперпользователь может запускать утилиты с приоритетами выше нормального, используя отрицательное увеличение. Приоритет может быть изменен в диапазоне от -20 (самый высокий) до 20 (самый низкий).Доступные параметры: -n increment Положительное или отрицательное десятичное целое число, используемое для изменения системного приоритета планирования утилиты.
Как и предлагали другие, nice
— это то, что вам нужно. Ограничение до 25% процессора будет ненужно удлинять время, когда производительность системы снижена.
Предположим, у вас есть четыре автомобиля, и вам нужно сделать несколько дел. Что имеет больше смысла: использовать один автомобиль для дел или использовать все неиспользуемые автомобили для дел? Первый вариант оставляет 4 автомобиля для важных задач. Второй вариант оставляет только 3. И в большинстве реалистичных случаев, первый вариант также выполнит низкоприоритетную задачу быстрее.
Ответ или решение
Как запустить bash-скрипт с помощью PHP с пониженным приоритетом или ограничить использование процессора
Ваша проблема заключается в том, что выполнение bash-скрипта, который запускает набор PHP-скриптов, значительно нагружает процессор и вызывает сбои на веб-сервере. Это достаточно распространенная ситуация, особенно на серверах с ограниченными ресурсами, где несколько процессов конкурируют за вычислительные мощности. Рассмотрим, как можно эффективно решить эту проблему при помощи инструментов POSIX-систем.
1. Установка пониженного приоритета с помощью nice
Первое решение – это использование утилиты nice
, которая позволяет вам запускать ваши скрипты с изменённым приоритетом. Поскольку стандартный приоритет процесса варьируется от -20 (наивысший) до 19 (низший), вы можете запустить ваш bash-скрипт с положительным значением для понижения приоритета. Например:
nice -n 10 ./your_script.sh
Эта команда запускает ваш скрипт с приоритетом 10, что гарантирует, что другие процессы, такие как Apache и процессы PHP, будут иметь более высокий приоритет на использование CPU.
2. Ограничение использования CPU с помощью cpulimit
Если вы хотите более жестко контролировать использование процессора, вы можете использовать утилиту cpulimit
, которая позволяет задать максимальный процент процессорного времени, который может использовать процесс. Установка cpulimit
может варьироваться в зависимости от вашего дистрибутива, однако, после установки вы можете вызвать вашу bash-скрипт так:
cpulimit --limit=25 -- ./your_script.sh
Эта команда ограничивает использование CPU до 25%. Однако, имейте в виду, что это может значительно увеличить общее время выполнения вашего скрипта, так как он будет использовать процессор только в заданных рамках.
3. Использование ulimit
для ограничения ресурсов
Утилита ulimit
может быть использована для ограничения времени работы процесса. Например, чтобы ограничить процесс на 3600 секунд (1 час):
ulimit -t 3600; nice -n 10 ./your_script.sh
Этот вариант не только понизит приоритет вашего скрипта, но и предотвратит его выполнение дольше определённого времени, тем самым сокращая риск перегрузки системы.
4. Какое решение выбрать?
Ведя аналогию, предложенную в обсуждениях, если у вас есть несколько автомобилей (процессов), лучше использовать один для менее важных задач, оставляя при этом остальные для важных операций. Использование nice
— это более оптимальный путь в вашей ситуации, так как он поможет снизить приоритет задачи без ненужного увеличения времени ее выполнения. Однако, если вы всё же столкнётесь с высокими пиками загрузки CPU, добавление cpulimit
может стать разумным шагом.
Заключение
Правильное управление приоритетами выполнения скриптов может значительно улучшить стабильность и производительность вашего веб-сервера. Используя nice
, cpulimit
и ulimit
, вы сможете эффективно снизить нагрузку на сервер и предотвратить возникновение ошибок, связанных с отказом в обслуживании.
Если вам нужны дополнительные советы по оптимизации PHP или Apache, не стесняйтесь обращаться. Надеюсь, это поможет вам в решении ваших текущих проблем с производительностью.