Eu configurei um servidor MariaDB e tudo está funcionando bem, com a maioria das consultas sendo executadas em menos de 20 milissegundos, mas de vez em quando uma consulta demora meio segundo ou mais (algumas vezes vários segundos) sem nenhuma razão que eu consegui entender.
Eu sei que > 0,5 segundo pode não parecer um longo atraso, mas se eu executar uma consulta semelhante, ela será concluída sem nenhum atraso discernível, portanto, a consulta em si não parece estar com defeito. Estou usando o slow_query_log
para rastrear consultas atrasadas, mas não está mostrando nenhum culpado óbvio; os tempos de bloqueio de consultas atrasadas são de < 1ms, os índices estão sendo usados com comprimentos de chave curtos, poucas linhas são afetadas, etc.
Minha configuração é o Ubuntu Server 14.04 com o MariaDB 10.0.22, a maioria configurações de baunilha. Eu tenho o log binário ativado (no modo MIXED) para que eu possa configurar a replicação mais tarde, mas eu observei o problema com ele desativado também. O banco de dados está armazenando dados para um aplicativo PHP de baixo impacto em execução no mesmo servidor, mas não recebo mais do que algumas dúzias de conexões simultâneas; enquanto estes podem afetar uma única tabela, nenhum afeta a mesma linha, e todas as minhas tabelas são InnoDB (acredito que o XtraDB no MariaDB), então o bloqueio não deve ser um problema e o log de consultas lentas parece fazer isso.
As consultas que estão sendo atrasadas são todas UPDATE
queries, mas direcionadas apenas a linhas únicas usando uma chave primária curta (inteira), apenas 1 em 100 está atrasada, mas há muitas dessas consultas feitas regularmente o dia. Todos os campos são de comprimento fixo (sem blobs ou campos de texto, apenas inteiros e curtos varchars).
É a relativa disparidade nos tempos (< 20ms a 3s +) que me intrigou, pois não consigo ver nenhum motivo para isso, mesmo quando lida com tabelas não conectadas e coisas do tipo. Também não vejo nenhum aumento óbvio no desempenho de outros programas; Realizo backups diários que às vezes atrasam um pouco as coisas, mas elas são executadas em um horário fixo, enquanto as consultas lentas estão ocorrendo durante todo o dia. Estou usando o HHVM para executar scripts PHP no caso de ser relevante, mas achei a memória e o uso da CPU muito mais estáveis do que o PHP, e o desempenho é excelente (quando não atrasado por consultas lentas) para que não pareça um óbvio culpado, certamente não por atrasos de vários segundos, pois tem a mesma prioridade que MariaDB.
Existe mais alguma coisa que eu possa fazer para depurar isso, qualquer configuração possível do MariaDB que precise ser ajustada?
[editar] Conforme solicitado por Rui F Ribeiro, aqui estão algumas estatísticas adicionais; é um servidor bastante modesto, mas muito pouco utilizado:
free -m
:
total used free shared buffers cached
Mem: 993 768 225 8 83 304
-/+ buffers/cache: 380 613
Swap: 0 0 0
vmstat
:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 231752 85788 311716 0 0 15 38 30 32 0 0 99 1 0
uptime
:
12:12:24 up 11 days, 21:32, 1 user, load average: 0.11, 0.08, 0.06
sudo /etc/init.d/mysql status
:
* /usr/bin/mysqladmin Ver 9.1 Distrib 10.0.22-MariaDB, for debian-linux-gnu on x86_64
Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.
Server version 10.0.22-MariaDB-1~precise-log
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 1 day 16 hours 23 min 23 sec
Threads: 1 Questions: 32381 Slow queries: 1089 Opens: 92 Flush tables: 5 Open tables: 17 Queries per second avg: 0.222
Como o mysql
foi reiniciado pela última vez, parece que tive mais de 1 em 100 consultas lentas (já que a média está bem alta). Também vale a pena notar que eu uso conexões persistentes (que devem ser responsáveis pelo baixo número de aberturas), via interface MySQLi do PHP (então, enquanto persistentes, bloqueios etc. são liberados automaticamente).
Tags performance mysql mariadb