São centenas / milhares de sockets TCP razoável com memcached?
-
21-08-2019 - |
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 ..
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!