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 ..

¿Fue útil?

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top