Page 1 sur 1

[Processus] Priorité de processus sur un serveur (résolu)

Publié : sam. 20 oct. 2012, 05:37
par Feng
Bonjour,

Dans le cadre d'un script de conversion de vidéos sur serveur je cherche à réduire la priorité du processus de conversion afin que le site ne soit pas ralentin durant l'opération.
Le serveur est un quad core à 2.6Ghz.

J'ai tenté d'utiliser cpulimit ( -l 50 ) et nice -n 10 sans succès aucun !! (le script est lancé en root)

Je ne trouve rien d'autre que ces deux commandes dans mes recherches ...

Re: Priorité de processus

Publié : sam. 20 oct. 2012, 08:58
par chipster
Bonjour
Merci de modifier le titre du sujet comme il l'a été demandé lors de l'édition de celui-ci :chinois:

Re: [Processus] Priorité de processus sur un serveur

Publié : sam. 20 oct. 2012, 11:47
par benjarobin
Tout d'abord pour nice 10 est la valeur par défaut donc tu ne risques pas d'avoir une limitation...
Il faut que tu lances le programme de cette façon

Code : Tout sélectionner

nice -n 19 mon-programme

Re: [Processus] Priorité de processus sur un serveur

Publié : dim. 21 oct. 2012, 09:08
par Feng
Hum, c'est pas faux, ceci dit ça ne change rien en fait ^^'

Mes autres sites sur ce serveur tournant normalement, je me demande si c'est pas le fait que ce soit lancé en sous-processus apache qui créé ce ralentissement. En fait j'en suis convaincu ^^ . Est-ce que lancer la fonction de conversion via la commande system (présente dans quasiment tous les langages de programmation) pourrait éviter ce soucis ? Peut-être en nohup ?

Re: [Processus] Priorité de processus sur un serveur

Publié : dim. 21 oct. 2012, 11:38
par benjarobin
Je crains de comprendre... Dis moi pas que tu passe par un cgi pour lancer la conversion et que le programme de conversion reste toujours attaché à apache

Re: [Processus] Priorité de processus sur un serveur

Publié : dim. 21 oct. 2012, 11:50
par Feng
Un script php qui lance un shell_exec :D (pas taper)

Re: [Processus] Priorité de processus sur un serveur

Publié : dim. 21 oct. 2012, 12:10
par benjarobin
Ok dans ce cas appel ce script avec ton shell_exec

Code : Tout sélectionner

#!/bin/bash

daemonize() {
    ((
        [[ -t 0 ]] && exec </dev/null
        [[ -t 1 ]] && exec >/dev/null
        [[ -t 2 ]] && exec 2>/dev/null
        cd /
        eval exec {3..255}\>\&-
        exec setsid "$@"
    ) & ) &>/dev/null
}

daemonize nice -19 "$@"
Et tu l'appel de cette façon shell_exec("chemin-script sleep 30");
J'ai mis sleep 30 comme exemple mais tu peux mettre n'importe quelle autre commande

Mais encore mieux, via un paquet

Code : Tout sélectionner

yaourt -S daemonize
Puis

Code : Tout sélectionner

shell_exec("daemonize /usr/bin/nice -19 sleep 30");

Re: [Processus] Priorité de processus sur un serveur

Publié : dim. 21 oct. 2012, 21:28
par Feng
Merci !!

Par contre du coup je dois changer de stratégie, puisqu'en procédant ainsi, le script php n'attend pas la fin de la commande démonisée, je dois rajouter un curl pour informer le site que la conversion est terminée :)

Re: [Processus] Priorité de processus sur un serveur (RESOLU

Publié : dim. 21 oct. 2012, 23:49
par benjarobin
daemonize possède une option pour écrire le PID de l’action en court, avec un peu d'Ajax cela se fait bien :-)

Re: [Processus] Priorité de processus sur un serveur (RESOLU

Publié : dim. 21 oct. 2012, 23:53
par Feng
La conversion est asynchrone : lorsqu'une nouvelle vidéo est envoyée, elle est mise en attente, puis sera convertie quand ce sera son tour. Je n'ai donc pas besoin de suivi pour le client via de l'Ajax :p
Néanmoins je peux mettre un while & sleep qui vérifiera si le processus est toujours en cours ou pas, dès qu'il ne l'est plus, on sort de la boucle. C'est pas super clean mais bon ...

Re: [Processus] Priorité de processus sur un serveur (RESOLU

Publié : lun. 22 oct. 2012, 00:25
par benjarobin
En gros tu as besoin d'une FIFO, personnellement j'aurais implémenter ceci différemment.

Un petit script en python qui écoute sur un port UDP en local, et qui empile les messages et les dépile depuis un thread...
Le PHP ne ferait qu'envoyer l’événement via un message UDP au script python qui s'occupe de dépiler la FIFO

Je cite python mais cela peut très bien être Qt comme tout autre langage :-)

Re: [Processus] Priorité de processus sur un serveur (RESOLU

Publié : lun. 22 oct. 2012, 00:31
par Feng
Malheuresement je ne connais ni python ni Qt, je ne connais que le bash dans lequel j'arrive à me débrouiller.
Si je comprends bien tu parles d'un service indépendant qui recevrais l'instruction "converti la vidéo 1337" , qui irais la chercher et la convertirais, puis renverrais un signal à apache pour l'informer que la vidéo a été convertie ?

Re: [Processus] Priorité de processus sur un serveur (résolu

Publié : lun. 22 oct. 2012, 02:41
par Feng
Visiblement daemonize a un bug... je teste avec :

Code : Tout sélectionner

daemonize -p test /bin/echo "plop"
Et quand je fais un cat test, il est vide !

Tu pourrais m'expliquer ta fonction daemonize à toi stp ? Je veux bien l'utiliser mais je comprends tout juste sa structure :/

Re: [Processus] Priorité de processus sur un serveur (résolu

Publié : lun. 22 oct. 2012, 13:40
par benjarobin
Hum c'est normal, pour le PID

Code : Tout sélectionner

daemonize -c /chemin/ -p foo /usr/bin/sleep 0
soit

Code : Tout sélectionner

daemonize -p /chemin/foo /usr/bin/sleep 0
On va dire que c'est un petit bug de daemonize

Re: [Processus] Priorité de processus sur un serveur (résolu

Publié : lun. 22 oct. 2012, 20:01
par Feng
Autant pour moi ... fallait comprendre que le working dir pour le démon c'était en fait pour daemonize et pas pour l'application démonisée !

Code : Tout sélectionner

[feng@firemoon-desktop ~]$ daemonize --help
daemonize: illegal option -- -
Bad option: --
daemonize, version 1.7.3
Usage: daemonize [OPTIONS] path [arg] ...

OPTIONS

-a             Append to, instead of overwriting, output files. Ignored 
               unless -e and/or -o are specified.
-c <dir>       Set daemon's working directory to <dir>.
-e <stderr>    Send daemon's stderr to file <stderr>, instead of /dev/null.
-E var=value   Pass environment setting to daemon. May appear multiple times.
-o <stdout>    Send daemon's stdout to file <stdout>, instead of /dev/null.
-p <pidfile>   Save PID to <pidfile>.
-u <user>      Run daemon as user <user>. Requires invocation as root.
-l <lockfile>  Single-instance checking using lockfile <lockfile>.
-v             Issue verbose messages to stdout while daemonizing.
Avoue que ça porte à confusion !!
Merci en tout cas :)