Оставляет ли PHP proc_nice потоки Apache при новой установке приоритетов? - PullRequest
0 голосов
/ 04 декабря 2009

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

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

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

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

ТИА

1 Ответ

2 голосов
/ 04 декабря 2009

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

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


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

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


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

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

...