MySQL Log binário ativado = servidor high-end muito lento

2

No MySQL 5.1 (.57-1.dotdeb), tenho um banco de dados de ~ 2.0Gb e uma média de ~ 350 solicitações por segundo.

Tudo está funcionando bem se eu não ativar o log binário. O uso da CPU é decente (~ 15% do núcleo de 1 CPU).

E se eu ativar o log binário, tudo é repentinamente HYPER lento. A média das solicitações cai para ~ 90 solicitações / seg. E cada solicitação leva +/- 4 segundos para ser concluída.

Você precisa saber:

  • O MySQL está devidamente ajustado, tuning-primer.sh fornece bons resultados em tempo "normal"
  • O hardware é um E5620 Bi-Xeon (geração Westmere) com 24 GO RAM
  • 12 GB de RAM são permitidos para o InnoDB
  • Executando o Debian 6 64bits

Quando o log binário é ativado:

  • O uso da CPU do MySQL é muito baixo. Cerca de 1 ou 2% de 1 núcleo. Não muito% wa para I / O em "top", cerca de 5-7%.
  • O uso da memória parece bem. Eu testei com 1 GO para InnoDB em vez de 12 GO, sem alteração.
  • As consultas são tão longas para serem executadas que o php5-fpm cria muitos novos processos para lidar com o tráfego.

No tempo normal, tenho ~ 15 trabalhadores do PHP-FPM, e se o log binário estiver ativado, esse número pode chegar a 150-200 (max).

Não é preciso precisar que todo o sistema está congelado neste momento. :-)

Aqui está my.cnf:

    [client] 
    port     = 3306 
    socket   = /var/run/mysqld/mysqld.sock 


    [mysqld_safe] 
    socket   = /var/run/mysqld/mysqld.sock 
    nice     = 0 

    [mysqld] 
    user     = mysql 
    pid-file    = /var/run/mysqld/mysqld.pid 
    socket   = /var/run/mysqld/mysqld.sock 
    port     = 3306 
    basedir  = /usr 
    datadir  = /var/lib/mysql 
    tmpdir   = /tmp 
    language    = /usr/share/mysql/english 
    skip-external-locking 

    bind-address     = 127.0.0.1 

    key_buffer   = 16M 
    max_allowed_packet  = 16M 
    thread_stack     = 192K 
    thread_cache_size = 32 

    myisam-recover = BACKUP 
    max_connections = 200 

    table_cache = 512 

    #thread_concurrency = 10 

    query_cache_limit   = 1M 
    query_cache_size = 16M 

    max_heap_table_size = 64M 
    tmp_table_size = 64M 

    innodb_buffer_pool_size = 12G 

    #general_log_file = /var/log/mysql/mysql.log 
    #general_log = 1 

    long_query_time = 4 
    #log_slow_queries   = /var/log/mysql/mysql-slow.log 
    #log-queries-not-using-indexes 

    #server-id   = 1 
    #report-host=host 


    # NOTE : All the values here are uncommented when i activate binlog 

    #log-bin     = /var/log/mysql/mysql-bin.log 
    #log-error   = /var/log/mysql/mysql-err.log 
    #sync_binlog = 0 
    #binlog_cache_size = 128M 
    #expire_logs_days   = 2 
    #max_binlog_size = 100M 
    #max_binlog_cache_size = 1G 


    [mysqldump] 
    quick 
    quote-names 
    max_allowed_packet  = 16M 

    [mysql] 
    #no-auto-rehash # faster start of mysql but no tab completition 

    [isamchk] 
    key_buffer   = 16M 

    !includedir /etc/mysql/conf.d/ 

Diga-me se você tem alguma idéia sobre esse problema!

Obrigado

EDIT 1 @Jason:

Depois de definir innodb_log_file_size = 1G , encerrando o servidor, renomeou o ib_logfile0 e ib_logfile1, reiniciou o servidor com o log binário.

O servidor mysql simplesmente não responde. É tão lento que nenhuma página é exibida desta vez.

Note que não há problema se eu desativar o log binário novamente.

As médias de carga parecem ser altas: 3,5 , mesmo que a CPU não seja tão solicitada ...

EDIT 3:

@Jason, @Bryan

Afinal,

Parece ser um bug do MySQL 5.1.

Após muitos testes, nada mudou.

Não é um problema relacionado com CPU, RAM ou IO.

Eu troquei um dos meus servidores para o Percona MySQL 5.5 e ele simplesmente funciona bem agora, com o mesmo hardware, banco de dados e configuração.

Talvez 20% ou 30% mais rápido que o MySQL 5.1 ...

O que mais?

    
por Romain 20.05.2011 / 17:34

2 respostas

2

Qual é a sua distribuição de leituras para as gravações? Você tem um aplicativo de gravação intensiva?

Como é o seu subsistema de disco?

Você não especificou innodb_log_file_size. Em um servidor ocupado, o padrão é muito baixo. Aumentar isso pode ajudar com seus problemas de E / S quando o log binário estiver ativado.

Além disso, sync_binlog = 0 não é recomendado, pois se o servidor travar, seu log binário ficará fora de sincronia com as transações.

Felicidades

    
por 20.05.2011 / 17:54
1

Sua configuração de hardware parece bastante poderosa na memória e no processador. Ativar bin-logs significa gravar um pouco mais em disco, você já tentou colocar seus bin-logs em um disco físico diferente?

    
por 20.05.2011 / 19:04