Domanda

sto usando Merb :: Cache per la memorizzazione di txt / xml e hanno notato che più mi lasciare i miei merbs esecuzione maggiore è la quantità di socket TCP aperte ho aperto - Credo che questo sta causando alcuni gravi problemi di prestazioni.

lsof | grep 11211 | wc -l
494
merb      27206       root   71u     IPv4   13759908                 TCP localhost.localdomain:59756->localhost.localdomain:11211 (ESTABLISHED)
merb      27206       root   72u     IPv4   13759969                 TCP localhost.localdomain:59779->localhost.localdomain:11211 (ESTABLISHED)
merb      27206       root   73u     IPv4   13760039                 TCP localhost.localdomain:59805->localhost.localdomain:11211 (ESTABLISHED)
merb      27206       root   74u     IPv4   13760052                 TCP localhost.localdomain:59810->localhost.localdomain:11211 (ESTABLISHED)
merb      27206       root   75u     IPv4   13760135                 TCP localhost.localdomain:59841->localhost.localdomain:11211 (ESTABLISHED)
merb      27206       root   76u     IPv4   13760823                 TCP localhost.localdomain:59866->localhost.localdomain:11211 (ESTABLISHED)
merb      27206       root   77u     IPv4   13760951                 TCP localhost.localdomain:52095->localhost.localdomain:11211 (ESTABLISHED)

ecc ...

il mio codice di riferimento è:

    if !exists?(:memcached) then
      register(:memcached, Merb::Cache::MemcachedStore, :namespace => 'mynamespace', :servers => ['127.0.0.1:11211'])
    end

&&

    when :xml
      unless @hand_xml = Merb::Cache[:memcached].read("/hands/#{@hand.id}.xml")
        @hand_xml = display(@hand)
        Merb::Cache[:memcached].write("/hands/#{@hand.id}.xml", @hand_xml)
      end
      return @hand_xml

È questo codice dritto fuori sbagliato o sto utilizzando la versione sbagliata di memcache ??

Ho memcached 1.2.8 e hanno il seguente:

libmemcached-0.25.14.tar.gz memcached-0.13.gem

questo è una specie di guida pazzesco ..

È stato utile?

Soluzione

k ho capito alcune cose ..

1) Può essere ragionevole avere centinaia / migliaia di prese collegate a memcached supponendo che si sta utilizzando una libreria che utilizza epoll o qualcos'altro - tuttavia, se si utilizza rubino come me io non sono a conoscenza di un lib che utilizza qualcosa di diverso select () o poll () - quindi questo colpisce questa domanda / voler immediatamente

2) se siete come me avete solo 1 server memcached momento l'esecuzione e un paio di bastardi / assottiglia in giro prendersi cura dei requests..therefore le connessioni memcache dovrebbe prob. essere non più rispetto al numero di meticci / assottiglia hai in esecuzione (supponendo che solo caching 1 o due serie di cose) - che era il mio caso

ecco la correzione:

configurazione memcache attraverso gemma memcached piuttosto che Merb :: cache (che avvolge in realtà tutto ciò che memcache lib si utilizza

MMCACHE = Memcached.new("localhost:11211")

get / set i valori:

  @cache = MMCACHE.clone
  begin
    @hand_xml = @cache.get("/hands/#{@hand.id}.xml")
  rescue
    @hand_xml = display(@hand)
    @cache.set("/hands/#{@hand.id}.xml", @hand_xml)
  end
  @cache.quit

sedersi e bere un freddo una causa ora quando si esegue questa operazione:

lsof | grep 11211 | wc -l

vedete qualcosa come 2 o 3 invece di 2036!

puntelli per Reef per me cluing in quanto non è raro per le connessioni memcache essere persistenti per cominciare

Altri suggerimenti

potrei essere in grado di aiutare, ma ho bisogno di raccontare una storia per farlo. Eccolo.

Una volta c'era un gruppo di 10 apache (SSL) server configurato per avere esattamente 100 fili ciascuno. C'era anche un gruppo di 10 server memcached (sugli stessi caselle), e tutti sembrava di vivere in pace. Sia Apache e memcached di stati custoditi dal male Monit daemon.

Poi il re installato un server apache 11 (SSL) e memcached di ha iniziato a riavviare in modo casuale ogni poche ore! Il Re ha iniziato le indagini e che cosa ha trovato? C'è stato un errore nella documentazione del modulo PHP memcache che ha detto che il costruttore di default di oggetto di connessione memcache è non persistente, ma a quanto pare è stato. Quello che è successo è stato che ogni filo php (e non vi erano come 1000 di loro), ha aperto un collegamento con ogni memcached in piscina quando aveva bisogno di uno, e si tenne. Ci sono stati 10 * 100 connessioni a tutti i server memcached ed era molto bello, ma con 11 server era il 1100 e il 1024 come <1.100. numero massimo di socket aperti per memcached era 1024. Quando sono state prese tutte le prese, il demone monit non poteva collegare, così ha riavviato il memcached.

Ogni storia deve avere una morale. Allora, che cosa ha fatto il re che fare con tutto questo? Egli ha disabilitato le connessioni persistenti e tutti vissero felici e contenti, con il numero di connessioni sul picco di cluster a 5 (cinque). Tali server servivano importo hudge di dati, quindi non abbiamo potuto avere 1000 prese pezzi ed era più conveniente per negoziare la connessione memcache su ogni richiesta.

Mi dispiace, ma non so rubino, sembra che Lei aveva una quantità terribile di fili o state caching sbagliato.

In bocca al lupo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top