Memorias Subsolo - Memórias do Subsolo: Uma Jornada Intensa pela Alma Humana - Resenha de ...
Memórias do Subsolo: Uma Jornada Intensa pela Alma Humana - Resenha de ...

Memorias subsolo: o que é e como configurar no seu servidor

O termo memorias subsolo se refere, na prática, ao sistema de cache em disco que muitos servidores utilizam como camada intermediária entre a memória RAM e o armazenamento persistente. Não é nenhum conceito mágico. É apenas uma camada de abstração que permite reter dados quentes em dispositivos SSD ou NVMe dedicados antes que eles sejam propagados para os discos principais. Isso corta a latência de escrita em quase tudo que você roda no dia a dia. Eu comecei a brincar com isso em 2019, num ambiente de banco de dados PostgreSQL rodando em máquinas AWS r5d. A configuração inicial era uma bagunça. Eu tinha colocado o diretório de dados direto no EBS geral e o tempo de checkpoint era absurdo. Quando migrei para um setup com memorias subsolo em instâncias local-Persistent, o throughput de escrita dobrou sem tocar no volume de I/O do disco principal.

Configurando memorias subsolo na prática

O primeiro passo é identificar onde estão os discos locais da sua instância. Em ambientes cloud, eles aparecem como dispositivos /dev/nvme1n1, /dev/xvdb ou similares, dependendo da provider. Em servidores bare-metal, você vai ver com lsblk ou fdisk -l. O importante é separar o dispositivo de cache do dispositivo de dados. Se você montar tudo no mesmo disco, não adianta nada. Depois disso, você formata o dispositivo com ext4 ou xfs. Eu prefiro xfs porque o journaling dele é mais previsível sob carga pesada de escrita. O mount vem com as opções noatime,nodiratime e, se for SSD, discard. Algo como:

mount -t xfs -o noatime,nodiratime,discard /dev/nvme1n1p1 /mnt/memorias-subsolo O próximo passo é criar a estrutura de diretórios que seu software vai utilizar. Para PostgreSQL, por exemplo, você move o data directory inteiro. Para Redis, o dump.rdb e o AOF. O segredo aqui é não misturar os dados quentes com os dados frios no mesmo pool.

Tem um detalhe que muita gente esquece. A memória subsolo não serve para armazenar tudo. Ela serve para os dados que você acessa com frequência. Se você colocar logs de auditoria ou backups ali, vai saturar o disco em horas e o efeito é contraprodutivo. Eu aprendi isso na marra, num serviço que rodava ETL noturno e encheu o cache com arquivos temporários. O servidor simplesmente travou num domingo de manhã.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Quando memorias subsolo não resolve seu problema

Existe um mito de que adicionar uma camada de cache em disco resolve qualquer gargalo de I/O. Isso é mentira. Se o seu problema é latência de rede, processamento de CPU ou threads bloqueadas, nenhuma memorias subsolo vai ajudar. Eu vi muitos DBAs tentarem resolver lentidão em queries complexas adicionando mais cache. O resultado era sempre o mesmo: o disco enchia, o cache eviction disparava, e a performance caía ainda mais do que antes. O outro limite é a durabilidade. Memórias subsolo em instâncias com storage efêmero não garantem persistência. Se a máquina cair, os dados que estavam só no cache vão embora. Para workloads sensíveis, você precisa de um sistema de replicação ou write-through que garanta que cada operação seja confirmada antes de ser considerada concluída. PostgreSQL com synchronous_commit = on resolve parte disso, mas adiciona latência. É um trade-off que você precisa medir.

Mensagens e limitações do setup

Uma coisa que gera confusão é a percepção de que memorias subsolo funciona igual a uma RAM disk. Não funciona. A velocidade ainda é limitada pela interface do disco. Num NVMe genérico, você consegue algo em torno de 200.000 a 500.000 IOPS, dependendo do workload. Se o seu banco precisa de mais que isso, o problema é outra coisa. Pode ser lock contention, partição inadequada ou queries sem índice. Trocar o disco não muda o plano de execução. Também tem a questão do custo. Em cloud, discos locais persistentes são mais caros por GB do que EBS geral. Num cenário com terabytes de dados, a conta fecha mal. Para workloads pequenos, como desenvolvimento ou staging, eu recomendo evitar. O ganho não justifica o preço. Use em produção mesmo, onde o throughput faz diferença real no SLA.

Se o seu ambiente é extremamente pequeno, com menos de 10.000 queries por segundo, considere alternativas como tuning de parâmetros do banco ou indexação. Frequentemente, uma query mal escrita é o gargalo, não a falta de cache. Eu já passei horas ajustando memorias subsolo quando o problema era um índice ausente numa coluna de data range. Removi o índice, recriei corretamente, e o servidor ficou mais rápido do que qualquer configuração de cache jamais faria.

Monitoramento e manutenção

Depois de configurar, você precisa monitorar. Ferramentas como iostat, sar e prometheus com node_exporter dão uma visão clara do que está acontecendo. Olhe os campos await e util em iostat. Se o await estiver consistentemente acima de 10ms e o util perto de 100%, seu cache está saturado. Reinicie o serviço, redistribua os dados ou aumente a capacidade. O importante é não ignorar esses sinais. Outro ponto é a limpeza periódica. Cache acumulando lixo é pior que não ter cache. Configure um job cron ou um processo de manutenção automatizada que verifique arquivos órfãos, logs antigos e dumps sem uso. Eu costumo rodar uma verificação semanal que remove arquivos com mais de 30 dias sem acesso. Isso mantém o pool saudável sem intervenção manual constante.

Se você quiser se aprofundar, documentação oficial do PostgreSQL sobre shared_buffers e work_mem, além dos guias de tuning do Redis para maxmemory-policy, são bons pontos de partida. Mas a melhor fonte é o próprio server. Monitore, ajuste, repita. Nenhuma configuração genérica funciona para todo mundo.