Problema no MySQL com muitas conexões simultâneas

2

aqui está um sixcore com 32 GB de RAM. Eu instalei o MySQL 5.1.47 (backport). Config é quase padrão, exceto max_connections, que é configurado para 2000. Por outro lado, há PHP5.3 / FastCGI em nginx. Existe uma aplicação php muito simples que deve ser servida. O NGINX pode lidar com milhares de solicitações paralelas nesta máquina. Este aplicativo acessa o MySQL via mysqli. Ao usar conexões não persistentes no mysqli, há um problema ao atingir 100 conexões simultâneas.

[error] 14074#0: *296 FastCGI sent in stderr: "PHP Warning: mysqli::mysqli(): [2002] Resource temporarily unavailable (trying to connect via unix:///tmp/mysqld.sock) in /var/www/libs/db.php on line 7

Eu não tenho ideia para resolver isso. Conectar-se via TCP ao mysql é terrivelmente lento. O interessante é que, ao usar conexões persistentes (adicionar 'p:' ao hostname no mysqli) os primeiros 5000-10000 mil pedidos falham com o mesmo erro acima até que conexões máximas (do servidor web, configurado para 1500) sejam atingidas. Após as primeiras requisições, o MySQL mantém 1500 conexões abertas e está tudo bem, para que eu possa fazer minhas 1500 solicitações simultâneas. Hã? É possível que isso seja um problema com o PHP FastCGI?

    
por user48303 12.07.2010 / 07:04

4 respostas

1

Parece que talvez as conexões não estejam sendo limpas em tempo hábil. "show processlist" deve mostrar as conexões, se for o caso. Olhando para a documentação do MySQL, parece que isso pode ser comum com o PHP, a menos que certos parâmetros do PHP sejam ajustados. Você pode consultar o artigo e os comentários no link

Outra possibilidade trazida pelas conexões TCP muito lentas é que o MySQL (ou tcpwrappers) está tentando fazer uma busca por nome de host para acesso e a busca é lenta. Isso parece improvável ao usar soquetes unix, mas caso ele esteja tentando corresponder a hosts locais ou nomes de host do sistema, pode ser interessante verificar se alguma regra de acesso pode ser movida para IP ou removida.

    
por 14.07.2010 / 07:09
0

É possível que, se você se conectar 10.000 vezes de uma só vez, 1500 desses 10.000 serão aceitos e os 8500 restantes serão rejeitados (como em, não será adiada até que a conexão persistente esteja disponível). Em seguida, as solicitações subseqüentes usarão o pool persistente de 1500 grandes.

Existe algum problema em abrir as conexões persistentes uma vez quando você inicia o servidor?

    
por 12.07.2010 / 08:05
0

qual sistema operacional está sendo executado? O Windows tem um tempo muito longo em conexões TCP. Algo na ordem de 90 segundos. Você precisa fazer algumas edições de registro para voltar a algo mais curto. Também ajuda a aumentar o limite de portas de 10k para algo maior.

    
por 14.07.2010 / 08:02
0

Você também ajustou o parâmetro max_user_connections? Pode ser que o nginx seja tratado como um único usuário e seja limitado por esse parâmetro.

    
por 14.07.2010 / 10:47

Tags