Eu tenho um banco de dados ocupado apenas com tabelas InnoDB, com aproximadamente 5 GB de tamanho. O banco de dados é executado em um servidor Debian usando discos SSD e eu configurei o número máximo de conexões = 800, que às vezes saturam e fazem com que o servidor pare. A consulta média por segundo é de cerca de 2,5K. Portanto, preciso otimizar o uso da memória para abrir espaço para o máximo de conexões possíveis.
Vi sugestões de que innodb_buffer_pool_size deve ter até% 80 da memória total. Por outro lado, recebo esse aviso do script tuning-primer:
Max Memory Ever Allocated : 91.97 G
Configured Max Per-thread Buffers : 72.02 G
Configured Max Global Buffers : 19.86 G
Configured Max Memory Limit : 91.88 G
Physical Memory : 94.58 G
Aqui estão minhas variáveis innodb atuais:
| innodb_adaptive_flushing | ON |
| innodb_adaptive_hash_index | ON |
| innodb_additional_mem_pool_size | 20971520 |
| innodb_autoextend_increment | 8 |
| innodb_autoinc_lock_mode | 1 |
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_size | 20971520000 |
| innodb_change_buffering | all |
| innodb_checksums | ON |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
| innodb_doublewrite | ON |
| innodb_fast_shutdown | 1 |
| innodb_file_format | Antelope |
| innodb_file_format_check | ON |
| innodb_file_format_max | Antelope |
| innodb_file_per_table | ON |
| innodb_flush_log_at_trx_commit | 2 |
| innodb_flush_method | O_DIRECT |
| innodb_force_load_corrupted | OFF |
| innodb_force_recovery | 0 |
| innodb_io_capacity | 200 |
| innodb_large_prefix | OFF |
| innodb_lock_wait_timeout | 50 |
| innodb_locks_unsafe_for_binlog | OFF |
| innodb_log_buffer_size | 4194304 |
| innodb_log_file_size | 524288000 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | ./ |
| innodb_max_dirty_pages_pct | 75 |
| innodb_max_purge_lag | 0 |
| innodb_mirrored_log_groups | 1 |
| innodb_old_blocks_pct | 37 |
| innodb_old_blocks_time | 0 |
| innodb_open_files | 300 |
| innodb_purge_batch_size | 20 |
| innodb_purge_threads | 0 |
| innodb_random_read_ahead | OFF |
| innodb_read_ahead_threshold | 56 |
| innodb_read_io_threads | 4 |
| innodb_replication_delay | 0 |
| innodb_rollback_on_timeout | OFF |
| innodb_rollback_segments | 128 |
| innodb_spin_wait_delay | 6 |
| innodb_stats_method | nulls_equal |
| innodb_stats_on_metadata | ON |
| innodb_stats_sample_pages | 8 |
| innodb_strict_mode | OFF |
| innodb_support_xa | ON |
| innodb_sync_spin_loops | 30 |
| innodb_table_locks | ON |
| innodb_thread_concurrency | 4 |
| innodb_thread_sleep_delay | 10000 |
| innodb_use_native_aio | ON |
| innodb_use_sys_malloc | ON |
| innodb_version | 1.1.8 |
| innodb_write_io_threads | 4 |
Uma observação lateral que pode ser relevante: Vejo que quando tento inserir uma postagem grande (digamos acima de 10 KB) do Drupal (que fica em um servidor Web separado) no banco de dados, ela dura para sempre e a página não retorna corretamente.
Com relação a isso, estou me perguntando qual deve ser o meu innodb_buffer_pool_size para obter o desempenho ideal. Agradeço suas sugestões para definir esse e outros parâmetros da melhor maneira possível para esse cenário.
SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM...
gera o seguinte erro no MySQL 5.7: " O recurso 'INFORMATION_SCHEMA.GLOBAL_STATUS' está desativado; consulte a documentação para 'show_compatibility_56' ". Você teria uma versão atualizada por acaso?Algo assim? Usando
SHOW VARIABLES
eSHOW GLOBAL STATUS
:Expressão:
innodb_buffer_pool_size / _ram
Significado: % da RAM usada para o InnoDB buffer_pool
Intervalo recomendado: 60 ~ 80%
Expressão:
Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests
Significado: Leia solicitações que precisavam acessar o disco
Intervalo recomendado: 0-2%
O que fazer se estiver fora do intervalo: Aumente innodb_buffer_pool_size se você tiver o suficiente RAM.
Expressão:
Innodb_pages_read / Innodb_buffer_pool_read_requests
Significado: Leia solicitações que precisavam acessar o disco
Intervalo recomendado: 0-2%
O que fazer se estiver fora do intervalo: Aumente innodb_buffer_pool_size se você tiver RAM suficiente.
Expressão:
Innodb_pages_written / Innodb_buffer_pool_write_requests
Significado: solicitações de gravação que precisavam acessar o disco
Intervalo recomendado: 0-15%
O que fazer se estiver fora do intervalo: Verifique innodb_buffer_pool_size
Expressão:
Innodb_buffer_pool_reads / Uptime
Significado: Lê
Faixa recomendada: 0-100 / seg.
O que fazer se estiver fora do intervalo: Aumente o tamanho innodb_buffer_pool_spool?
Expressão:
(Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) / Uptime
Significado: InnoDB I / O
Faixa recomendada: 0-100 / seg.
O que fazer se estiver fora do intervalo: Aumente o tamanho innodb_buffer_pool_spool?
Expressão:
Innodb_buffer_pool_pages_flushed / Uptime
Significado: Gravações (descargas)
Faixa recomendada: 0-100 / seg.
O que fazer se estiver fora do intervalo: Aumente o tamanho innodb_buffer_pool_spool?
Expressão:
Innodb_buffer_pool_wait_free / Uptime
Significado: Contador para quando não houver páginas livres no buffer_pool. Ou seja, todas as páginas estão sujas.
Faixa recomendada: 0-1 / seg.
O que fazer se estiver fora do intervalo: Primeiro, verifique se innodb_buffer_pool_size está configurado razoavelmente; se ainda houver problemas, diminua innodb_max_dirty_pages_pct
fonte
innodb_buffer_pool_size
valor especifica? Tamanho real ou um configurado?innodb_buffer_pool_size
indica o tamanho máximo. Em um servidor típico, o "buffer pool" começa pequeno, mas cresce rapidamente para esse tamanho máximo e permanece lá. Nota: Se for maior que a RAM (ou mesmo fechar), isso leva à troca, o que é terrível para o desempenho.Seu título pergunta sobre innodb_buffer_pool_size, mas suspeito que esse não seja o problema real. (Rolando comentou por que você o definiu grande o suficiente, até grande demais).
Isso não está claro. 800 usuários no modo "Suspensão" têm praticamente zero impacto no sistema. 800 threads ativos seriam um desastre. Quantas threads estão "em execução"?
Os threads estão bloqueando um ao outro? Consulte MOSTRAR ESTADO DO MOTOR INNODB para obter algumas dicas sobre impasses, etc.
Há alguma dúvida aparecendo no slowlog? Vamos otimizá-los.
Qual versão você está usando? O XtraDB (um substituto para o InnoDB) faz um trabalho melhor usando vários núcleos. 5.6.7 faz um trabalho ainda melhor.
innodb_buffer_pool_instances - altere para 8 (assumindo um buffer_pool 20G); isso reduzirá um pouco a contenção da Mutex.
Você está ligado à E / S ou à CPU? As soluções são radicalmente diferentes, dependendo da sua resposta.
SSD - pode ser melhor se todos os arquivos de log estiverem em unidades não SSD.
fonte
Mais memória é sempre melhor, mas na minha experiência, na maioria das vezes, o tamanho do buffer pool não deve se ajustar ao tamanho dos dados. Muitas tabelas ficam inativas na maioria das vezes, como tabelas de backup, portanto o tamanho do buffer pool do innodb deve ser adequado ao tamanho de dados ativo.
O período de tempo especificado para as páginas ativas influencia o desempenho, mas há um ponto ideal, onde você não terá mais desempenho para um tamanho de buffer maior. Você pode estimar / calcular / medir isso
show engine innodb status
fonte