2011-12-01 11 views
26

Volevo testare python27 su appengine così ho migrato la mia app da python25. Le prestazioni sono aumentate di oltre 2 volte per ogni richiesta! Poi sono tornato a python25 e le prestazioni sono tornate come prima. Ecco una foto:Appengine, degrado delle prestazioni con python27

enter image description here (millisecondi/richiesta) (cgi gestore python 27, quindi Python25)

La mia applicazione utilizza Werkzeug, Jinja2, e memcache viene utilizzato molto spesso. Quali ragioni possono causare un calo così drammatico delle prestazioni? O è solo perché python2.7 su Appengine è ancora in beta?

Alcuni dettagli sulle applicazioni:

è abbastanza semplice negozio on-line. Ci sono alcuni compiti posticipati con generazione di PDF, tuttavia questi non influenzano molto il grafico generale perché la prima pagina ottiene la maggior parte dei colpi. Quasi tutto è memcached. Impiega fino a ~ 0,8 sec con la cache vuota per caricare una pagina con python 2.5. Le pagine non memorizzate nella cache impiegano molto tempo per essere caricate principalmente perché ci sono molte query db. Le pagine memorizzate nella cache vengono caricate in 60 ~ 100 ms. Il tempo di caricamento medio è ~ 150 ms. Con le prestazioni di python 2.7 è terribile. Le pagine non memorizzate nella cache richiedono 2+ secondi per essere caricate. Le pagine memorizzate nella cache vengono caricate in oltre 200 ms.

Purtroppo non ho dati di profilazione e non riesco a capire cosa rallenti di Python 2.7.

I miei numeri per il tempo di caricamento della pagina vengono raccolti dalla pagina live che serve ~ 10 req/sec e 1 istanza di python25 residente si occupa facilmente di questo carico.

Ho anche testato python 2.7 con wsgi e threadsafe:yes, ma le prestazioni sono migliorate solo un po 'rispetto a python 2.7 e cgi.

+0

non ho alcuna idea del perché sarebbe così lento, ma potrebbero essere testati un sacco di cose da quando python27 è ancora sperimentale nel motore di app. – bigblind

+1

Non ci hai detto nulla della tua app o di cosa fa, né quali misure hai preso per la diagnosi. Come potremmo sapere quale potrebbe essere il problema? –

+0

sto vedendo la stessa cosa. Un collo di bottiglia che ho identificato era memcache, le chiamate api erano più lente su tutte le richieste che stavo testando, ma non sarei sorpreso se si trattasse di ogni chiamata API. –

risposta

16

Somewhere on Usenet Ho letto una dichiarazione simile a questa da Google "Il runtime di Python 2.7 è più lento del runtime di Python 2.5 in alcuni casi e più velocemente in altri. Non stiamo pubblicizzando i motivi per cui a questo punto.". Sembra che nessuno ha trovato finora uno scenario in cui 2.7 è più veloce di 2,5 quindi ...

ho letto in questo

  1. Google è a conoscenza di un problema di preformace.
  2. Non sono sicuro di come gestirlo.

Il mio profilo indica che le applicazioni multithread Python 2.7 spendono ca. 35% del loro tempo in {method 'acquire' of 'thread.lock' objects} - e apparentemente ciò accade nel codice RPC di Google. Ci sono anche indicazioni che l'importazione ha seri problemi di blocco.

Fondamentalmente non si può fare nulla al riguardo se non si aspetta che AppEngine lo risolva. Vedi anche this comprehensive documentation sul rallentamento.

Fattori che quasi certamente non svolgono un ruolo significativo in questo sono:

  • file uploading pyc (l'infrastruttura GAE fa per voi)
  • il provisioning dei server (GAE è una scala così massiccia e anche in closed beta 2.7. era lento)
  • WSGI vs. CGI (non sarebbe spiegare un enorme calo di prestazioni)

La cosa brutta è che Google ha fatto un enorme aumento dei prezzi in TW o passi ma ci ha detto "usando python multithreaded 2.7 è possibile eseguire così tanto più efficace che i nuovi prezzi non sembrano così male". Sfortunatamente il Python 2.7. il runtime è ancora etichettato come "sperimentale" e non offre prestazioni di qualità di produzione.

+0

Ora leggo diversi "Non stiamo pubblicizzando i motivi per i problemi accelerati" commenti dallo staff di AppEngine. Quindi sembra esserci davvero un problema fondamentale. – max

+1

Grazie mdorseif - Ho scoperto che {metodo 'acquisisce' oggetti 'thread.lock'} occupa fino al 50% del tempo in alcune delle mie chiamate in GAE ... 6 mesi dopo e questo sembra ancora essere un problema (anche se 2.7 non è più sperimentale). Qualcuno ha mai sentito aggiornamenti da Google su questo? Inoltre, hai detto che ci sono indicazioni che l'importazione abbia seri problemi di blocco, c'è qualcosa che può essere fatto da parte degli sviluppatori che hanno riscontrato questo problema? – Stin

+0

La documentazione collegata in questa risposta indica che Google ha implementato una correzione il 28 gennaio 12 e il problema non esiste più. –

-1

Per quanto ne so, Python 2.7 dovrebbe essere più veloce di 2.5. Tuttavia, ci sono alcuni fattori che possono influenzare le velocità:

  • Il modo in cui il file binario è compilato;
  • Se le tue librerie (come Memcache) sono compilate come C (++) o Python. Un modulo C++ è, ovviamente, più veloce dell'equivalente Python;
  • Il server su cui si trova - Non ho mai utilizzato App Engine, ma presumo che un server esegua solo Python 2.5 o Python 2.7, poiché il loro mixaggio sarebbe uno spreco di risorse. Se i server 2.7 sono utilizzati molto più dei 2.5 server e App Engine non ha compensato questo, noterai che anche le prestazioni diminuiscono.

Queste sono le prime 3 cose che mi sono venute in mente, ma ci sono molti fattori. Anche il tempo potrebbe nella teoria influenzare le prestazioni.

+0

I moduli C non sono consentiti su Google Appengine, quindi questo è escluso. Penso che il memcache incorporato di google appengine sia in uso – Gautam

+0

E se quello sia compilato C o solo Python è quello che intendevo :-) –

+0

Siamo spiacenti, nessuno di questi è parametri di ottimizzazione relavent su Google App Engine. i file binari Python e server non sono configurabili sul motore dell'app, ma solo il codice sorgente Python. – SingleNegationElimination

5

Il supporto per Python 2.7 è ancora sperimentale. Un aspetto dell'essere nuovi e sperimentali è che non ha avuto il tipo di performance e di tuning che ha Python 2.5.

+0

Grazie per la risposta. Probabilmente è stato ingenuo da parte mia aspettarmi qualcosa di meglio dalla caratteristica ancora sperimentale. Spero di vedere python2.7 avvicinarsi a 2.5 nel prossimo futuro! – Ski

+2

Ma d'altra parte Google suggerisce di usare python27 per aggirare l'enorme aumento dei prezzi il 2011-12-01 ... – max

+1

Python27 supporta più richieste simultanee, consentendo di gestire lo stesso carico con un minor numero di istanze, e quindi un minore fattura per ore di esempio. –

0

Una citazione da Google stessa

sperimentale!

Il runtime di Python 2.7 è un innovativo, sperimentale, e una nuova funzionalità in rapida evoluzione per App Engine.Sfortunatamente, essendo sul bordo sanguinante significa che potremmo apportare modifiche all'indietro-incompatibili . Informeremo la comunità una volta che il runtime di Python 2.7 è non più sperimentale.

Non ce l'hanno ancora fatto per l'uso in produzione, è come il beta testing.

Quindi mantieni la tua applicazione in python2.7 fino alla fine della fase sperimentale.

Potete anche provare a caricare solo i file compilati .pyc perché python27 runtime supporta bytecode upload

3

Forse si è migrato l'applicazione per utilizzare WSGI invece di CGI quando viene eseguito su Python 2.7?

È possibile che l'interfaccia CGI sia solo un wrapper di WSGI abilitato per 2.7 ora.

+1

No, non ho migrato a wsgi, ma il tuo post mi ha motivato a testare python27 con wsgi e 'threadsafe: yes', quindi vado a testare ora e spero di avere domani le differenze sulle prestazioni – Ski

+0

C'era domani, domani. E i test delle prestazioni? – lig

+0

Beh, non c'è molto da dire, perché non potevo vedere una differenza. Se ci fosse stato un miglioramento non potrebbe essere superiore a ~ 15% (python27 wsgi con 'freadsafe: yes' rispetto a cgi). Stavo scrivendo la mia domanda per cgi e mantenevo il bootstrap il più leggero possibile, forse è per questo che non vedo alcun miglioramento con il multithreading. Resu io sono: python27 è terribilmente lento al momento, ma spero che diventerà più veloce quando è fuori dalla fase sperimentale. – Ski

1

Mediante swtiching su python2.7 le prestazioni della mia app sotto carico sono 3 volte peggiori.

Con 2.5:

connessione (ms) min media [+/- sd] mediana max Connect: 36 48 15,4 41 109 lavorazione: 685 3010 2657 9255 1.893,3 attesa: 685 3009 1893.3 2656 9255 totale: 725 3058 1900,5 2711 9333

Percentuale delle richieste gestite entro un certo tempo (ms) 50% 2711 66% 3287 75% 3896 80% 4521 90% 6146 95% 7078 98% 7934 99% 8413 100% 9333 (richiesta più lungo)

Con 2.7:

connessione (ms) min significa [+/- sd] mediana max 0.123.516,410617 millions 451.515.053.691,36321 milioni Connect: 35 46 11,4 41 96 lavorazione: 1076 7614 4190,5 6711 32284 attesa: 1075 7614 4190,5 6711 32283 Totale: 1124 7660 4195,5 6764 32353

percentuale delle richieste soddisfatte entro un certo periodo di tempo (ms) 50 % 6764 66% 7790 75% 8751 80% 9392 90% 10844 95% 13139 98% 25219 99% 27259 100% 32353 (richiesta più lungo)

Problemi correlati