Frage

Ich verwende Merb :: Cache für txt / xml Speicherung und habe bemerkt, dass je länger ich meine merbs verlassen, je größer die Menge der offenen TCP-Sockets ausgeführt Ich habe offen - ich glaube, das einige wichtige Leistungsprobleme verursacht.

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 entsprechender 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 die falsche Version von memcache ??

Ich habe Memcached 1.2.8 und haben die folgenden:

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

Dies ist eine Art mich verrückt ..

War es hilfreich?

Lösung

k ich ein paar Sachen herausgefunden ..

1) Es kann sein, vernünftig hunderte / tausende Buchsen angeschlossen zu haben, um Memcached vorausgesetzt, Sie eine Bibliothek verwenden, die sonst epoll oder etwas nutzt - aber wenn Sie Rubin wie ich verwenden bin ich nicht bewusst, ein lib dass nutzt etwas anderes als select () oder poll () - daher diese trifft diese Frage / wollen heraus sofort

2), wenn Sie wie ich sind Sie nur 1 Memcached-Server haben jetzt ausgeführt und ein paar Bastarde / dünnt herumlaufen von requests..therefore Ihre memcache Verbindungen kümmern sollte prob. nicht mehr als die Anzahl der Bastarde / dünnen Sie laufen (vorausgesetzt, Sie nur das Caching 1 oder zwei Sätze von Dingen) - die mein Fall war

hier ist das Update:

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

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

get / set 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 Ursache jetzt, wenn Sie dies tun:

lsof | grep 11211 | wc -l

Sie sehen etwas wie 2 oder 3 statt 2036!

Requisiten für cluing mich in reffen, dass es nicht ungewöhnlich ist für memcache Verbindungen persistent zu sein, mit zu beginnen

Andere Tipps

Ich könnte in der Lage sein zu helfen, aber ich brauche eine Geschichte zu erzählen, das zu tun. Hier ist es.

einmal ein Cluster von 10 Apache (ssl) war Servern jeweils genau 100 Fäden haben konfiguriert. Es gab auch eine Gruppe von 10 Memcached-Server (auf dem Boxen), und sie alle schien in Frieden zu leben. Sowohl Apache und Memcached die wurden von dem bösen bewacht monit-Daemon.

Dann installiert der König einen 11. Apache (ssl) Server und Memcached Jahren begann zufällig alle paar Stunden neu zu starten! Der König begann die Untersuchung und was hat er gefunden? Es war, dass ein Fehler in der PHP-memcache Modul Dokumentation gesagt, dass der Standardkonstruktor von memcache Verbindungsobjekt ist nicht persistent, aber anscheinend war es. Was geschah, war, dass jeder PHP-Thread (und es wie 1000 von ihnen war), um eine Verbindung mit jedem in dem Pool Memcached geöffnet, wenn er ein brauchte, und es hielt sie fest. Es gab 10 * 100 Verbindungen zu jedem Memcached-Server und es war in Ordnung, aber mit 11 Servern war es 1100 und 1024 <1100. Maximale Anzahl offener Sockets für Memcached war 1024. Wenn alle Steckdosen genommen wurden, konnte der monit-Daemon nicht anschließen, so dass er wieder gestartet, die Memcached.

hat jede Geschichte eine Moral haben. Also, was haben mit all dies der König tun? Er hat die persistenten Verbindungen deaktiviert und sie lebten glücklich und zufrieden, mit der Anzahl der Verbindungen auf dem Cluster-Peaking bei 5 (fünf). Diese Server wurden hudge Datenmenge dient, und so konnten wir haben nicht mehr als 1000 Ersatz Steckdosen und es war billiger die memcache Verbindung bei jeder Anfrage zu verhandeln.

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

Viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top