Sono centinaia / migliaia di socket TCP ragionevole con memcached?
-
21-08-2019 - |
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 ..
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!