MySQL para alocação de memória do Windows

1

Estou executando algumas consultas em algumas tabelas grandes. Eu ajustei minhas configurações para que innodb_buffer_pool_size = 16G e quando eu olho para mostrar variáveis, vejo que 16G é alocado para a instância.

Estou executando uma máquina de 64 bits com 24 G de ram e tenho o servidor mysql de 64 bits instalado. Enquanto minha consulta está em execução, apenas 6.08GB de memória física estão sendo usados no total e apenas cerca de 2GB para o mysql.

O Monitor de Recursos informa que o processo mysqld.exe tem um commit de 18.699.968, mas um conjunto de trabalho de 2.069.572.

O que eu preciso fazer para que este servidor Windows use os 16G de RAM durante as consultas?

Estou usando a versão de 32 bits do MySQL Workbench para executar minhas consultas btw. Usando a consulta de linha de comando também usa apenas cerca de 2GB de memória.

Resultado da consulta solicitada:

INNODB_BUFFER_POOL_PAGES_DATA   426.80 MB
INNODB_BUFFER_POOL_PAGES_DIRTY  0.00 B 
INNODB_BUFFER_POOL_PAGES_FLUSHED    16.00 KB
INNODB_BUFFER_POOL_PAGES_FREE   15.58 GB
INNODB_BUFFER_POOL_PAGES_MISC   16.00 KB
INNODB_BUFFER_POOL_PAGES_TOTAL  16.00 GB

Apenas um pouco de fundo, não estou executando um servidor ativo para uma página da Web ou aplicativo. Eu basicamente importei uma tabela de linhas de 600k e uma tabela de linha de 33k e preciso realizar correspondências em cada uma e, em seguida, enviar os resultados em csvs. As consultas estão demorando muito, e eu gostaria que o servidor usasse a quantidade máxima de memória RAM para apressar as coisas. Com base nos meus resultados acima, deixe-me saber o que posso fazer.

    
por Christopher 08.08.2014 / 22:26

1 resposta

2

Você precisa estar ciente do que o detalhamento do InnoDB Buffer Pool é das variáveis de status

Por favor, execute a seguinte consulta

select var,concat(numunit,' ',unit) size from
(
    select var,format(num/power(1024,ex),2) numunit,SUBSTR(units,ex*2+1,2) unit
    from
    (
        select var,num,FLOOR(LOG(IF(num=0,1,num))/LOG(1024)) ex
        from
        (
            select variable_name var,variable_value*pagesize num
            from information_schema.global_status AAA,
            (
                select variable_value pagesize
                from information_schema.global_status
                where variable_name='innodb_page_size'
            ) BBB
            where AAA.variable_name like 'innodb_buffer_pool_pages%'
        ) AA
    ) A,(select 'B KBMBGBTB' units) B
) M;

Isso fornecerá um status do uso atual do Buffer Pool e da quantidade de dados liberados dele.

Exemplo

mysql> select var,concat(numunit,' ',unit) size from
    -> (
    ->     select var,format(num/power(1024,ex),2) numunit,SUBSTR(units,ex*2+1,2) unit
    ->     from
    ->     (
    ->         select var,num,FLOOR(LOG(IF(num=0,1,num))/LOG(1024)) ex
    ->         from
    ->         (
    ->             select variable_name var,variable_value*pagesize num
    ->             from information_schema.global_status AAA,
    ->             (
    ->                 select variable_value pagesize
    ->                 from information_schema.global_status
    ->                 where variable_name='innodb_page_size'
    ->             ) BBB
    ->             where AAA.variable_name like 'innodb_buffer_pool_pages%'
    ->         ) AA
    ->     ) A,(select 'B KBMBGBTB' units) B
    -> ) M;
+----------------------------------+-----------+
| var                              | size      |
+----------------------------------+-----------+
| INNODB_BUFFER_POOL_PAGES_DATA    | 9.17 GB   |
| INNODB_BUFFER_POOL_PAGES_DIRTY   | 0.00 B    |
| INNODB_BUFFER_POOL_PAGES_FLUSHED | 179.59 GB |
| INNODB_BUFFER_POOL_PAGES_FREE    | 32.00 KB  |
| INNODB_BUFFER_POOL_PAGES_MISC    | 177.05 MB |
| INNODB_BUFFER_POOL_PAGES_TOTAL   | 9.34 GB   |
+----------------------------------+-----------+
6 rows in set (0.00 sec)

mysql>

Eu tenho o seguinte

  • Buffer Pool 9.34G (9566 MB)
  • 9,17G de dados
  • 177.05 MB para o índice de hash adaptável e material administrativo
  • 32 KB gratuitos
  • Nenhuma página suja

Por que INNODB_BUFFER_POOL_PAGES_FLUSHED é tão alto em 179.59 GB ?

Essa é a quantia de liberação que o buffer pool teve que comprometer na Arquitetura InnoDB.

Aqui está um diagrama

Nomeucaso,

mysql>SELECTvariable_valueINTO@UptimeFROMinformation_schema.global_statusWHEREvariable_name='Uptime';SELECTNOW()"Right Now",MySQLStartupTime "MySQL Started",TimeDisplay "MySQL Has Been Running For" FROM (SELECT NOW() - INTERVAL @Uptime SECOND MySQLStartupTime) M,(SELECT TRIM(REPLACE(CONCAT(IF(dy=0,'',IF(dy=1,'1 day ',CONCAT(dy,' days '))),IF(hr=0,'',IF(hr=1,'1 hour ', CONCAT(hr,' hours  '))),IF(mn=0,'',IF(mn=1,'1 minute ',CONCAT(mn,' minutes '))),IF(sc=0,'',IF(sc=1,'1 second ',CONCAT(sc,' seconds ')))),'  ',' ')) TimeDisplay FROM (SELECT dy,hr,mn,MOD(sec_aaaa,60) sc FROM (SELECT dy,hr,FLOOR((sec_aaa - dy*86400 - hr*3600)/60) mn,sec_aaa sec_aaaa FROM (SELECT dy,FLOOR((sec_aa - (dy*86400))/3600) hr,sec_aa sec_aaa FROM (SELECT FLOOR(sec_a/86400) dy,sec_a sec_aa FROM (SELECT @Uptime sec_a) A) AA) AAA) AAAA) B) N;
Query OK, 1 row affected (0.02 sec)

+---------------------+---------------------+-------------------------------+
| Right Now           | MySQL Started       | MySQL Has Been Running For    |
+---------------------+---------------------+-------------------------------+
| 2014-08-08 17:13:42 | 2014-06-26 16:38:56 | 43 days 34 minutes 46 seconds |
+---------------------+---------------------+-------------------------------+
1 row in set (0.00 sec)

O MySQL está em funcionamento há 43 dias. Ele liberou 179 GB do Buffer Pool.

O Buffer Pool precisa liberar páginas sujas em três lugares

  • o buffer de log
  • o buffer de inserção
  • o arquivo .ibd da tabela

Eu tenho um servidor bastante ocupado e é uma VM.

No seu caso, 18.699.968 K de flushes de um buffer pool de 2.069.572 K não é nada para se preocupar.

    
por 08.08.2014 / 23:18

Tags