Entendendo as estatísticas do buffer pool do INNODB

20

Depois de ler esta página na documentação do mysql , tentei entender o uso atual do InnoDB. Atualmente, alocamos 6 GB de RAM para o buffer pool. O tamanho do nosso banco de dados é praticamente o mesmo. Aqui está a saída de show engine innodb status\G(estamos executando a versão 5.5)

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 6593445888; in additional pool allocated 0
Dictionary memory allocated 1758417
Buffer pool size   393215
Free buffers       853
Database pages     360515
Old database pages 133060
Modified db pages  300
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 7365790, not young 23099457
0.00 youngs/s, 0.00 non-youngs/s
Pages read 1094342, created 185628, written 543182148
0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 360515, unzip_LRU len: 0
I/O sum[2571]:cur[0], unzip sum[0]:cur[0]

Eu queria saber o quão bem estamos utilizando o cache do buffer. Depois de olhar inicialmente para a saída, parecia que realmente a estávamos usando, com base nos números Pages made younge not youngtemos neles e Buffer pool hit rate is 1000 / 10000(o que vi em outros lugares na web que isso significa que está sendo usado com bastante intensidade. Verdade?)

O que está me excitando é por que os dois são young-making ratee notsão 0/1000 e os acessos young/se non-young/ssão ambos 0. Todos indicam que ele não está sendo usado, certo?

Alguém pode ajudar a entender isso?

Safado
fonte

Respostas:

18
 Buffer pool hit rate is 1000 / 1000

Esse é o único valor realmente significativo na situação em que você está ... e essa situação é que você tem a sorte de ter um buffer pool com uma taxa de acerto perfeita de 100%. Não analise demais o restante, porque não há nada que você precise alterar, a menos que o sistema operacional do servidor esteja com pouca memória, causando troca.

Os valores jovens / não jovens não são interessantes em um caso em que há pressão zero no buffer pool. O InnoDB está usando, não faz nada sem ele. Se o pool for muito pequeno, as páginas serão despejadas e novas páginas serão lidas, e as outras estatísticas o ajudarão a entender isso ... mas esse é um problema que você parece não ter.

O espaço "não utilizado" livre na piscina nunca será negligenciado ou deixado inativo pelo InnoDB, se for necessário por qualquer motivo, portanto, o fato de ser gratuito significa apenas que você tem espaço para respirar conforme o tamanho do seu trabalho conjunto de dados cresce.

Isso é tudo o que significa, a menos que, é claro, você tenha reiniciado o servidor recentemente e, nesse caso, esteja incompleto. O servidor precisa executar um período completo de uso "normal" (incluindo backups completos) antes que as estatísticas contem toda a história ... seja uma hora, um dia, semana, mês ou ano, depende do seu aplicativo.

Michael - sqlbot
fonte
28

The Buffer pool size 393215 Isso está em páginas, não em bytes.

Para ver o tamanho do buffer pool em GB, execute o seguinte:

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

Database pages 360515 Este é o número de páginas com dados dentro do Buffer Pool

Para ver a quantidade de dados no tamanho do buffer pool em GB, execute o seguinte:

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

Para ver a porcentagem do Buffer Pool em uso, execute o seguinte:

SELECT CONCAT(FORMAT(DataPages*100.0/TotalPages,2),' %') BufferPoolDataPercentage FROM
(SELECT variable_value DataPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

Modified db pages 300Este é o número de páginas no buffer pool que precisam ser gravadas de volta no banco de dados. Eles também são chamados de páginas sujas.

Para ver o espaço ocupado por páginas sujas, execute o seguinte:

SELECT FORMAT(DirtyPages*PageSize/POWER(1024,3),2) BufferPoolDirtyGB FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

Para ver a porcentagem de páginas sujas, execute o seguinte:

SELECT CONCAT(FORMAT(DirtyPages*100.0/TotalPages,2),' %') BufferPoolDirtyPercentage FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

Quanto às outras coisas na tela, execute o seguinte:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';

Você verá todas as variáveis ​​de status para o buffer pool. Você pode aplicar as mesmas consultas ao que você precisar examinar.

RolandoMySQLDBA
fonte
Obrigado! Portanto, concluo que nosso cache de buffer está realmente sendo usado, mas o que eu quero saber é se estamos usando EFICIENTEMENTE. Se eu entender o conceito de páginas novas e antigas, meu palpite seria que um bom indicador de que o cache do buffer está sendo usado ao máximo seria o número de páginas criadas jovens e acessadas a páginas novas, correto? Usamos o mysqldump para fazer backups a cada 3 horas, o que explicaria por que está cheio. Mas com young-making rate 0 / 1000e 0.00 youngs/s, isso nos diz que não estamos realmente utilizando. Estou lendo isso certo?
Safado
2
A taxa de criação jovem de 0/1000 informa que as páginas de dados das consultas que você está executando não são apenas todas ajustadas ao cache, mas também ao tamanho menor (3/8) do cache jovem. Ou seja, as consultas não estão usando dados suficientes para envelhecer algumas das páginas no cache grande e não jovem.
Thomas Jones-Low
Uma breve explicação sobre as demais variáveis ​​de status innodb_buffer_pool será muito útil. Você pode adicioná-lo à sua resposta
Vidyadhar 6/14
5

Discordo da avaliação de que "você tem a sorte de ter um buffer pool com uma taxa de acerto perfeita de 100%"

No topo da saída (que é cortada), há uma linha parecida com:

Per second averages calculated from the last 16 seconds

Isso me diz que nenhuma leitura aconteceu nos últimos 16 segundos, dando (artificialmente) uma pontuação perfeita de '1000/1000'.

0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000

Enquanto isso, houve algumas gravações. Possivelmente, essas gravações foram adiadas para liberar páginas 'sujas' ou limpar índices do 'buffer de alteração'.

Provavelmente também não houve atividade na área jovem / quente nos últimos 16 segundos.

Rick James
fonte
Bem, nós média entre 6k-10k seleciona um segundo e, ao mesmo tempo eu posso ver quase 0 disco ler atividade no servidor, então eu não acho que este é o caso
Safado
O "cache de consulta" está satisfazendo a maioria das consultas? SHOW VARIABLES LIKE 'query%';e SHOW GLOBAL STATUS LIKE 'Qc%';e SHOW GLOBAL VARIABLES LIKE 'Com_SELECT';.
Rick James
0

O buffer pool é dividido em duas partes, uma lista jovem e uma lista não jovem. A taxa de criação mostra quantas páginas nos buffer pools estão sendo embaralhadas entre as duas listas.

Páginas feitas jovens não são páginas novas (isto é, estão sendo lidas fora do cache. Páginas feitas não jovens são páginas movidas da lista jovem porque são muito antigas ou porque a lista jovem está cheia.

A taxa nas páginas é movida entre os dois depende de quanto do buffer pool está sendo usado no momento versus o tamanho do pool jovem. Definir como zero significa que seu conjunto ativo (as páginas que você está usando) é menor que o pool jovem.

Thomas Jones-Low
fonte