O curto:
Estamos atingindo o máximo de conexões e observando um desempenho muito ruim do MySQL durante o horário comercial de pico e não podemos determinar se é um problema de carga ou de configuração.
Longo:
Para começar, veja nossas especificações de servidor hospedadas no Digital Ocean:
Núcleos: 20
Memória:
total de buff / cache compartilhado gratuito disponível
Mem: 62G 48G 4.7G 216M 10G 14G
Snapshot do painel do MySQL WorkBench:
Painel do MySQL Workbench
Normalmente, temos mais de 200 entradas na lista de processos, quase todas "tabelas de abertura", "tabelas de fechamento" e, um pouco menos frequentes, "limpeza". As entradas de limpeza têm COMMAND killed
e NULL
INFO ( SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
).
As únicas consultas que realmente vemos demorando muito são alguns INSERTOS em tabelas com uso pesado, e comandos UPDATE com a chave primária no WHERE para tabelas com nós pesados. Seu estado é "atualização" na lista de processos.
configurações MySQL .cnf:
key_buffer_size=1G
myisam_sort_buffer_size=1073741824
max_length_for_sort_data=8388608
max_sort_length=8388608
sort_buffer_size=1073741824
join_buffer_size=1073741824
preload_buffer_size=1073741824
read_buffer_size=1073741824
read_rnd_buffer_size=1073741824
thread_cache_size=450
max_allowed_packet=100M
max_connections=400
lock_wait_timeout=50
wait_timeout=120
table_open_cache_instances=10
table_open_cache=6000
table_definition_cache=6000
innodb_flush_method=O_DIRECT
innodb_buffer_pool_size=46G
innodb_buffer_pool_instances=46
Temos mais de 800 bancos de dados em nosso único servidor ativo e muitos milhares de usuários que usam um aplicativo que faz solicitações frequentes de servidor com várias atualizações de registros individuais ou inserções que precisam ser sincronizadas com vários usuários.
A pergunta:
Considerando as configurações de .cnf e as especificações do nosso servidor, em relação ao snapshot do painel do MySQL WorkBench, deveríamos estar tendo o tipo de lentidão / conexões que estamos vendo com essa configuração?
Nós constantemente atingimos nosso Max Connections e recebemos SQLSTATE[HY000] [2002] Resource temporarily unavailable
de erros no PHP do PDO.
Alguém tem alguma sugestão para melhorar o desempenho? Configurações de configuração diferentes? Conhecemos soluções de longo prazo, como colocar grandes clientes em servidores separados, entre outros - mas, a curto prazo, existe alguma maneira de otimizar nosso servidor? Nosso aplicativo e site são pouco utilizáveis durante as horas de ponta.
Estatística adicional:
Linux 4.0.4-301.fc22.x86_64
25/04/2016 _x86_64_ (20 CPU)
avg-cpu:% usuário% nice% system% iowait% steal% idle
8,51 0,01 0,67 0,28 0,35 90,18
Dispositivo: tps kB_read / s kB_wrtn / s kB_read kB_wrtn
vda
269.78 1681.90 2180.52 37679232421 48849706700