2011-02-14 8 views
3

Je suis curieux de savoir pourquoi lors de l'évaluation du serveur web Python CherryPy en utilisant ab, avec -c 7 (7 threads simultanés), il peut serveur 1500 demandes/s (à propos de ce que je m'attends) , mais quand je change à -c 8 il tombe jusqu'à 25 demandes/s. Je cours CherryPy avec numthreads = 10 (mais il ne fait pas une différence si j'utilise numthreads = 8 ou 20) sur une machine Windows 64 bits avec quatre cœurs exécutant Python 2.6. Je suspecte à moitié que le Python GIL fasse partie du problème, mais je ne sais pas pourquoi cela se produit uniquement lorsque je reçois jusqu'à 8 threads demandant simultanément. Sur une machine à quatre cœurs, je m'attendrais à ce qu'elle change à -c 4, mais ce n'est pas le cas.CherryPy 60x comme lent dans le banc d'essai avec 8 demandes par rapport à 7

J'utilise le serveur Web CherryPy un fichier qui est livré avec web.py, et voici l'application WSGI que je teste contre:

from web.wsgiserver import CherryPyWSGIServer 

def application(environ, start_response): 
    start_response("200 OK", [("Content-type", "text/plain")]) 
    return ["Hello World!",] 

server = CherryPyWSGIServer(('0.0.0.0', 80), application, numthreads=10) 
try: 
    server.start() 
except KeyboardInterrupt: 
    server.stop() 

La sortie ab 7 et 8 threads simultanés est:

C:\\> ab -n 1000 -c 7 http://localhost/ 
... 
Concurrency Level:  7 
Time taken for tests: 0.670 seconds 
Complete requests:  1000 
Failed requests:  0 
Write errors:   0 
Total transferred:  130000 bytes 
HTML transferred:  12000 bytes 
Requests per second: 1492.39 [#/sec] (mean) 
Time per request:  4.690 [ms] (mean) 
Time per request:  0.670 [ms] (mean, across all concurrent requests) 
Transfer rate:   189.46 [Kbytes/sec] received 

C:\\> ab -n 1000 -c 8 http://localhost/ 
... 
Concurrency Level:  8 
Time taken for tests: 7.169 seconds 
Complete requests:  158 
Failed requests:  0 
Write errors:   0 
Total transferred:  20540 bytes 
HTML transferred:  1896 bytes 
Requests per second: 22.04 [#/sec] (mean) 
Time per request:  362.973 [ms] (mean) 
Time per request:  45.372 [ms] (mean, across all concurrent requests) 
Transfer rate:   2.80 [Kbytes/sec] received 
+1

Testé sur une machine Linux, il semble y avoir une dégradation plus faible, aléatoire, des performances de -c7 à -c8. Environ (1800 par seconde à 600 ~ 1200 par seconde). Le problème semble se produire dans les dernières demandes, et disparaît lorsque -n est mis à jour à 10 000. Avez-vous essayé cela? –

+1

Merci, Romauld. Oui, je reçois exactement la même moyenne avec '-n 10000', et il ne semble pas y avoir de différence dans les dernières demandes pour moi. Combien de cœurs a votre machine? –

+0

Il a 2 noyaux. –

Répondre

3

Sur ma boîte linux, il est dû à la retransmission d'un paquet TCP de ab, bien que je ne sais pas exactement pourquoi:

No.  Time  Source    Destination   Protocol Info               Delta 
    10682 21.218156 127.0.0.1    127.0.0.1    TCP  http-alt > 57246 [SYN, ACK] Seq=0 Ack=0 Win=32768 Len=0 MSS=16396 TSV=17307504 TSER=17306704 WS=6 21.218156 
    10683 21.218205 127.0.0.1    127.0.0.1    TCP  57246 > http-alt [ACK] Seq=82 Ack=1 Win=513 Len=0 TSV=17307504 TSER=17307504 SLE=0 SRE=1 0.000049 
    10701 29.306438 127.0.0.1    127.0.0.1    HTTP  [TCP Retransmission] GET/HTTP/1.0        8.088233 
    10703 29.306536 127.0.0.1    127.0.0.1    TCP  http-alt > 57246 [ACK] Seq=1 Ack=82 Win=512 Len=0 TSV=17309526 TSER=17309526 0.000098 
    10704 29.308555 127.0.0.1    127.0.0.1    TCP  [TCP segment of a reassembled PDU]        0.002019 
    10705 29.308628 127.0.0.1    127.0.0.1    TCP  57246 > http-alt [ACK] Seq=82 Ack=107 Win=513 Len=0 TSV=17309526 TSER=17309526 0.000073 
    10707 29.309718 127.0.0.1    127.0.0.1    TCP  [TCP segment of a reassembled PDU]        0.001090 
    10708 29.309754 127.0.0.1    127.0.0.1    TCP  57246 > http-alt [ACK] Seq=82 Ack=119 Win=513 Len=0 TSV=17309526 TSER=17309526 0.000036 
    10710 29.309992 127.0.0.1    127.0.0.1    HTTP  HTTP/1.1 200 OK (text/plain)         0.000238 
    10711 29.310572 127.0.0.1    127.0.0.1    TCP  57246 > http-alt [FIN, ACK] Seq=82 Ack=120 Win=513 Len=0 TSV=17309527 TSER=17309526 0.000580 
    10712 29.310661 127.0.0.1    127.0.0.1    TCP  http-alt > 57246 [ACK] Seq=120 Ack=83 Win=512 Len=0 TSV=17309527 TSER=17309527 0.000089 

Le paquet "GET" d'origine n'a pas été pris en charge par Wireshark non plus. Pour une raison quelconque, ab essaie d'envoyer une requête et échoue, même si la connexion TCP a été double-ACk'd très bien. Ensuite, la pile TCP du client attend quelques secondes pour qu'un paquet qui n'a jamais été envoyé soit ACK'd, et quand il ne voit pas ACK, réessaie et réussit.

Personnellement, je ne m'inquiéterais pas à ce sujet. S'il y a un problème, ce n'est pas un problème avec CherryPy. Il pourrait être lié aux internes de ab, l'utilisation de HTTP/1.0 au lieu de 1.1, l'absence de keepalive, l'utilisation de localhost au lieu d'un socket réel (qui simule certaines réalités du trafic réseau et ignore les autres), l'utilisation de Windows (wink), autre trafic sur la même interface, charge sur le CPU ... la liste s'allonge encore et encore.

Questions connexes