Antes de começarmos, gostaria de indicar um blog do meu colega Michael Nitschinger, no qual você pode aprender sobre a melhor maneira de configurar seu ambiente básico de PHP e Couchbase, caso não esteja usando nginx e PHP-FPM:
https://nitschinger.at/Getting-Started-with-Couchbase-and-PHP
Recentemente, temos visto muitas pessoas usando o SDK PHP do Couchbase junto com o Nginx e o PHP-FPM. No entanto, tem havido alguns problemas recorrentes entre esses usuários, que pretendo solucionar neste artigo!
O problema que você pode estar enfrentando é que você não consegue controlar o número de conexões feitas, através do FPM para o Couchbase; você está à mercê do número de processos filhos do PHP. O fato é que, no FPM, você não precisa de tantas conexões com o Couchbase quanto o número de processos que possui.
Você notará um enorme impacto no desempenho. Digamos que tenhamos o nosso FPM max_children configurado para 300; sob carga, você terá 300 processos PHP rodando, e cada um deles pode ter 4 instâncias persistentes do CouchbaseClient. Em 16 máquinas, isso representa quase 20.000 objetos de cliente. Esses múltiplos processos FPM paralelos não podem compartilhar uma conexão Couchbase, e este é o nosso principal problema. Nosso outro problema é que, uma vez atingidos 300 processos, essas conexões serão encerradas e reiniciadas. Isso é custoso e algo que devemos desejar evitar.
Vamos dar um passo atrás e voltar à raiz do problema. Nossos clientes inteligentes do Couchbase mantêm uma conexão aberta com o gerenciador REST do cluster para serem notificados sobre alterações na topologia. Isso funciona bem para a maioria das linguagens nas quais normalmente usaríamos um número limitado de processos e, talvez, apenas 2 a 3 objetos em cada um deles; de modo que cada servidor teria provavelmente apenas 5 conexões desse tipo com o cluster. No entanto, em uma implementação em PHP com FPM – as pessoas normalmente iniciam cerca de 2000 desses processos e, se você usar apenas _UM_ objeto Couchbase em cada um deles, cada servidor ocupará 2 mil conexões com o nosso servidor REST.
Há algumas maneiras de resolver esses problemas, no entanto. Uma delas é usando o Cache de Configuração do Couchbase (Disponível no SDK PHP v1.1.5 +). Ao usar o config_cache, a criação de uma nova instância do cliente primeiro procura por uma versão em cache da configuração do cluster; se ela for encontrada, a consulta ao nó não é feita para obter a configuração, usando apenas o valor em cache. Se não for possível conectar por meio de uma configuração em cache, somente então será aberta uma conexão (na porta 8091, usando HTTP) para um dos nós do Couchbase passados para o construtor em seu código.
O config_cache é um caminho opcional para um diretório onde a biblioteca pode armazenar arquivos contendo a topologia do cluster. (Usado para fazer cache da configuração em vez de se conectar ao servidor REST a cada vez para baixá-la.) Você pode habilitar o cache de conexão colocando a seguinte linha no seu Couchbase.ini file:
Couchbase.cache_de_configuracao = "/CAMINHO/PARA/ALGUM/DIRETÓRIO"
Você pode ler mais sobre o Cache de Configuração aqui: https://www.couchbase.com/wiki/display/couchbase/libcouchbase+configuration+cache
Ao utilizar o Config_Cache, podemos remover aproximadamente ¾ das conexões que teriam sido feitas, economizando recursos e resolvendo parcialmente o problema. As conexões persistentes também são mais compartilhadas, o que pode proporcionar um pouco mais de eficiência. Também podemos alterar a configuração do FPM para não executar tantos processos paralelos, reduzindo o max_children e aumentando o max_requests. Sugiro tentarmos ajustar o valor de pm.max_requests de 300 para 3000 ou 5000 (dependendo do tipo de inchaço de memória que você observar nos seus processos PHP ao longo do tempo), o que também reduzirá o número de vezes que esses objetos de cliente precisam ser recriados. Também podemos reduzir o número de pm.max_children para cerca de 100.
Dê uma olhada no meu arquivo de exemplo FPM.conf como referência: https://gist.github.com/rbin/82e47f7f75f2072f02fd

Deixe um comentário
Você precisa fazer o login para publicar um comentário.