Pergunta

Eu estou usando Merb :: Cache para armazenar txt / xml e ter notado que quanto mais eu deixar meus merbs executar o maior a quantidade de sockets TCP abertos que tenho aberta - Eu acredito que isso está causando alguns dos principais problemas de desempenho.

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

meu código relevante é:

    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

é o código para fora errado ou estou usando a versão errada do memcache ??

Eu memcached 1.2.8 e ter o seguinte:

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

este é tipo de me deixando louco ..

Foi útil?

Solução

k eu descobri algumas coisas ..

1) ele pode ser razoável ter centenas / milhares de soquetes ligados ao memcached supondo que você estiver usando uma biblioteca que utiliza epoll ou qualquer outra coisa - no entanto, se você estiver usando ruby ??como eu Eu não estou ciente de uma lib que utiliza algo mais do que o select () ou poll () - portanto, este atinge esta pergunta / quer sair imediatamente

2) se você é como eu, você só tem 1 servidor memcached funcionando agora e um par de mestiços / thins correndo cuidar de requests..therefore suas conexões memcache deve prov. não haverá mais do que o número de mestiços / thins que você tem em execução (supondo que você só cache 1 ou dois conjuntos de coisas) - que era meu caso

aqui está a correção:

Configuração memcache através gem memcached em vez de merb :: cache (que na verdade wraps qualquer que seja MEMCACHE lib você estiver usando

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

get / set seus 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

sentar e beber uma gelada porque agora quando você faz isso:

lsof | grep 11211 | wc -l

você ver algo como 2 ou 3, em vez de 2036!

adereços para recife para me cluing em que não é incomum para conexões memchache que ser persistente para começar

Outras dicas

Eu poderia ser capaz de ajudar, mas preciso contar uma história para fazer isso. Aqui está.

Uma vez que havia um conjunto de 10 Apache (SSL) servidores configurado para ter exactamente cem linhas cada. Houve também um cluster de 10 servidores memcached (no mesmo caixas), e todos eles parecia para viver pacificamente. Ambos apache do e do memcached eram guardados pelo mal monit daemon.

Em seguida, o rei instalou um 11 apache servidor (SSL) e memcached de começou a reiniciar aleatoriamente a cada poucas horas! O rei começou a investigar eo que ele encontrou? Houve um erro no php memcache módulo de documentação que disse que o construtor padrão de memcache objeto de conexão é não persistente, mas aparentemente era. O que aconteceu foi que cada fio php (e não havia como 1.000 deles), abriu uma conexão com cada memcached na piscina quando ele precisava de um, e segurou-a. Havia 10 * 100 conexões para cada servidor memcached e foi bem, mas com 11 servidores era 1100 e como 1024 <1,100. O número máximo de soquetes abertos para memcached foi 1024. Quando todos os soquetes foram tomadas, o daemon monit não pôde se conectar, então ele reiniciou o memcached.

Cada história tem que ter uma moral. Então, o que o Rei ver com tudo isso? Ele desactivada as ligações persistentes e todos viveram felizes para sempre, com o número de conexões no pico conjunto a 5 (cinco). Esses servidores estavam servindo quantidade hudge de dados, por isso não poderia ter 1000 peças soquetes e era mais barato para negociar a conexão memcache em cada solicitação.

Lamento, mas eu não sei rubi, parece que você tinha uma quantidade enorme de tópicos ou você é cache errado.

Boa sorte!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top