Configuração do InnoDB do MySQL 5.1 / 24 GB de RAM - alta carga bi-xeon

10

Estou executando um aplicativo do Facebook que atualmente tem de 300 a 600 usuários simultâneos (e em crescimento). Para preparar o hardware para o crescimento, mudei meus i7 / 12gb ram / 2x 80gb intel x25 ssd (debian 5.0 / mysql 5.0 / 64bit) para um bi-xeon / 24gb ram / 2x 120gb intel 320 ssd (ubuntu 10.10 / mysql 5.1 / 64 bits).

agora estou enfrentando o problema de que o desempenho é pior do que na "caixa menor". Nos dois servidores, tenho usado o nginx / php fcgi para veicular o conteúdo.

Estou usando apenas o innodb, tendo Lê / Grava cerca de 65% / 35%. Cerca de 800 - 1000 qps, mas todas as consultas são simples e nunca se juntam a mais de uma tabela adicional. Todos os índices são definidos e nenhuma consulta individual é registrada no log lento (> 2s). No momento, tenho cerca de 400 MB de dados (cerca de 1 GB com índices) esperando dobrar a cada mês.

Eu adoraria todos que pudessem me dar uma dica do que mudar para torná-la mais suave.

A configuração antiga na caixa i7 era assim (myisam / innodb), com um desempenho muito bom para mais de 800 usuários.

old my.cnf

   key_buffer              = 3000M
   max_allowed_packet      = 128M
   thread_stack            = 192K
   thread_cache_size       = 8
   max_connections        = 400
   table_cache            = 8000
   thread_concurrency     = 16
   query_cache_limit       = 8M
   query_cache_size        = 128M
   wait_timeout            = 10
   interactive_timeout     = 10
   connect_timeout         = 600
   low_priority_updates    = 1
   join_buffer_size        = 8M
   read_buffer_size        = 2M
   sort_buffer_size        = 3M
   myisam_sort_buffer_size = 32M
   read_rnd_buffer_size    = 4M
   innodb_buffer_pool_size = 3G
   innodb_log_buffer_size  = 8M

A nova configuração na caixa bi-xeon é assim (pure innodb), causando alta carga com mais de 300 usuários. Cerca de 30 processos mysql estão no topo da lista de processos.

E / S de disco:

    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
              36.28    0.00    1.60    0.17    0.00   61.95

my.cnf

    key_buffer              = 64M
    max_allowed_packet      = 1M
    thread_stack            = 192K
    thread_cache_size       = 128
    max_connections        = 500
    table_cache            = 512
    #thread_concurrency     = 10
    sort_buffer_size        = 256K
    read_buffer_size        = 256K
    read_rnd_buffer_size    = 256K
    tmp_table_size          = 32M
    max_heap_table_size     = 32M
    query_cache_limit       = 1M
    query_cache_size        = 128M
    query_cache_type        = 1

    innodb_file_per_table = 1
    innodb_data_file_path = ibdata1:1000M:autoextend
    innodb_buffer_pool_size = 16384M
    innodb_additional_mem_pool_size = 8M
    innodb_flush_log_at_trx_commit = 1
    innodb_support_xa = 0
    innodb_lock_wait_timeout = 50
    innodb_flush_method=O_DIRECT
    innodb_log_files_in_group = 2
    innodb_log_file_size = 128M
    innodb_log_buffer_size = 8M
    innodb_thread_concurrency = 12
Kilian
fonte
Hmmm, está skip-name-resolvedesativado e pode ser ativado?
precisa saber é o seguinte

Respostas:

7

Escrevi algumas postagens no StackExchnage

  1. Ajustando o MySQL para InnoDB e MyISAM
  2. Como manter o espaço em disco do InnoDB sob controle
  3. Outro ponto de vista sobre o gerenciamento de espaço em disco do MySQL
  4. Ponto de vista sobre otimização do InnoDB
  5. Ajuste fino do InnoDB

Leia-os para obter as orientações necessárias.

Agora, para questões mais urgentes: você mencionou que possui 400 MB de dados, 1 GB com índices. Isso me assusta que seus índices sejam 50% maiores que os dados. No entanto, como todos os seus dados são do InnoDB e você está satisfeito com o desempenho atual da consulta, suas configurações são mais do que adequadas, principalmente os 16384 MB de innodb_buffer_pool_size. São 16GB. Você está tudo pronto lá. Mas espere !!! Seu innodb_log_file_size é de 128 milhões? Muito pequeno, dado o buffer pool de 16 GB. Você deve redimensionar os arquivos ib_logfile (configure o innodb_log_file_size para 2047M).

Você pode estar enfrentando carga por segmento. Tente definir seus buffers de conexão (join_buffer_size, sort_buffer_size, read_buffer_size, read_rnd_buffer_size)

De mim: Por que o MySQL diz que estou com falta de memória?

Do @DTest: Como você calcula a variável mysql max_connections?

De uma chance !!!

RolandoMySQLDBA
fonte
foi tudo sobre como definir alguns índices ... agora eu tenho algumas colunas que são indexadas duas vezes em outras combinações ... e eu tenho 35 GB de dados agora e 10'000qps ... e funciona como seda.
Kilian
0
  • Você converteu algumas tabelas do MyISAM para o InnoDB?
    Em caso afirmativo, verifique se há melhorias / degradações sutis no desempenho em http://mysql.rjweb.org/doc.php/myisam2innodb
  • innodb_flush_log_at_trx_commit = 1
    - causa uma gravação no log após cada transação. Considere usar = 2.
  • max_connections- SHOW GLOBAL STATUS LIKE 'max_used_connections'
    - isso informará quantos você precisou desde a inicialização.
  • cache de consulta:

    query_cache_size        = 128M
    query_cache_type        = 1

    Isso pode estar doendo. Acima, digamos, 50Mo CQ gasta muito tempo em manutenção. Tê-lo também ONpode ser um desperdício. Faça SHOW GLOBAL STATUS LIKE 'Qc%'para verificar a eficácia.

Rick James
fonte