Tenho um pequeno banco de dados PostgreSQL (v9.3) em Centos 6 x64 ( RAM: 8 GB ).
postgresql.conf
max_connections = 512
shared_buffers = 3000MB
temp_buffers = 8MB
work_mem = 2MB
maintenance_work_mem = 128MB
effective_cache_size = 3000MB
Cerca de 150 conexões, o PostgreSQL ocupa mais de 6 GB de RAM (claro, outros aplicativos usam cerca de 200 MB de RAM), aqui minhas informações:
Mem: 7062.945M total, 6892.410M used, 170.535M free, 6644.000k buffers
Swap: 0.000k total, 0.000k used, 0.000k free, 5378.922M cached
Perguntas:
Por que o PG ocupa muita RAM?
Como posso reduzir os buffers em cache do PG?
PostgreSQL não está usando muita RAM, o kernel está usando para cache de disco.
Isso é exatamente o que você quer que aconteça. Não há nada para consertar aqui.
RAM "livre" é RAM desperdiçada. A melhor coisa para um servidor de banco de dados é usar o máximo de RAM possível como cache de disco.
Na verdade, com o , o
shared_buffers = 3000MB
Postgres ocupa "muita" RAM (relativamente falando para um sistema com 8 GB) - mesmo que não seja toda a RAM, como você deve estar pensando. E o "porquê" é óbvio: porque você o instruiu com sua configuração para . A configuração é alta (o padrão é 128 MB), mas para um servidor de banco de dados dedicado, a configuração ainda parece razoável. (Mais de ~ 40% da RAM total é normalmente um exagero.)shared_buffers
O Postgres usa o cache do sistema e seus próprios buffers compartilhados. Os buffers compartilhados são dedicados ao Postgres e a memória não é compartilhada com outros processos. Eles são usados para buffer de dados de curto prazo e vitais para processamento rápido. O cache do sistema geralmente é mais inteligente e rápido para lidar a longo prazo com o que manter no cache e o que enviar se pressionado por recursos. A resposta de @Craig e o site que você encontrou explicam por que o cache do sistema parece consumir toda a sua RAM. Tudo isso é para Unix / Linux. O Windows funciona de maneira diferente em alguns aspectos, não estou familiarizado com os detalhes.
shared_buffers
.Para "reduzir os buffers em cache do PG" (e você realmente pode querer fazer isso para um "pequeno banco de dados" ), diminua a configuração
shared_buffers
e reinicie o Postgres: