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