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

StackOverflow https://stackoverflow.com/questions/1849421

Вопрос

Действительно ли при выполнении proc_nice() приятно работать с потоком Apache?

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

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

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

ТИА

Это было полезно?

Решение

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

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


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

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


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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top