Hunderte / Tausende von TCP-Sockets vernünftig mit Memcached?
-
21-08-2019 - |
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 ..
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!