Analisando o InnoDB Buffer Pool
A primeira coisa a se fazer ao se trabalhar com o InnoDB é utilizar as variáveis de status para checar se a configuração atual do Buffer Pool, definida em innodb_buffer_pool_size, satisfaz as necessidades dos bancos de dados atualmente armazenados no MySQL. Como já abordei aqui no blog, em outro post, manter os dados (e índices principalmente) em memória é a melhor opção para se obter boa performance de um banco de dados e no caso do MySQL + InnoDB não é diferente…
Selecione as variáveis de status que interessa…
mysql> show status like 'innodb_buffer_pool%';
+---------------------------------------+------------+
| Variable_name | Value |
+---------------------------------------+------------+
| Innodb_buffer_pool_pages_data | 392124 |
| Innodb_buffer_pool_pages_dirty | 1 |
| Innodb_buffer_pool_pages_flushed | 15949040 |
| Innodb_buffer_pool_pages_free | 0 |
| Innodb_buffer_pool_pages_misc | 1092 |
| Innodb_buffer_pool_pages_total | 393215 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 8154 |
| Innodb_buffer_pool_read_ahead_evicted | 252 |
| Innodb_buffer_pool_read_requests | 1444481964 |
| Innodb_buffer_pool_reads | 7502 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 148957406 |
+---------------------------------------+------------+
13 rows in set (0.00 sec)
Como nesta instância não estou utilizando compressão de dados, as páginas de dados do InnoDB continuam com o valor padrão que é 16KB cada. Através da variável de status Innodb_buffer_pool_pages_data temos o número total de páginas atualmente dentro do Buffer Pool. Fazendo uma aritimética simples, Innodb_buffer_pool_pages_data*16KB, temos a quantidade em KB da quantidade de dados que preenche o buffer neste momento.
mysql> select (392124*16) pages;
+---------+
| pages |
+---------+
| 6273984 |
+---------+
1 row in set (0.02 sec)
Transforme o resultado de bytes em giga:
mysql> select 6273984/1024/1024;
+-------------------+
| 6273984/1024/1024 |
+-------------------+
| 5.98333740 |
+-------------------+
1 row in set (0.00 sec)
E então compare a efetividade entre a quantidade de dados que estão dentro do buffer e o valor configurado para aquela área de memória:
mysql> select format(6273984/1024/1024,2) 'dadosNoBuffer',
-> format(@@innodb_buffer_pool_size/1024/1024/1024,0) 'valorConfigurado';
+---------------+------------------+
| dadosNoBuffer | valorConfigurado |
+---------------+------------------+
| 5.98 | 6 |
+---------------+------------------+
1 row in set (0.00 sec)
Vimos que o Buffer Pool está todo tomado por dados e, caso Innodb_buffer_pool_reads for maior que zero e Innodb_buffer_pool_pages_free for igual a zero, considere aumentar uma pouco o tamanho do Buffer Pool, uma vez que:
mysql> show status like 'innodb_buffer_pool%';
+---------------------------------------+------------+
| Variable_name | Value |
+---------------------------------------+------------+
| Innodb_buffer_pool_pages_data | 392123 |
| Innodb_buffer_pool_pages_dirty | 1 |
| Innodb_buffer_pool_pages_flushed | 15949040 |
| Innodb_buffer_pool_pages_free | 0 |
| Innodb_buffer_pool_pages_misc | 1092 |
| Innodb_buffer_pool_pages_total | 393215 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 8154 |
| Innodb_buffer_pool_read_ahead_evicted | 252 |
| Innodb_buffer_pool_read_requests | 1444481964 |
| Innodb_buffer_pool_reads | 7502 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 148957406 |
+---------------------------------------+------------+
13 rows in set (0.00 sec)
Innodb_buffer_pool_reads -> leitura de dados do disco que não foram satisfeitas ao tentar ler dados do Buffer Pool, ou seja, os dados não estão lá por não haver mais espaço para armazená-los;
Innodb_buffer_pool_pages_free -> quantidade de páginas ainda disponíveis para armazenar dados no Buffer Pool;
Até…
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
Leave a Reply