Aller au contenu

Connaître la charge d'un serveur...


Sujets conseillés

Posté

Bonjour,

Je vous explique le contexte. J'ai un serveur semi-dedié en FreeBSD. Dessus je voudrais pouvoir faire tourner un 'gros' script en PHP trés consommateur en ressources...

Seulement voila, je voudrais lancer ce script "que" si 50% des ressources sont dispo par exemple.

La question est donc, existe t'il un moyen en PHP d'avoir ce genre d'info (Un peu comme la commande TOP en telnet) ?

Merci...

Posté

Juste pour mieux comprendre, quelles sont les "ressources" que ton script est censé utiliser :

- mémoire ?

- processeur ?

- file handles ?

- espace disque ?

Sinon, je ne connais pas tout, mais je ne connais pas de fonction php permettant d'accéder à ce type d'infos. Ni d'extensions d'ailleurs.

Mais il doit être possible d'exécuter depuis PHP un programme en langage évolué, ou un utilitaire pour récupérer l'info (avec shell_exec(), exec() etc...)...

Les experts en FreeBSD nous donneront le truc définitif ...

Remarque : en principe, un couple Apache/PHP est paramétré pour que chaque script php tourne dans une "boîte" limitée en ressources... Donc en pratique, tu atteint les limites des ressources allouées à ton script bien avant d'atteindre les limites de ressources du serveur.

Posté
Juste pour mieux comprendre, quelles sont les "ressources" que ton script est censé utiliser :

- mémoire ?

- processeur ?

- file handles ?

- espace disque ?

(...)

Remarque : en principe, un couple Apache/PHP est paramétré pour que chaque script php tourne dans une "boîte" limitée en ressources... Donc en pratique, tu atteint les limites des ressources allouées à ton script bien avant d'atteindre les limites de ressources du serveur.

Merci je pense au processeur.... Mais si tu me dis qu'un script est limité tout va bien ! Est-ce paramétrable ? Car mon script fait monter le processeur jusqu'a 60% durant 5-6 secondes... Donc je me demander si c'est pas plutôt risqué.

D'autant plus qu'il s'agit d'un script pour un "futur" outil sur Yooda qui pourra être lancer par plusieurs utilisateurs....

Ce que je souhaite réaliser est une procédure de sécurité qui en cas d'une utilisation excessive des ressources de la machine renvoi vers un "Trop d'utilisateurs veuillez nous excusez ;) "

Posté

Super Merci pour ta remarque!!! Tu m'aide pas trop la.....

A moins que.... Je t'envoi une autorisation de prélévement. Et au moins ta remarque aura servi à quelque chose :D

Posté

Salut Dams,

La priorité d'un process ne pourra se paramétrer qu'avec PHP5 et la fonction proc_nice()

Par contre, si tu as accès à l'appel exec, tu peux utiliser "nice" qui est une manière de donner à un processus une priorité plus haute/basse que la priorité standard. Ceci pour autant que ton hébergeur le permette...

Comme tu es un "utilisateur lambda" (et non root) tu ne peux que baisser la priorité, ce qui est logique et correspond à ce que tu veux faire, à peu de choses près.

Un script en priorité basse ne s'exécutera que si le CPU a du "idle time" et sera ralenti pour attribuer du temps machine à tout processus qui en fera la demande.

Dan

Posté

Bonjour,

je ne m'y connais pas trop, mais n'est ce pas là qu'intervient la fonction virtual_host ??

Anonymus.

Posté

Nan... Virtual ne permet pas de controler mon script ;)

Par contre pour la fonction proc_nice() bien joué Dan... Et j'ai même trouver comment le faire en PHP4:

<?php

function proc_nice($priority) {
 exec("renice +$priority ".getmypid());
}

//You also need a shutdown function if you don't want to leave your http deamons with a modified priority
function exit_func(){
 // Restore priority
 proc_nice(0);
}

register_shutdown_function('exit_func');
?>

Ca me paraît pas mal tout ca....

Avec ceci je peux donc mettre proc_nice(15) dans mon code pour que mon script ne risque pas de bloquer mon serveur. Il est alors non prioritaire. Et je fini par exit_func() pour restaurer la priorité de mon process..

Un process correspond a un appel de page ou plusieur ? Je ne risque pas de ralentir d'autre utilisateur avec cette methode ?

Posté

Salut Dams,

C'est vrai qu'il y a "renice" qui te permet de changer la priorité d'un process qui tourne déjà.

Un process est simplement un programme exécutable, auquel du temps machine est attribué par un processus "superviseur" (le scheduler) en fonction de sa priorité et de la charge machine.

En lancant un process avec la commande "nice" (ou en utilisant "renice") tu ne fais que donner instruction au chef d'orchestre (scheduler) d'attribuer plus ou moins de ressources à un processus spécifique.

Il est clair que les ressources attribuées à un processus impactent l'ensemble du pool mais dans ton cas, comme tu règleras la priorité "à la baisse" tu laisseras plus de ressources pour les autres processus. Donc l'impact se fera dans le bon sens pour ceux-ci ....

Dan

Posté

Avec la fonction renice, il est possible de faire tourner un script en continu sur un serveur mutualisé, sans se faire lyncher par son hébergeur. Ainsi :

J'ai un script qui tourne pendant 6-8 heures, sans discontinuer, et tous les jours de la semaine depuis dix jours, et mon hébergeur ne m'a toujours rien dit. pas de dépassements de hits, pas de probleme sql, rien... Enfin.. rien d'anormal.

Apparemment, effectivement, avec la fonction 'renice', parametrée à 18, fait que mon script passe toujours en dernier dans l'ordre des executions. Mais c'est pas trop génant. Puisqu'il ne s'arrete pas ;)

A+, Anonymus.

Posté

Salut Anonymus,

J'imagine qu'il ne s'agit pas d'un script php, parce qu'il aurait atteint depuis longtemps le 'max_execution_time' paramétré par défaut à 30 secondes ;)

Pour lever toute limite, il faudrait le paramétrer à 0 et je ne connais pas d'hébergeur l'ayant fait. Certains, comme Free et Online l'abaissent même (8 secondes pour Online)

Dan

Posté

anonymus tu fait donc ca en PHP 5 ? Sinon POUR LE TIMEOUT c'est contournable:

Lorsqu'elle est appelée, la fonction set_time_limit() remet le compteur de zéro. En d'autres termes, si la limite par défaut est à 30 secondes, et qu'après 25 secondes d'exécution du script l'appel set_time_limit(20) est fait, alors le script tournera pendant un total de 45 secondes avant de finir.

(http://fr2.php.net/manual/fr/function.set-time-limit.php)

Sinon pour en revenir au sujet initial je vais pouvoir arriver a gerer ma charge reseau grace a renice + un contrôle du nombre maximum d'utilisateur simultané. En effet, j'ai peur que mon script soit victime de son succès :lol:

Par contre a priori la fonction proc_nice cité ci dessous ne me permet pas de remettre le process a une priorité normal une fois le script fini.. :(

Posté

Désolé de vous décevoir, mais ::

C'est tout en php, et Amen n'est pas encore au php 5.

et mon script tourne actuellement depuis hier soir sans s'arreter. Je suis pas sûr de comprendre le script (et j'ai pas eu le temps de l''etudier'), mais apparemment, ca vient bien du 'renice'.

    //low priority if allowed
   print _AT_exec('renice 18 '.getmypid()).$br;

et c'est tiré du 'spider' de phpdig, un moteur de recherche tout en php.

ps : et tant qu'à faire, c'est pour faire un moteur de recherche spécialisé sur le php... à l'adresse :=>labonneadresse.com.

je vais me renseigner chez le constructeur du script, et vous en dit plus.

Anonymus.

Posté

Bon....

En fait, il s'agit de la fonction set_time_limit, qui permet de faire fonctionner un script pendant la période indiquée en parametre.

Exemple :

set_time_limit(86400); permet de le faire marcher pendant 1 journée.

Plus d'infos ? => http://dev.nexen.net/docs/php/annotee/func...-time-limit.php

Voilà... Ca ne répond pas à la question de charge du serveur, mais peut y remédier. Et c'est en php3 et 4.

A+, Anonymus.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...