2009-05-11 10 views
0

Ich verwende Merb :: Cache zum Speichern von txt/xml und habe bemerkt, dass je länger ich meine Merbs verlasse, desto größer die Menge offener tcp-Sockets ist, die ich geöffnet habe - ich glaube, das verursacht einige große Performance-Probleme.Sind Hunderte/Tausende von TCP Sockets mit Memcached sinnvoll?

 
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) 

etc ...

mein entsprechenden Code ist:

 
    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 

ist dieser Code direkt aus falsch oder verwende ich t Die falsche Version von Memcache?

Ich habe Memcached 1.2.8 und haben folgende Möglichkeiten:

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

diese Art der ist mir wahnsinnig ..

+0

ich verdammt sicher bin, dass die Antwort auf diese Frage eine große Fett auf, da es keine harten Grenzen sind die Anzahl der Sockets, die Sie haben können – eyberg

Antwort

1

k Ich habe ein paar Sachen herausgefunden ..

1) Es kann vernünftig sein, Hunderte/Tausende von Sockets mit Memcached verbunden zu haben vorausgesetzt, Sie verwenden eine Bibliothek, die Epoll oder etwas anderes verwendet - aber wenn Sie Ruby wie mich verwenden, ist mir nicht bewusst lib das nutzt etwas anderes als select() oder poll() - daher fällt diese Frage sofort auf/

2) Wenn du wie ich bist hast du nur 1 memcached Server, der gerade läuft und ein paar Mischlinge/Thins rumlaufen kümmert sich um Anfragen .. daher sollten Ihre Memcache-Verbindungen prob. nicht mehr als die Anzahl der Bastarde/dünnt Sie laufen (vorausgesetzt, nur Sie das Caching 1 oder zwei Sätze von Dingen) -, die meinen Fall

hier ist das Update war:

Setup memcache durch Memcached gem statt merb :: Cache (die eigentlich hüllt was memcache lib Sie

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

verwenden erhalten/stellen Sie Ihre Werte:

@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 

lehnen Sie sich zurück und trinken ein kaltes Denn jetzt, wenn Sie das tun:

lsof | grep 11211 | wc -l 

Sie sehen so etwas wie 2 oder 3 statt 2036!

Requisiten für cluing mich in reffen, dass es für memcache Verbindungen nicht ungewöhnlich hartnäckig zu sein zu beginnen

+0

Ich bin froh, dass ich helfen konnte, Kumpel –

0

Ich könnte vielleicht helfen, aber ich muss eine Geschichte erzählen, um das zu tun. Hier ist es.

Es war einmal ein Cluster von 10 Apache (SSL) -Server konfiguriert, um genau 100 Threads zu haben. Es gab auch einen Cluster von 10 memcached Servern (auf den gleichen Boxen), und sie alle schien friedlich zu leben. Apache und Memcached wurden vom bösartigen Monitendämon bewacht.

Dann installierte der König einen 11. Apache (SSL) -Server und memcached begann zufällig alle paar Stunden neu zu starten! Der König begann zu untersuchen und was hat er gefunden? Es gab einen Fehler in der PHP-Memcache-Modul-Dokumentation, die besagt, dass der Standardkonstruktor des Memcache-Verbindungsobjekts nicht persistent ist, aber anscheinend war es. Was passierte, war, dass jeder PHP-Thread (und es waren wie 1000 von ihnen), öffnete eine Verbindung zu jedem Memcached in den Pool, wenn er einen brauchte, und es hielt es. Es gab 10 * 100 Verbindungen zu jedem memcached Server und es war in Ordnung, aber mit 11 Servern war es 1100 und als 1024 < 1100. Die maximale Anzahl der offenen Sockets für memcached war 1024. Wenn alle Sockets genommen wurden, konnte der monit-Daemon nicht t connect, also hat er das memcached neu gestartet.

Jede Geschichte muss eine Moral haben. Also, was hat der König mit all dem gemacht? Er behinderte die hartnäckigen Verbindungen und alle lebten glücklich bis ans Ende, wobei die Anzahl der Verbindungen im Cluster bei 5 (fünf) lag. Diese Server haben eine riesige Menge an Daten bereitgestellt. Wir konnten also keine 1000 Ersatz-Sockets haben und es war billiger, die Memcache-Verbindung bei jeder Anfrage auszuhandeln.

Es tut mir leid, aber ich weiß nicht, Ruby, es sieht aus wie Sie hatten eine schreckliche Menge von Threads oder Sie Caching es falsch.

Viel Glück!

+0

gut, ich denke merb :: cache ist ein 2-fach Problem - ich habe nur 1 memcached Server läuft jetzt und wir haben 5 merbs (Umgang mit jeweils 1 Verbindung, afaik) - es ist hartnäckig sicher, aber ich denke, es öffnet sich mehr als es sollte beginnen mit ... zum Beispiel sollten wir nur so etwas wie 5 Threads maximal haben ?? – eyberg