Son cientos / miles de sockets TCP razonable con memcached?
-
21-08-2019 - |
Pregunta
Estoy usando Merb :: Cache para almacenar txt / xml y he dado cuenta de que cuanto más tiempo dejar a mis merbs correr cuanto mayor sea la cantidad de sockets TCP abiertas tengo abierta - Creo que esto está causando algunos de los principales problemas de rendimiento.
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 ...
mi código correspondiente es:
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
es el código directamente equivocado o estoy utilizando la versión incorrecta de Memcache ??
He memcached 1.2.8 y tienen la siguiente:
libmemcached-0.25.14.tar.gz memcached-0.13.gem
esto es un poco volviendo loco ..
Solución
k me di cuenta de algunas cosas ..
1) que puede ser razonable tener cientos / miles de enchufes conectados a memcached suponiendo que está utilizando una biblioteca que utiliza epoll o algo más - sin embargo, si está utilizando el rubí como yo no estoy al tanto de un lib que utiliza algo más que seleccione () o poll () - por lo que este golpea a esta pregunta / quieren de inmediato
2) si usted es como yo, que sólo tiene 1 servidor memcached ejecutándose en este momento y un par de perros mestizos / adelgaza corriendo por el cuidado de sus conexiones requests..therefore memcache debería prob. no sea mayor que el número de mestizos / adelgaza que se estén ejecutando (suponiendo que solamente el almacenamiento en caché de 1 o dos conjuntos de cosas) - que era mi caso
aquí está la solución:
Memcache configuración a través de la gema memcached en lugar de merb :: caché (que en realidad lo envuelve Memcache lib está utilizando
MMCACHE = Memcached.new("localhost:11211")
get / set sus valores:
@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
sentarse y beber una fría porque ahora cuando se hace esto:
lsof | grep 11211 | wc -l
ves algo como 2 o 3 en lugar de 2036!
accesorios para arrecife para mí cluing en que no es raro que las conexiones memcache que ser persistente, para empezar
Otros consejos
Podría ser capaz de ayudar, pero tengo que contar una historia de hacer eso. Aquí está.
Había una vez hubo un grupo de 10 Apache (SSL) servidores configurado para tener exactamente 100 hilos cada uno. También había un grupo de 10 servidores memcached (en las mismas cajas), y todos ellos pareció a vivir en paz. Tanto de Apache y de memcached fueron vigilados por el mal demonio de Monit.
A continuación, el Rey instalado un servidor Apache 11 (SSL) y de memcached comenzó a reiniciar de forma aleatoria cada pocas horas! El rey comenzó a investigar y lo que se encontró? Hubo un error en la documentación del módulo php Memcache que dice que el constructor por defecto del objeto de conexión Memcache es no persistente, pero parece ser que era. Lo que ocurrió fue que cada hilo de PHP (y había como 1.000 de ellos), abre una conexión con cada memcached en la piscina cuando lo necesitaba, y lo sostuvo. Hubo 10 * 100 conexiones a todos los servidores memcached y estaba bien, pero con 11 servidores fue 1100 y 1024 como <1,100. número máximo de sockets abiertos para memcached era 1024. Cuando se tomaron todas las tomas de corriente, el demonio Monit No se puede conectar, por lo que reinicia el memcached.
Cada historia tiene que tener una moral. Entonces, ¿qué hacer con el rey de todo esto? Él deshabilitado las conexiones persistentes y todos vivieron felices para siempre, con el número de conexiones en el pico de clúster a las 5 (cinco). Esos servidores estaban sirviendo cantidad notoria de los datos, así que no nos podrían tener enchufes 1000 piezas y era más barato para negociar la conexión memcache en cada petición.
Lo siento, pero no sé rubí, parece que tenía una cantidad tremenda de hilos o usa la cache mal.
Buena suerte!