Оставляет ли PHP proc_nice потоки Apache при новой настройке приоритета?

При выполнении proc_nice(), действительно ли это хорошо, если вы используете нить Apache?

Если это так, и если текущий пользователь (не суперпользователь) не может вернуться к своему первоначальному приоритету, уничтожает ли соответствующий поток Apache (apache_child_terminate) на сервере Apache 2.0x?

Проблема в том, что я пытаюсь ограничить влияние приложения, которое позволяет пользователю выполнять запросы Ad-Hack. Запросы могут быть массивными, и результирующее преобразование данных требует много памяти и процессора.

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

ТИА

1 ответ

Решение

В такой ситуации решение, если часто, чтобы не выполнять такую ​​тяжелую работу внутри процессов Apache, но также:

  • запустить внешний процесс PHP, используя что-то вроде shell_exec Например, это если вы должны работать в синхронном режиме (то есть, если вы не можете выполнить задачу пару минут спустя)
  • перенесите задачу в систему FIFO и немедленно верните пользователю сообщение о том, что "ваша задача будет вскоре обработана"
    • а другой процесс (например, запускаемый через crontab каждую минуту) проверяет, что очередь FIFO
    • и сделать обработку это есть что-то в очереди
    • Этот процесс сам по себе может выполняться в режиме низкого приоритета.


Как можно чаще, особенно если тяжелые вычисления занимают некоторое время, я бы выбрал второе решение:

  • Это позволяет пользователям мгновенно получить отзыв: "сервер получил ваш запрос и скоро его обработает"
  • Это не делает процессы Apache "работающими" надолго: тяжелые вещи выполняются другими процессами.
  • Если однажды вам понадобится такое количество вычислительной мощности, что одного сервера больше не будет достаточно, систему такого типа будет легче масштабировать: просто добавьте второй сервер, который будет выбирать из той же очереди FIFO
  • Если ваш сервер действительно слишком загружен, вы можете остановить обработку из очереди, по крайней мере, на некоторое время, чтобы нагрузка стала лучше - например, это может быть полезно, если ваши критически важные веб-службы часто используются в определенных временное ограничение.


Другим (симпатичным, но я еще не пробовал) решением было бы использовать какой-то инструмент, такой как, например, Gearman:

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

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