Est-ce que PHP laisser proc_nice threads Apache à nouveau l'établissement des priorités?

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

Question

Lors de l'exécution proc_nice (), est-il nice'ing en fait le fil d'Apache?

Si oui, et si l'utilisateur actuel (utilisateur non-super) ne peut pas renice à sa priorité initiale est de tuer le fil approprié d'Apache (apache_child_terminate) sur un serveur Apache 2.0x?

Le problème est que je suis en train de limiter l'impact d'une application qui permet à l'utilisateur d'exécuter des requêtes Ad-Hack. Les requêtes peuvent être massives et la résultante de transformation sur les données nécessite beaucoup de mémoire et CPU.

J'ai réécrites déjà le processus pour être plus courant à base - aide à la consommation de mémoire, mais je voudrais aussi que le processus d'exécuter une priorité moindre. Cependant, je ne peux pas laisser le fil Apache en faible priorité que nous avons beaucoup de services Web de haute priorité en cours d'exécution sur cette même case.

TIA

Était-ce utile?

La solution

Dans ce genre de situation, une solution si souvent de ne pas faire ce genre de travaux lourds dans les processus Apache, mais soit:

  • exécuter un processus PHP externe, en utilisant quelque chose comme shell_exec , par exemple - est si vous devez travailler en mode synchrone (par exemple, si vous ne pouvez pas exécuter la tâche quelques minutes plus tard)
  • pousser la tâche à un système FIFO, et revenir un message à immediat l'utilisateur dit « votre tâche sera traitée rapidement »
    • et ont un autre processus (lancé par une crontab chaque minute, par exemple) vérifier que la file d'attente FIFO
    • et faire le traitement qu'il ya quelque chose dans la file d'attente
    • Ce processus lui-même, peut fonctionner en mode de faible priorité.


Aussi souvent que possible, surtout si les calculs lourds prennent un certain temps, je pencherais pour la deuxième solution:

  • Il permet aux utilisateurs d'obtenir des commentaires immédiatement: « le serveur a reçu votre demande, et traitera bientôt »
  • Il n'a pas à garder les processus de Apaches « travail » pour longtemps: les trucs lourds se fait par d'autres processus
  • Si, un jour, vous avez besoin d'une telle quantité de puissance de traitement d'un serveur ne suffit plus, ce genre de système sera plus facile à l'échelle: il suffit d'ajouter un second serveur qui va choisir de la même file d'attente FIFO
  • Si votre serveur est vraiment trop chargé, vous pouvez arrêter le traitement de la file d'attente, au moins pendant un certain temps, de sorte que la charge peut mieux - par exemple, cela peut être utile si vos critiques web services sont utilisés beaucoup dans un délai précis.


Une autre (beau, mais je n'ai pas encore essayé) solution serait d'utiliser une sorte d'outil comme, par exemple, Gearman :

  

Gearman fournit une application générique   cadre à affermer travail à d'autres   machines ou processus qui sont mieux   adapté pour faire le travail. Il vous permet
  pour travailler en parallèle, pour charger   un équilibre entre le traitement et appeler   fonctions entre les langues. Il peut être
  utilisés dans une variété d'applications,   à partir de sites Web haute disponibilité pour   le transport de la réplication de bases de données   événements.
En d'autres termes, il est le   système nerveux pour savoir comment distribué   traitement communique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top