Est-ce que PHP laisser proc_nice threads Apache à nouveau l'établissement des priorités?
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
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.