SPIP et processus PHP

Bonjour,

Je dispose d’un serveur sur lequel j’héberge une dizaine de sites SPIP mutualisés. Ce serveur autorise au maximum 8 processus PHP simultanés. Malheureusement, ces 8 processus sont assez souvent atteints et bloquent le serveur.

J’ai accès à un service appelé « PHP-FPM real-time status page » dans lequel je vois les processus PHP actifs et il s’avère que spip.php?action=cron est actif depuis 4 jours et me bloque l’un des 8 processus en permanence. Comme j’héberge plusieurs site, je me demande si mes blocages de serveur à répétition ne viennent pas de là…

J’aimerais savoir s’il était normal que spip.php?action=cron reste actif en permanence et s’il y avait un moyen de désactiver ce processus via SPIP (à l’heure actuelle, je redémarre le serveur à chaque blocage mais c’est un peu lourd).

Je vous remercie par avance de l’aide que vous pourriez m’apporter.
Sébastien

Bonjour,

8 process en // seulement me parait très faible sur un serveur qui héberge plusieurs sites. De base, j'aurais tendance à pousser les curseurs. Ensuite, un script php vit un usuellement un certain temps maximum et ensuite, il est tué par le serveur ( au bout de 30 secondes par exemple ). Du coup, le fait qu'une tache cron puisse bloquer comme ça me parait anormal...

Il faudrait je pense faire quelques modifications sur la config du serveur. Maintenant, une tache cron qui dure aussi longtemps, c'est surprenant. Dans /ecrire/?exec=job_queue il y a la liste des taches cron en attente. Cela pourrait valoir le coup de regarder ce qui est coincé.

Merci Vincent

En fait, je n’ai pas la main sur le paramétrage du serveur. Mes quelques sites sont très peu visités, je pense que j’arrive à saturation à cause de processus PHP qui ne se terminent pas correctement, indépendamment du temps maximal de calcul (max_execution_time à 180 s).

Sur la page job_queue, rien de spécial, j’ai même réinitialisé la liste. Sur le serveur, le processus spip.php?action=cron reste dans la liste des processus actifs avec tout de même un statut « Finishing »…

Bonjour,

Le 22/02/2017 à 23:20, Sébastien Rebaudo a écrit :

Merci Vincent

En fait, je n'ai pas la main sur le paramétrage du serveur. Mes quelques
sites sont très peu visités, je pense que j'arrive à saturation à cause
de processus PHP qui ne se terminent pas correctement, indépendamment du
temps maximal de calcul (max_execution_time à 180 s).

Sur la page job_queue, rien de spécial, j'ai même réinitialisé la liste.
Sur le serveur, le processus spip.php?action=cron reste dans la liste
des processus actifs avec tout de même un statut "Finishing"...

Question certainement stupide mais bon je me lance: s'il y a une 10aine de sites spip, j'imagine qu'il y a forcément une 10aine de cron qui se déclenchent sans arrêt (de mémoire le cron n'est-il pas activé par les visites sur le site ?) Donc avoir en tout temps un cron spip actif ne me semble pas si bizarre. Le fait que ce soit un spip mutualisé (si on l'entend au sens mutualisation du noyau de spip) ne doit pas y changer grand chose, chaque site/domaine mutualisé doit lancer son propre process cron (c'est lié à l'url complète non ?) ? Ce qui est sûr c'est qu'une 10 aine de site avec 8 process PHP max me parait juste impossible à faire vivre.

Le 22 février 2017 à 16:40, Vincent <vincent@logaweb.fr
<mailto:vincent@logaweb.fr>> a écrit :

    Bonjour,

    8 process en // seulement me parait très faible sur un serveur qui
    héberge plusieurs sites. De base, j'aurais tendance à pousser les
    curseurs. Ensuite, un script php vit un usuellement un certain temps
    maximum et ensuite, il est tué par le serveur ( au bout de 30
    secondes par exemple ). Du coup, le fait qu'une tache cron puisse
    bloquer comme ça me parait anormal...

    Il faudrait je pense faire quelques modifications sur la config du
    serveur. Maintenant, une tache cron qui dure aussi longtemps, c'est
    surprenant. Dans /ecrire/?exec=job_queue il y a la liste des taches
    cron en attente. Cela pourrait valoir le coup de regarder ce qui est
    coincé.

--
Pierre

Merci pour ta réponse Zedd,

Le fait qu’il puisse y avoir des cron SPIP qui se déclenchent très fréquemment me paraît normal mais dans ce cas, cela ne devrait-il pas correspondre à un processus PHP différent à chaque fois ? Je suis juste interpellé par le fait qu’un processus puisse durer plus de 4 jours.

Je vais essayer de faire un monitoring plus précis pour évaluer si les 8 processus php constituent une limitation trop importante dans mon cas.

Par ailleurs, je peux peut être faire une tâche cron Unix pour tuer les processus PHP qui durent trop longtemps…? Mais c’est sûr que j’aimerais mieux comprendre à quoi correspond cette histoire de cron SPIP qui ne se termine jamais.

Bonjour,

Le fait qu'il puisse y avoir des cron SPIP qui se déclenchent très fréquemment me paraît normal mais dans ce cas, cela ne devrait-il pas correspondre à un processus PHP différent à chaque fois ?

-> Ben ... si. Après faudrait voir comment marche l'hébergement: qui est chaîné a qui pour servir les pages, interpréter etc. A vue de nez, c'est apache + un truc genre php-fpm mais bon ...

Je suis juste interpellé par le fait qu'un processus puisse durer plus de 4 jours.

-> Avec un max_execution_time à 180, cela n'est normalement pas possible: au bout de 180 secondes, le script est censé être tué ...
A moins qu'il ne soit lancé en tant que cli ( par une vraie tache cron du système, via une ligne de commandes ) ? Auquel cas, il peut avoir un paramétrage différent du reste et un max_execution_time=0 .

Je vais essayer de faire un monitoring plus précis pour évaluer si les 8 processus php constituent une limitation trop importante dans mon cas.

-> Comme Zedd, cela me parait faible. Pour dimensionner une infra, il ne faut pas considérer la moyenne, mais les pics.
Par exemple, si le serveur ne fait rien pendant 23h et que tout le monde débarque sur la plage 12-13h, c'est sur cette plage qu'il faut regarder.

Du coup, le chiffre intéressant n'est pas le nombre de visiteurs / jours qui viennent, mais le nombre max d'accès concurrents au plus fort de la journée.

Par ailleurs, je peux peut être faire une tâche cron Unix pour tuer les processus PHP qui durent trop longtemps....?

-> Non: max_execution_time est la pour ça ... En outre, il faudrait ( à priori ) pour cela être root, et donc il serait plus efficace dans ce cas de modifier la configuration du serveur :slight_smile:

Mais c'est sûr que j'aimerais mieux comprendre à quoi correspond cette histoire de cron SPIP qui ne se termine jamais.

-> Il y a quoi comme plugins qui tournent sur les sites ?

Sinon, dans tmp/log/queue.log se trouvent les logs des files de tache cron. Et il est possible de changer le comportement des logs en créant un fichier mes_options.php contenant par exemple :
$GLOBALS['taille_des_logs']=1024*1024;
define('_MAX_LOG',0);
define('_LOG_FILTRE_GRAVITE',8);
define('_DEBUG_SLOW_QUERIES',true);

Voir : Les aides au débuggage de squelettes - SPIP "Obtenir encore plus d’informations pour le debuggage".

Attention: ça va faire de gros fichiers assez vite ... Donc il faut bien penser à tout couper après debug.

Il y a possibilité d'avoir un accès SSH sur l'hébergement ? Si oui, un ps -elf donne la liste des process en cours d'exécution, ainsi que le temps passé en activité.
On peut avoir plus de détails concernant le temps d'exécution et cie ainsi :
ps -axo fname,pid,euser,start_time,cputime,cmd --sort=cmd

voir man ps pour les détails :slight_smile:

Slt,

Le 23/02/2017 à 11:38, Sébastien Rebaudo a écrit :

Merci pour ta réponse Zedd,

Le fait qu'il puisse y avoir des cron SPIP qui se déclenchent très
fréquemment me paraît normal mais dans ce cas, cela ne devrait-il pas
correspondre à un processus PHP différent à chaque fois ? Je suis juste
interpellé par le fait qu'un processus puisse durer plus de 4 jours.

Pas assez pointu sur ce sujet, dans le cadre d'une mutualisation que se passe-t-il ? chaque appel au cron par un des sites génère-t-il un nouveau thread PHP ? cela dépend-t-il du mode d'éxécution de PHP ? (mod_hp ou Fcgid ne se comportent pas de la même façon je pense, si on rajoute suExec là-dessus ça passe au niveau polytechnicien du PHP).

Je vais essayer de faire un monitoring plus précis pour évaluer si les 8
processus php constituent une limitation trop importante dans mon cas.
Par ailleurs, je peux peut être faire une tâche cron Unix pour tuer les
processus PHP qui durent trop longtemps....? Mais c'est sûr que
j'aimerais mieux comprendre à quoi correspond cette histoire de cron
SPIP qui ne se termine jamais.

oui c'est sûr que ça serait plus satisfaisant de comprendre le pourquoi avant de prendre des mesures :slight_smile: Je continue de suivre cette conversation.

Le 23 février 2017 à 05:20, Zedd <csi@zedd.pro <mailto:csi@zedd.pro>> a
écrit :

    Bonjour,

    Le 22/02/2017 à 23:20, Sébastien Rebaudo a écrit :

        Merci Vincent

        En fait, je n'ai pas la main sur le paramétrage du serveur. Mes
        quelques
        sites sont très peu visités, je pense que j'arrive à saturation
        à cause
        de processus PHP qui ne se terminent pas correctement,
        indépendamment du
        temps maximal de calcul (max_execution_time à 180 s).

        Sur la page job_queue, rien de spécial, j'ai même réinitialisé
        la liste.
        Sur le serveur, le processus spip.php?action=cron reste dans la
        liste
        des processus actifs avec tout de même un statut "Finishing"...

    Question certainement stupide mais bon je me lance: s'il y a une
    10aine de sites spip, j'imagine qu'il y a forcément une 10aine de
    cron qui se déclenchent sans arrêt (de mémoire le cron n'est-il pas
    activé par les visites sur le site ?) Donc avoir en tout temps un
    cron spip actif ne me semble pas si bizarre. Le fait que ce soit un
    spip mutualisé (si on l'entend au sens mutualisation du noyau de
    spip) ne doit pas y changer grand chose, chaque site/domaine
    mutualisé doit lancer son propre process cron (c'est lié à l'url
    complète non ?) ? Ce qui est sûr c'est qu'une 10 aine de site avec
    8 process PHP max me parait juste impossible à faire vivre.

        Le 22 février 2017 à 16:40, Vincent <vincent@logaweb.fr
        <mailto:vincent@logaweb.fr>
        <mailto:vincent@logaweb.fr>> a écrit :

            Bonjour,

            8 process en // seulement me parait très faible sur un
        serveur qui
            héberge plusieurs sites. De base, j'aurais tendance à
        pousser les
            curseurs. Ensuite, un script php vit un usuellement un
        certain temps
            maximum et ensuite, il est tué par le serveur ( au bout de 30
            secondes par exemple ). Du coup, le fait qu'une tache cron
        puisse
            bloquer comme ça me parait anormal...

            Il faudrait je pense faire quelques modifications sur la
        config du
            serveur. Maintenant, une tache cron qui dure aussi
        longtemps, c'est
            surprenant. Dans /ecrire/?exec=job_queue il y a la liste des
        taches
            cron en attente. Cela pourrait valoir le coup de regarder ce
        qui est
            coincé.

    --
    Pierre

--
Pierre

Merci beaucoup Vincent et Zedd !

Désolé pour la réponse très tardive…
Vos commentaires m’ont été utiles.

J’ai fait un suivi des processus php de mes sites sur 4 semaines.
Il apparaît que les 8 processus php simultanés ne sont pas un facteur limitant en ce qui me concerne. La limite (de 8) n’a été atteinte que 2 fois en 4 semaines. Lors de ces 2 dépassements, les processus en trop se sont mis en file d’attente et ont quand même été exécutés (avec quelques centièmes de secondes de retard).

Après 2 semaines, j’ai commencé à avoir des processus « permanents » qui s’accumulaient et limitaient le nombre de processus simultanés disponibles.
Ces processus sont dans un état « Finishing » permanent. Il ne s’agit pas seulement de spip.php?action=cron mais aussi de index.php.

J’ai écrit à mon hébergeur et j’attends une réponse que je posterai si elle éclaire un peu la situation.

Merci encore et bon début de semaine,
Sébastien