pgFincore 1.2 é uma extensão do PostgreSQL para auditar e manipular o cache da página de dados do sistema operacional. A extensão já tem um histórico de 7 anos de uso, com evoluções correspondentes às necessidades de produção.
Baixe aqui a última versão 1.2, compatível com PostgreSQL 9.6.
Cache de dados
O cache de página de dados é uma operação que acontece "naturalmente", em vários níveis no gerenciamento de dados. O objetivo é simples:uma infinidade de camadas são sobrepostas entre os dados gravados fisicamente em disco e a restituição ao usuário. Atualmente quase todas as camadas de dados possuem uma abstração para servir comandos de leitura e escrita mais rapidamente. Assim, a maioria dos discos rígidos oferece um cache de gravação, que atrasa a gravação física, e um cache de leitura que permite antecipar solicitações futuras e fornecer dados mais rapidamente. Existe um sistema equivalente em SANs, placas RAID, sistemas operacionais, software, etc.
É claro que o PostgreSQL tem seu próprio sistema de gerenciamento para escrita e leitura, os buffers compartilhados , que pode ser auditado com a extensão pg_buffercache.
É possível auditar o cache do sistema operacional com ferramentas do sistema e pgFincore porta isso no PostgreSQL.
Leia com antecedência
A maioria dos sistemas operacionais otimiza os caminhos de dados fornecendo uma janela de leitura antecipada, permitindo pré-carregar dados no cache e, assim, fornecê-lo mais rapidamente aos aplicativos. O PostgreSQL contém várias otimizações para favorecer esse comportamento no nível do sistema e também carrega funcionalidade semelhante com a opção Effective_io_concurrency.
Uma solução para facilitar essas otimizações é usar chamadas de sistema POSIX_FADVISE. Novamente pgFincore Porta esta solução para o PostgreSQL.
pg Fincore 1.2
Esta extensão permite, portanto:
- para obter informações precisas sobre a ocupação de uma tabela ou índice (e alguns outros arquivos usados pelo PostgreSQL) no cache do sistema que suporta POSIX (linux, BSD, …),
- para manipular este cache:faça um mapa dele e restaure-o mais tarde ou em outro servidor,
- para otimizar caminhos por meio de chamadas posix_fadvise.
Obtenha o pgFincore
Pacotes Debian e Red Hat disponíveis nas distribuições e para cada versão do PostgreSQL nos repositórios Apt PGDG e RPM PGDG.
E as fontes no repositório git pgfincore.
Precisa de ajuda?
Além do suporte da comunidade, você pode entrar em contato com o 2ndQuadrant.
Exemplos de uso
Configuração
$ sudo apt-get install postgresql-9.6-pgfincore $ psql -c 'CREATE EXTENSION pgfincore;'
Informações do sistema
# select * from pgsysconf_pretty(); os_page_size | os_pages_free | os_total_pages --------------+---------------+---------------- 4096 bytes | 314 MB | 16 GB
Otimize o passeio aleatório (reduza a janela de leitura antecipada)
# select * from pgfadvise_random('pgbench_accounts_pkey'); relpath | os_page_size | rel_os_pages | os_pages_free ------------------+--------------+--------------+--------------- base/16385/24980 | 4096 | 2 | 1853808
Otimize a passagem sequencial (aumento da janela de leitura antecipada)
# select * from pgfadvise_sequential('pgbench_accounts'); relpath | os_page_size | rel_os_pages | os_pages_free ------------------+--------------+--------------+--------------- base/16385/25676 | 4096 | 3176 | 1829288
Auditoria de cache
# select * from pgfincore('pgbench_accounts'); relpath | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit --------------------+---------+--------------+--------------+-----------+-----------+---------------+--------- base/11874/16447 | 0 | 4096 | 262144 | 3 | 1 | 408444 | base/11874/16447.1 | 1 | 4096 | 65726 | 0 | 0 | 408444 |
Carregar uma tabela na memória
# select * from pgfadvise_willneed('pgbench_accounts'); relpath | os_page_size | rel_os_pages | os_pages_free --------------------+--------------+--------------+--------------- base/11874/16447 | 4096 | 262144 | 80650 base/11874/16447.1 | 4096 | 65726 | 80650
Limpe o cache de uma tabela
# select * from pgfadvise_dontneed('pgbench_accounts'); relpath | os_page_size | rel_os_pages | os_pages_free --------------------+--------------+--------------+--------------- base/11874/16447 | 4096 | 262144 | 342071 base/11874/16447.1 | 4096 | 65726 | 408103
Restaurar páginas em cache
Aqui usamos um parâmetro do tipo bit-string representando as páginas a serem carregadas e descarregadas da memória.
# select * from pgfadvise_loader('pgbench_accounts', 0, true, true, B'101001'); -- Varbit décrivant les pages à manipuler relpath | os_page_size | os_pages_free | pages_loaded | pages_unloaded ------------------+--------------+---------------+--------------+---------------- base/11874/16447 | 4096 | 408376 | 3 | 3
NOTA:para a demonstração, apenas 6 páginas de dados são tratadas acima, 1 carrega a página, 0 descarrega a página.