Notas Linux (Todas as versões)
As notas abaixo a respeito da glibc aplicam-se somente na situação quando o MariaDB é construido por você mesmo. Se você está executando Linux em uma máquina x86, na maioria dos casos é muito melhor para você usar nosso binário. Nós ligamos nossos binários com a melhor versão alterada da glibc, podemos escolher as melhores opções do compilador, em uma tentativa de torná-la funcional para um servidor muito exigido. Para um usuário comum, mesmo para configurações com várias conexões concorrentes e/ou tabelas excedendo o limite de 2 GB, nosso binário é, na maioria das vezes, a melhor escolha. Portanto se você ler o texto abaixo, e está em dúvida sobre o que deve fazer, tente usar o nosso binário primeiro para ver se ele preenche suas necessidades, e preocupe-se com uma construção própria apenas se você descobrir que nosso binário não é bom o suficiente para você. Neste caso, iríamos apreciar se fosse feito uma observação sobre isto, para que possamos fazer uma melhor versão bináris da próxima vez.
O MariaDB usa LinuxThreads no Linux. Se você usa uma versão do Linux que não tenha a glibc2
, você deve instalar LinuxThreads antes de tentar compilar o MariaDB. Você pode obter o LinuxThreads em http://www.mysql.com/downloads/os-linux.html.
NOTA: Temos visto alguns problemas estranhos com o Linux 2.2.14 e MariaDB em sistemas SMP; Se você tem um sistema SMP, recomendamos a atualização para o Linux 2.4! Seu sistema ficará mais rápido e mais estável.
Perceba que as versões da glibc
iguais ou anteriores à Versão 2.1.1 tem um bug fatal no tratamento do pthread_mutex_timedwait
, que é usado quando você executar instruções INSERT DELAYED
. Recomendamos não usar INSERT DELAYED
antes de atualizar a glibc
.
Se você planeja ter mais de 1000 conexões simultâneas, será necessário fazer algumas alterações na LinuxThreads, recompile-a e religue o MariaDB ao novo libpthread.a
. Aumente PTHREAD_THREADS_MAX
em sysdeps/unix/sysv/linux/bits/local_lim.h
para 4096 e abaixe o STACK_SIZE
no linuxthreads/internals.h
para 256KB. Os caminhos são relativos à raiz da glibc
. Note que o MariaDB não será estável com cerca de 600-1000 conexões se o valor de STACK_SIZE
for o padrão de 2MB.
Se você tiver um problema com o MySQL, no qual ele não consiga abrir vários arquivos ou conexões, pode ser que você não tenha configurado o Linux para lidar com o número de arquivos suficiente.
No Linux 2.2 e posteriores, você pode conferir o valor para a alocação dos arquivos fazendo:
cat /proc/sys/fs/file-max cat /proc/sys/fs/dquot-max cat /proc/sys/fs/super-max
Se você possui mais de 16M de memória, deve ser adicionado o seguinte no seu script de boot (ex. /etc/rc/boot.local
no SuSE Linux):
echo 65536 > /proc/sys/fs/file-max echo 8192 > /proc/sys/fs/dquot-max echo 1024 > /proc/sys/fs/super-max
Você também pode executar os comandos acima da linha de comando como root, mas neste caso, os antigos limites voltarão a ser usados na próxima vez que o computador for reiniciado.
De forma alternativa, você pode configurar estes parâmteros durante a inicialização usando a ferramenta sysctl
, que é usada por muitas distribuições Linux (No SuSE a partir da versão 8.0). Apenas grave os seguintes valores em um arquivo chamado /etc/sysctl.conf
:
# Aumente alguns valores para o MariaDB fs.file-max = 65536 fs.dquot-max = 8192 fs.super-max = 1024
You should also add the following to /etc/my.cnf
:
[mysqld_safe] open-files-limit=8192
Os parâmetros acima permitem o MariaDB criar até 8192 conexões + arquivos.
A constante STACK_SIZE
na LinuxThreads controla o espaçamento das pilhas threads no espaço de endereçamento. Ela necessita ser grande o bastante para que tenha espaço o suficiente para a pilha de cada thread, mas pequena o bastante para manter a pilha de alguma thread executando dos dados globais mysqld
. Infelizmente, a implementação Linux de mmap()
, como descobrimos em experiências, irá desmapear uma região já mapeada se você solicitar o mapeamento de um endereço já em uso, zerando os dados de toda a página ao invés de retoernar. um erro. Portanto a segurança do mysqld
ou qualquer outra aplicação baseada em threads depende do comportamento gentil do código que cria as threads. O usuário deve tomar medidas para certirficar-se que o número de threads em funcionamento em qualquer hora seja suficientemente baixo para que as pilhas das threads permaneçam longe do monte global. Com mysqld
você deve reforçar este comportamento 'gentil' configurando um valor razoável para a variável max_connections
.
Se você mesmo construiu o MariaDB e não deseja confusões corrigindo LinuxThreads, você deve configurar max_connections
para um valor máximo de 500. Ele ainda deve ser menor se você tiver uma chave grande para o buffer, grandes tabelas heap, ou outras coisas que fazem o mysqld
alocar muita memória ou se você estiver executando um kernel 2.2 com o patch de 2GB. Se você estiver usando nosso binário ou RPM versão 3.23.25 ou posterior, você pode seguramente configurar max_connections
para 1500, assumindo que não há uma grande chave de buffer ou tabelas heap com grande quantidade de dados. Quanto mais você reduz STACK_SIZE
em LinuxThreads mais threads você pode criar seguramente. Recomendamos os valores entre 128K e 256K.
Se você usa várias conexões simultâneas, você pode sofrer com um 'recurso' do kernel 2.2 que penaliza um processo por bifurcar-se ou clonar um filho na tentativa de prevenir um ataque de separação. Isto faz com que o MariaDB não consiga fazer uma bom escalonamento, quando o número de clientes simultâneos cresce. Em sistemas com CPU única, temos visto isto se manifestar em uma criação muito lenta das threads, tornando a conexão ao MariaDB muito lenta. Em sistemas de múltiplas CPUs, temos observado uma queda gradual na velocidade das consultas quando o número de clientes aumenta. No processo de tentar encontrar uma solução, recebemos um patch do kernel de um de nossos usuários, que alega fazer muita diferença para seu site. O patch está disponível aqui (http://www.mysql.com/Downloads/Patches/linux-fork.patch). Atualmente temos feito testes extensivos deste patch nos sistemas de desenvolvimento e produção. A performance do MariaDB
obtem uma melhora significativa, sem causar problemas e atualmente o recomendamos para nossos usuários que continuando trabalhando com servidores muito carregados em kernels 2.2. Este detalhe foi corrigido no kernel 2.4, portanto, se você não está satisfeito com a performance atual do seu sistema, melhor do que aplicar um patch ao seu kernel 2.2, pode ser mais fácil simplesmente atualizar para o 2.4, que lhe dará também uma melhora em seu sistemas SMP em adição à correção do bug discutido aqui.
Estamos testando o MariaDB no kernel 2.4 em uma máquina com 2 processadores e descobrimos que o MariaDB escalona muito melhor - virtualmente, não há nenhuma perda de desempenho no throughput das consultas até cerca de 1000 clientes, e o fator da escala do MariaDB (computado com a razão do throughput máximo para o thoughput de cada cliente.) foi de 180%. Temos observado resultados similares em sistemas com 4 processadores - virtualmente não há perda de desempenho quando o número de clientes é incrementado até 1000 e o fator da escala foi de 300%. Portanto para um servidor SMP muito carregado nós definitivamente recomendamos o kernel 2.4. Nós descobrimos que é essencial executar o processo mysqld
com a mais alta prioridade possível no kernel 2.4 para obter performance máxima. Isto pode ser feito adicionando o comando renice -20 $$
ao mysqld_safe
. Nos nossos testes em uma máquina com 4 processadores, o aumento da prioridade nos deu 60% de aumento no throughput com 400 clientes.
Atualmente estamos tentando coletar mais informações sobre como o MariaDB
atua no kernel 2.4 em sistemas com 4 e 8 processadores. Se você tem acesso a um sistema deste porte e tem feito alguns benchmarks, por favor envie um email para http://www.mysql.com/company/contact/ com os resultados - iremos incluí-los neste manual.
Existe outro detalhe que afeta muito a performance do MariaDB, especialmente em sistemas multi processados. A implementação de mutex em LinuxThreads na glibc-2.1 é muito ruim para programas com várias threads que travam o mutex por um tempo curto. Em um sistema SMP, ironicamente, se você liga o MariaDB com LinuxThreads sem modificações, removendo processadores da máquina, a performance do MariaDB é melhorada em alguns casos. Para corrigir este comportamento, disponibilizamos um patch para glibc 2.1.3, em http://www.mysql.com/Downloads/Linux/linuxthreads-2.1-patch
Com a glibc-2.2.2, o MariaDB versão 3.23.36 irá usar o mutex adaptativo, que é muito melhor,mesmo que o patch na glibc-2.1.3. Avisamos, entretando, que sobre algumas condições, o código mutex no glibc-2.2.2 overspins, que prejudica a performance do MariaDB. A chance desta condição pode ser reduzida mudando a prioridade do processo mysqld
para a prioridade mais alta. Nós também corrigimos o comportamento overspin com um patch, disponível em http://www.mysql.com/Downloads/Linux/linuxthreads-2.2.2.patch. Ele combina a correção do overspin, número máximo de threads e espaçamento das pilhas em um único patch. Você precisará aplicá-lo no diretório linuxthreads
com patch -p0 </tmp/linuxthreads-2.2.2.patch
. Esperamos que seja incluído de alguma forma nos futuros lançamentos da glibc-2.2
. De qualquer forma, se você ligar com glibc-2.2.2
, ainda será necessário corrigir STACK_SIZE
e PTHREAD_THREADS_MAX
. Temos esperanças que os padrões serão corrigidos para valores mais aceitáveis para configurações pesadasa do MariaDB no futuro, então sua construção poderá ser reduzida a ./configure; make; make install
.
Recomendamos que você use os patches acima para construir uma versão estática especial de libpthread.a
e use-a somente para ligações estáticas com o MariaDB
. Sabemos que os patches são seguros para o MariaDB
e pode melhorar significamente sua performance, mas não podemos dizer nada sobre outras aplicações. Se você ligar outras aplicações coma a versão modificada da biblioteca ou construir uma versão alterada compartilhada e instalá-la no seu sistema, você estará fazendo por sua conta e risco e tenha atenção com outras aplicações que dependem de LinuxThreads
.
Se você passar por problemas estranhos durante a instalação do MariaDB ou com travamentos de alguns utilitários comuns, é muito provável que eles são relacionados a problemas de bibliotecas ou compilador. Se for este o caso, o uso de nosso binário será a solução.
Um problema conhecido com a distribuição binária é que com antigos sistemas Linux que usam libc
(como o RedHat 4.x ou Slackware), você obterá alguns problemas não fatais com resolução de nomes. Leia "Notas Linux para distribuições binárias".
Quando estiver usando LinuxThreads você verá um mínimo de três processos em execução. Estes são de fato, threads. Existirá uma thread para o gerenciador LinuxThreads, uma thread para lidar com conexões e uma thread para tartar de alarmes e sinais.
Perceba que o kernel Linux e a biblioteca LinuxThread pode por padrão ter apenas 1024 threads. Isto significa que você pode ter até 1021 conexões ao MariaDB em um sistema sem correção. A página http://www.volano.com/linuxnotes.html contém informações sobre como contornar este limite.
Se você ver um processo mysqld
daemon finalizado com ps
, isto normalmente significa que você encontrou um bug no MariaDB ou que tenha uma tabela corrompida. Leia Seção A.4.1, "O Que Fazer Se o MariaDB Continua Falhando".
Para obter um descarga do core no Linux se o mysqld
finalizar com um sinal SIGSEGV, você pode iniciar o mysqld
com a opção --core-file
. Perceba que provavelmente você também precisará aumentar o core file size
adicionando ulimit -c 1000000
para mysqld_safe
ou iniciar mysqld_safe
com --core-file-sizes=1000000
, Leia "mysqld-safe
, o wrapper do mysqld
".
Se você estiver ligando seu próprio cliente MariaDB e obter o erro:
ld.so.1: ./my: fatal: libmysqlclient.so.4: open failed: No such file or directory
Quando executá-los, o problema pode ser evitado com um dos seguintes métodos:
- Ligue o cliente com a seguinte opção (no lugar de
-Lpath
):-Wl,r/path-libmysqlclient.so
. - Copie
libmysqclient.so
para/usr/lib
. - Adicione o caminho do diretório onde
libmysqlclient.so
está localizado para a variável de ambienteLD_RUN_PATH
antes de executar seu cliente.
Se você estiver usando o compilador Fujitsu (fcc / FCC)
você terá alguns problemas compilando o MariaDB porque os arquivos de cabeçalho Linux são muito orientados ao gcc
.
A seguinte linha configure
deve funcionar com fcc/FCC
: