Predis: Erro ao ler a linha do servidor

Criado em 16 jun. 2011  ·  21Comentários  ·  Fonte: predis/predis

Usando redis para php 5.2 branch. Estou recebendo o erro aleatório "Erro ao ler a linha do servidor". O comando que usei é lpush uma string serializada.

Estou usando o predis em um script daemon php, o que significa que ele está ativo o tempo todo. Já defini o tempo limite para redis.conf como 0.

Comentários muito úteis

Se você estiver usando Predis em um script semelhante a um daemon, você deve definir read_write_timeout para -1 se quiser desabilitar completamente o tempo limite (este valor funciona com versões mais antigas e mais recentes do Predis). Além disso, lembre-se de que você deve desabilitar o tempo limite padrão do Redis configurando timeout = 0 no redis.conf ou o Redis

Todos 21 comentários

Você já seguiu as etapas descritas aqui para depurar seu problema antes de abrir um novo problema com o mesmo título? Veja também este tópico na lista Redis, também pode ser algo não relacionado a problemas do lado do cliente.

Obrigado nrk. Vou tentar definir o socket_timeout e read_write_timeout e relatar minhas descobertas aqui mais tarde.

Se você estiver usando Predis em um script semelhante a um daemon, você deve definir read_write_timeout para -1 se quiser desabilitar completamente o tempo limite (este valor funciona com versões mais antigas e mais recentes do Predis). Além disso, lembre-se de que você deve desabilitar o tempo limite padrão do Redis configurando timeout = 0 no redis.conf ou o Redis

nrk, tentei conforme mencionado e agora está funcionando perfeitamente. Obrigada!

No entanto, ainda há muitos tempos limite de conexão de vez em quando. Já defini o tempo limite = 0 e read_write_timeout como -1. Há algo que possamos fazer para depurar isso quando ocorrer?

timeout não é um parâmetro de conexão reconhecido pelo Predis, você deve usar connection_timeout vez disso. O valor padrão para connection_timeout é 5 segundos, você poderia tentar aumentar seu valor, mas não acho que seja uma solução para o seu problema. Você deve tentar ver o que está acontecendo no seu servidor quando esses tempos limite ocorrerem, realmente depende do seu aplicativo, então não posso ajudar em nada. Os possíveis motivos para esses tempos limite podem ser:

  1. problemas de conectividade de rede se o servidor Redis não estiver no host local
  2. tem certeza de que não está usando chamadas caras para o comando KEYS em algum lugar de seus scripts? Dependendo do número de chaves armazenadas no Redis, KEYS pode acabar bloqueando o servidor que, por enquanto, não será capaz de processar outras solicitações ou conexões de entrada.

Vou deixar esse problema em aberto por enquanto, mas tenho certeza de que definitivamente não é algo relacionado ao Predis.

nrk. Conforme recomendado, aumentei connection_timeout para 30. Estarei monitorando isso.

  1. Sim, estamos usando vários nós do redis que não são localhost, mas estão em uma rede privada (então, pelo menos, deve ser mais estável?)
  2. Não usando KEYS. No entanto, estamos tirando fotos a cada 900s. Pelo log, parece que o sistema está demorando 8s para salvar no HD. Não deveria ser a causa do tempo limite de conexão, certo?
  3. Algum conselho sobre como monitorar o servidor quando o tempo limite ocorrer? O tempo limite é bastante aleatório. Verifiquei o log do redis e, principalmente, trata-se apenas de mensagens instantâneas.

Outra atualização, eu medi a conexão, e parece que de fato a exceção ocorreu após 5s. Tentei modificar o connection_timeout via:

new Predis_Client ($ param, array ('read_write_timeout' => -1, 'connection_timeout' => 30));

Isso está correto? Não parece ter efeito o 30s connection_timeout e ainda lançar uma exceção.

Eles são parâmetros de conexão e não opções do cliente, portanto read_write_timeout e connection_timeout devem ser especificados como parâmetros em $param .

  1. A menos que não seja uma rede privada no Amazon EC2 (alta latência e vários problemas de vez em quando), não deveria.
  2. O instantâneo não deve bloquear o servidor, tanto quanto eu sei
  3. Você pode verificar as temporizações dos tempos limite em relação aos logs de captura instantânea. Fora isso, realmente depende da arquitetura do seu aplicativo e da sua infraestrutura, desculpe, mas não posso dar suporte para isso.

Honestamente, Predis não faz nada extravagante com os recursos de soquete ao se conectar a um host, já que é algo delegado quase inteiramente aos internos do PHP, então pode ser um bug no PHP (improvável, mas ainda uma possibilidade) ou alguma configuração / tempo de execução problema nos seus servidores, ou o Redis fazendo algumas operações pesadas que acabam bloqueando o servidor por um tempo.

nrk, obrigado novamente por sua resposta. Eu encontrei o problema, e é apenas o servidor ficando sem problema de ip_conntrack. Assim que o conntrack for corrigido, o tempo limite da conexão também desaparecerá.

É bom saber que você finalmente encontrou o verdadeiro problema por trás desses tempos limite. Provavelmente irei adicionar isso em algum lugar do FAQ para dar aos usuários uma lista inicial de verificações para solucionar problemas de tempo limite.

estava recebendo o mesmo erro, resolvido usando a configuração de read_write_timeout como 0.
Eu fiz isso no Predis, podemos fazer o mesmo usando o cliente Predis?
conforme mostrado aqui http://code.google.com/p/dires/source/browse/trunk/predis/examples/PubSubContext.php?r=4
Estou criando o cliente Predis usando: $ redis = new Predis \ Client ("tcp: //". $ TurboConfig-> getActivitiesRedisHost ()); como devo passar read_write_timeout na minha implementação.

@amitchhajer o cliente aceita os mesmos parâmetros de conexão com ambos os arrays nomeados ou strings URI, então se você estiver usando uma string URI, você pode simplesmente adicioná-la como se fosse uma string de consulta: tcp://127.0.0.1:6379?read_write_timeout=0 .

@nrk obrigado pela informação, funciona muito bem agora.

E se precisarmos alterar read_write_timeout em tempo de execução? Existe algum setter para parâmetros de tempo limite (exceto construtor)?

Os parâmetros de conexão

$connection = $client->getConnection();
$stream = $connection->getResource();
stream_set_timeout($stream, 2);

Observe que fazer $connection->getResource() efetivamente dispara a operação connect() para o Redis, então você pode acabar perdendo os benefícios das conexões preguiçosas, dependendo de como vai usar esse recurso.

Observe que o parâmetro connection_timeout foi renomeado para timeout na nova versão do Predis.

Estou usando ' h keys' extensivamente. Isso pode levar a bloqueios?

Se você estiver usando Predis em um script semelhante a um daemon, você deve definir read_write_timeout para -1 se quiser desabilitar completamente o tempo limite (este valor funciona com versões mais antigas e mais recentes do Predis). Além disso, lembre-se de que você deve desabilitar o tempo limite padrão do Redis configurando timeout = 0 no redis.conf ou o Redis

Alguma desvantagem ou cuidado associado à configuração de tempo limite = 0 em redis.conf?

O que eu suspeito é ... como as conexões nunca cairão
A utilização do Redis permanecerá alta

nrk, obrigado novamente por sua resposta. Eu encontrei o problema, e é apenas o servidor ficando sem problema de ip_conntrack. Assim que o conntrack for corrigido, o tempo limite da conexão também desaparecerá.

Como consertar esse contrato .. onde procurar?

Alguma desvantagem ou cuidado associado à configuração de tempo limite = 0 em redis.conf?

@ aditya-rewari-cb na verdade timeout = 0 em redis.conf é o padrão desde o Redis 2.4 (lançado há alguns anos), então eu diria que não há desvantagens.

Se você estiver usando Predis em um script semelhante a um daemon, você deve definir read_write_timeout para -1 se quiser desabilitar completamente o tempo limite (este valor funciona com versões mais antigas e mais recentes do Predis). Além disso, lembre-se de que você deve desabilitar o tempo limite padrão do Redis configurando timeout = 0 no redis.conf ou o Redis

@nrk Estou usando Redis com proceses daemon (trabalhadores supervisor de laravel), bem como, com cache regular
Qualquer cuidado ao usar 'read_write_timeout' => -1?
Eu queria confirmar para qualquer possibilidade de quebra ou bug .. em meu uso regular de caching do Redis, devido a esta mudança!

Obrigado !

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

jondmcelroy picture jondmcelroy  ·  4Comentários

stephenlb picture stephenlb  ·  6Comentários

koda0611 picture koda0611  ·  4Comentários

eventbase-web picture eventbase-web  ·  5Comentários

theDisco picture theDisco  ·  5Comentários