2012-01-05 20 views
5

Ho un sito Web che viene servito da nginx e django.memcached rallenta il sito web

Il mio staging.py contiene correttamente le impostazioni CACHE e middleware. Puoi dare un'occhiata a nginx.conf e allo nginx conf file related to the site. Ho confermato che memcached sta passando per ngrep -d any port 11211.

ho acceso la cache per l'intero sito, e voleva vedere la performance facendo ab -n 1000 -c 10 http://site.com

Con il caching rivolto off, ottengo:

Concurrency Level:  10 
Time taken for tests: 10.276 seconds 
Complete requests:  1000 
Failed requests:  0 
Write errors:   0 
Total transferred:  11695000 bytes 
HTML transferred:  11559000 bytes 
Requests per second: 97.32 [#/sec] (mean) 
Time per request:  102.759 [ms] (mean) 
Time per request:  10.276 [ms] (mean, across all concurrent requests) 
Transfer rate:   1111.43 [Kbytes/sec] received 

Con il caching acceso, ottengo :

Concurrency Level:  10 
Time taken for tests: 12.277 seconds 
Complete requests:  1000 
Failed requests:  0 
Write errors:   0 
Total transferred:  11695000 bytes 
HTML transferred:  11559000 bytes 
Requests per second: 81.45 [#/sec] (mean) 
Time per request:  122.771 [ms] (mean) 
Time per request:  12.277 [ms] (mean, across all concurrent requests) 
Transfer rate:   930.26 [Kbytes/sec] received 

Il mio sito Web è un blog che sta recuperando messaggi da un database, niente di esotico.

Sarei grato se qualcuno potesse farmi sapere perché il sito sta effettivamente rallentando con memcached. Puoi vedere che le "Richieste al secondo" in realtà diminuiscono quando uso memcached!

Tuttavia, running memcached-top mi ha dato no hits quando eseguivo un b (sebbene i contatori di lettura e scrittura siano saliti durante il test). Ho memory available e memcached è not hogging memoria.

EDIT
ho corse memcached -vv e ottenuto some results. Si può vedere che la memcached stampa un "MEMORIZZATO" la prima volta, e quindi non sembra inviarlo dalla cache (non sono sicuro di questo). Ora sono ancora più confuso. Forse la memcached & l'interfaccia django sta funzionando, ma il risultato finale è che è meglio non eseguire memcached?

+0

http://pastebin.com/sAksJTar torna come post sconosciuto – ReadWriteCode

+0

scusa .. nuovi collegamenti dovrebbero funzionare ora. – Trewq

+1

Non sono sicuro di quale sia esattamente il problema qui. Hai provato a vedere il tasso di hit della cache? Ho pensato che potesse essere una buona cosa condividere il mintcache con te. http://djangosnippets.org/snippets/155/ –

risposta

1

Trewq, molte cose potrebbero andare storte. Hai detto che la tua macchina non sta pagando ma che le richieste non tornano anche se memcache ha MEMORIZZATO il risultato.

mie teorie: troppo corto di timeout, driver difettoso, e l'arco CPU forse sbagliato (86 vs _64)

Timeout

Di solito in uscita -vv (potrebbe essere -vvv) la linea SET avere sintassi come comando, chiave, valore e un timeout. Il timeout molto piccolo potrebbe essere il problema con la memorizzazione di memcache e quindi quasi immediatamente lo svuotamento del valore.

< nome del comando> < tasto> < bandiere> < EXPTIME> < bytes> [noreply] \ r \ n - https://github.com/memcached/memcached/blob/master/doc/protocol.txt

driver

Inoltre, ci potrebbe essere un problema con il driver memcache/API che stai usando come mc non dovrebbe mai bloccare così a lungo. Puoi controllare lo stato del tuo servizio memcache facendo qualcosa come questo http://code.google.com/p/memcached/wiki/NewConfiguringServer#Inspecting_Running_Configuration prima e dopo aver eseguito un bechmark run.

auditing chiave

Qualche tempo fa ho scritto lo script in questa domanda Setting smaller buffer size for sys.stdin? per controllare l'output di -vv memcache per vedere come equilibrato ottiene dovesse set. È passato un po 'di tempo, ma credo che potrebbe esserti utile con alcune correzioni.

Non è menzionato nella wiki di stat, ma ci sono valori stat per aiutarvi a capire se la cache è equilibrato - https://github.com/memcached/memcached/blob/master/doc/protocol.txt#L409

Super ideale è 9/10 richieste sono successi a 1 signorina, la realtà è più probabile 6/10 successi alle richieste e qualsiasi cosa al di sotto del 60% sta sprecando memoria.

+0

Sono d'accordo: in un mondo perfetto, il tuo rapporto di successo sarebbe del 90% o superiore. Ma puoi confermare la tua affermazione che il 60% del tasso di successo è la soglia dell'utilità? O quella cuspide soggettiva basata sull'esperienza personale? –

+0

@Chris - Esperienza del personale con un cliente con alcuni array da 12 GB e gestione di 14-15 milioni di pagine visualizzate in un giorno di "Internet" di 16 ore. Quando il tuo rapporto hit/miss scende al di sotto del 60% per un ambiente HLA, questo è un segno di codifica incoerente che suggerisce di rovinare qualche utente da qualche parte (servizio degradato/lento) - Oltre al mio script python, un mio buon amico ha scritto questo https : //github.com/nerdynick/MemcachedManager anche se una parola di avvertimento non so se è stabile. – David

+0

@Chris - Quasi dimenticato. Un altro colpevole per sub. Il 60% è troppo corto per i tempi di scadenza. Il mio approccio è di solito un file di configurazione centrale con un elenco di scadenze suddiviso per categoria (globale, modulo, tutti gli utenti, alcuni utenti, utente singolo) e per avviare tutto è impostato per scadere un anno nel futuro. – David