2009-11-09 5 views
0

Dites donc qu'il y a un processus de serveur qui prend trop de temps. Le client se plaint que cela «expire».Processus Apache abandonné, combien de temps cela va-t-il durer?

Corrigez-moi si je me trompe, mais ce délai particulier pourrait avoir à faire avec le paramètre de délai d'apache, mais pas nécessairement. Je crois que c'est le cas parce que lors du test de la page en question, nous ne pouvions pas l'obtenir de façon fiable - la plupart du temps le navigateur tournait aussi longtemps qu'il le fallait.

Le paramètre de délai d'attente prend effet en cas de problème de connexion avec le client, comme décrit dans the documentation. Mais si la connexion était bonne, ce serait au client de fermer la connexion (je crois). Je supposais que cela signifiait également que si le client fermait son navigateur, Apache atteindrait la limite de délai (dans mon cas, 300 secondes), et tuerait le processus. Cela ne semble pas être le cas.

Voilà comment je l'ai testé:
J'ai ajouté une boucle while à un code sur le serveur:

too_long = 2000 
tstart = time.time() 
f = open('/tmp/timeout_test.txt', 'w') 
while True: 
    time.sleep(100) 
    elapsed = time.time() - tstart 
    f.write('Loop, %s elapsed\n' % elapsed) 
    if elapsed > too_long: 
     break 

J'ouvre alors la page Web pour lancer cette boucle, et courut netstat sur le serveur:

~$ netstat -np | grep ESTAB | grep apache 
tcp  0  0 10.102.123.6:443  10.102.119.101:53519 ESTABLISHED 16534/apache2 
tcp  0  0 127.0.0.1:60299   127.0.0.1:5432   ESTABLISHED 16534/apache2 

(qui est moi à 10.102.119.101, le serveur est à 10.102.123.6)
Je puis fermé mon navigateur et rediffusé cette ligne netstat:

~% netstat -np | grep ESTAB | grep apache 
tcp  0  0 127.0.0.1:60299   127.0.0.1:5432   ESTABLISHED 16534/apache2 

Ma connexion a disparu, mais le serveur était toujours dans la boucle, je pourrais confirmer en exécutant:

~% lsof | grep timeout 
apache2 16534 www-data 14w  REG  8,1  0  536533 /tmp/timeout_test.txt 

qui signifie que le processus apache avait encore ce fichier ouvert. Pour les 2000 prochaines secondes, quand j'ai couru:

~% cat /tmp/timeout_test.txt 

Je n'ai rien. Après 2000 secondes, la ligne netcat ne produisait rien du tout, et le fichier tmp était rempli avec la sortie de la boucle while.

Il semble donc que le processus Apache fait exactement ce qu'il a été demandé, quelle que soit la connexion du client? Et à quoi sert cette connexion de bouclage?

+0

Quelle interface apache vers python utilisez-vous? mod_python? fcgi? CGI? –

+0

J'utilise mod_wsgi – EMiller

+0

* Processus Apache abandonné, combien de temps cela va-t-il durer? * Jusqu'à ce qu'il ait besoin de se reposer, de manger, de trouver de nouveaux parents ou de mourir. – voyager

Répondre

1

Correct. Dans un module C apache, vous pouvez ajouter une vérification comme:

/* r is the 'request_rec' object from apache */ 
if (r->connection->aborted) { 
    /* stop processing and return */ 
} 

pour vérifier que le client est toujours connecté. Probablement l'interface python a quelque chose de similaire. En ce qui concerne la connexion de bouclage, il s'agit d'une connexion à une base de données postgresql maintenue ouverte aussi longtemps que cette boucle est en cours d'exécution.

+0

à droite, postgres! J'aurais dû remarquer le port 5432 donc en gros c'est à l'interface Apache que j'utilise pour décider si ça devrait tuer un processus avorté? – EMiller

+0

Oui, mais il doit y avoir un moyen par lequel mod_wsgi peut relayer cette information à votre code python. – Gonzalo

+0

hmh, je ne sais pas pourquoi mod_wsgi doit relayer cette information à mon code python? Mod_wsgi ne peut-il pas tuer le processus? En regardant la source mod_wsgi, il devrait enregistrer l'événement: http://code.google.com/p/modwsgi/source/browse/trunk/mod_wsgi/mod_wsgi.c#3263 mais je ne le trouve pas de mes journaux. Cet événement ne devrait-il pas se déclencher à la fin du délai imparti à Apache? (5 min par défaut) – EMiller

Questions connexes