2009-12-04 10 views
0

Lors de l'exécution de proc_nice(), est-ce que c'est bien le thread d'Apache? Si oui, et si l'utilisateur actuel (non-super-utilisateur) ne peut pas renoncer à sa priorité d'origine est en train de tuer le thread Apache approprié (apache_child_terminate) sur un serveur Apache 2.0x?PHP proc_nice laisse-t-il les threads Apache avec un nouveau paramètre de priorité?

Le problème est que j'essaie 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 transformation résultante sur les données nécessite beaucoup de mémoire et de CPU.

J'ai déjà réécrit le processus pour qu'il soit davantage basé sur les flux, ce qui aide à la consommation de mémoire, mais j'aimerais aussi que le processus soit moins prioritaire. Cependant, je ne peux pas laisser le thread Apache en faible priorité car nous avons beaucoup de services web de haute priorité fonctionnant sur cette même boîte.

TIA

Répondre

2

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

  • terme d'un processus PHP externe, en utilisant quelque chose comme shell_exec, par exemple - si vous devez travailler en mode synchrone (c'est-à-dire si vous ne pouvez pas exécuter la tâche quelques minutes plus tard)
  • envoyez la tâche à un système FIFO et renvoyez immédiatement un message à l'utilisateur en lui disant "Votre tâche sera bientôt traitée"
    • 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 basse 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: « la le serveur a reçu votre requête et la traitera bientôt "
  • Les processus d'Apaches ne" travaillent "pas longtemps: le processus lourd est effectué par d'autres processus
  • Si, un jour, vous avez besoin d'une telle puissance de traitement qu'un serveur ne suffit plus, ce type de système sera plus facile à mettre à l'échelle: ajoutez simplement un second serveur qui choisira dans la même file FIFO
  • Si votre le serveur est vraiment trop chargé, vous pouvez arrêter le traitement de la file d'attente, au moins pendant un certain temps, afin que la charge puisse s'améliorer - par exemple, cela peut être utile si vos services web critiques sont beaucoup utilisés dans un temps donné. Cadre.


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 pour la ferme de travail à d'autres machines ou des processus qui sont mieux adapté pour faire le travail.
Il vous permet de travailler en parallèle, de charger traitement de la balance, et d'appeler fonctions entre les langues.
Il peut être utilisé dans une variété d'applications, à partir de sites Web haute disponibilité à le transport de la réplication de la base de données événements.
En d'autres termes, c'est le système nerveux pour la façon dont le traitement distribué communique.

+0

Merci pour les détails généreux. J'ai déjà divisé ce système en un système de requête/file d'attente comme vous l'avez décrit (certaines requêtes peuvent prendre des heures pour finir), bien que ce soit un service web qui fait le travail (et donc Apache est toujours impliqué). J'en ai discuté avec un collègue qui a également suggéré d'enlever un employé de la CLI pour faire le travail qui peut alors être "coupé". Je vais jeter un coup d'oeil à Gearman, mais en attendant, je vais envisager de passer à un travailleur CLI. – ChronoFish

+0

Vous êtes les bienvenus :-) ;; Si vos tâches prennent autant de temps, une application CLI, distincte d'Apache, semble vraiment nécessaire: sinon, vous ne terminerez pas avec un processus Apache disponible pour servir les pages, un jour ou l'autre ... Encore, Amusez-vous! –