Запуск bash-скрипта с php с низким приоритетом или ограничением процессора

Вопрос или проблема

У меня есть 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, не стесняйтесь обращаться. Надеюсь, это поможет вам в решении ваших текущих проблем с производительностью.

Оцените материал
Добавить комментарий

Капча загружается...