Logging prejudica o desempenho do MySQL - mas por quê?

9

Estou bastante surpreso por não poder ver uma resposta para isso em nenhum lugar do site, nem na documentação do MySQL ( seção 5.2 parece ter registros bem cobertos!)

Se eu permitir binlogs, vejo um pequeno impacto no desempenho (subjetivamente), o que é esperado com um pouco de E / S extra - mas quando habilito um log de consulta geral, vejo um enorme impacto no desempenho (o dobro do tempo executar consultas, ou pior), muito além do que eu vejo com binlogs. É claro que agora estou registrando todos os SELECTs assim como todos os UPDATE / INSERT, mas outros daemons registram cada requisição (Apache, Exim) sem parar.

Estou vendo apenas os efeitos de estar perto de um "ponto de inflexão" de desempenho quando se trata de IO, ou há algo fundamentalmente difícil sobre as consultas de registro que fazem isso acontecer? Eu adoraria poder registrar todas as consultas para tornar o desenvolvimento mais fácil, mas não posso justificar o tipo de hardware que parece ser necessário fazer o backup do desempenho com o registro geral de consultas ativado.

Eu, claro, faço log de consultas lentas, e há uma melhoria insignificante no uso geral se eu desabilitar isso.

(Tudo isso está no Ubuntu 10.04 LTS, MySQLd 5.1.49, mas a pesquisa sugere que esse é um problema bastante universal)

    
por James Green 22.11.2011 / 15:09

2 respostas

9

Os logs de consulta geral são um lote mais IO do que os logs binários. Além do fato de que a maioria dos servidores SQL tem 90% de leituras para 10% de gravações, os logs binários são armazenados em um formato binário em vez de um texto simples que usa menos espaço em disco. (Quanto menos espaço? Eu não tenho certeza. Desculpe.)

Existem dois aspectos sobre por que o Apache e o Exim podem registrar todas as solicitações sem impacto significativo no desempenho. A primeira é que eles registram o fato de que uma solicitação ocorreu, mas o que eles colocam no log geralmente é significativamente menor do que a solicitação real. Uma solicitação de HTTP é geralmente duas vezes maior que a linha que entra no log e até mesmo um e-mail de texto simples e curto é 10 ou 20 vezes maior que a linha de log que o acompanha. Um email com um anexo de 10MB ainda terá apenas algumas linhas escritas no log.

A segunda parte para isso é que em um aplicativo da web normal, geralmente há dezenas de consultas SQL associadas a uma única página HTTP. E-mails tendem a aparecer em números ainda menores que os pedidos HTTP. Seu servidor MySQL provavelmente está tentando registrar muito mais do que o Apache ou o Exim.

Observe o tamanho (descompactado) de seus logs binários e gerais do MySQL e seus logs do Apache e do Exim no final do dia. Eu aposto que você acha que o log geral do MySQL é o maior por um fator de pelo menos 5.

    
por 22.11.2011 / 17:57
4

Para adicionar à resposta fornecida, você também verá um desempenho se estiver registrando no mesmo dispositivo como os armazenamentos de dados do MySQL estão residindo - se for o mesmo disco, você estará lendo e gravando em vários locais o tempo todo, tornando o processo mais lento.

Isso é verdade mesmo que seja uma partição diferente no mesmo disco físico.

Se a criação de log estiver indo para um dispositivo diferente, isso deve aliviar alguns dos problemas de desempenho.

    
por 22.11.2011 / 20:49