Voltar
Dirty pages

MonetDB e as 'Dirty Pages': Como uma Query Read-Only Escreveu Terabytes e a Solução para o Gargalo de Performance

Aprofundamento CEVIU

Aprofundamento

A recente investigação sobre o MonetDB escancara um ponto crítico na otimização de sistemas de banco de dados: a interação entre a camada de aplicação (o próprio banco de dados) e o sistema operacional. O MonetDB, conhecido por sua arquitetura colunar e uso intensivo de memória, mapeia arquivos de dados diretamente para o espaço de endereçamento da memória virtual (via mmap). Ele confia no page cache do kernel Linux para gerenciar seu conjunto de trabalho. O problema surgiu quando uma query aparentemente inofensiva de count-distinct, que deveria ser apenas de leitura, gerou terabytes de escrita para o disco NVMe.

O cerne da questão estava na política de escrita do kernel para as dirty pages. O MonetDB cria arquivos temporários (scratch files) que também são mapeados em memória para lidar com estruturas grandes como tabelas hash. Mesmo que esses dados sejam descartáveis após a query, o kernel, por padrão, força a escrita dessas páginas sujas para o disco após um tempo determinado (vm.dirty_expire_centisecs, 30 segundos) e com base em limites de tamanho (vm.dirty_background_ratio e vm.dirty_ratio). Essa escrita contínua ocorria mesmo com muita RAM livre, pois o kernel não sabe que os dados são temporários. A solução inicial de mover esses arquivos para tmpfs (um sistema de arquivos baseado em RAM) resolveu, mas apresentou trade-offs, como reserva estática de memória e risco de OOM. A abordagem mais robusta foi ajustar os parâmetros sysctl do kernel, como vm.dirty_bytes e vm.dirty_expire_centisecs, permitindo que as páginas sujas permaneçam em RAM por mais tempo, sendo descartadas sem escrita para disco ao final da query, aproveitando a natureza disposable dos dados.

Por que isso importa

Este caso é um lembrete forte de que o desempenho de um banco de dados de alta performance não depende apenas da sua arquitetura interna ou da otimização das queries, mas também da sintonia fina com o sistema operacional. A falsa premissa de que “memória RAM livre significa que tudo ficará na memória” custou mais de uma hora de execução de query. Entender como o kernel gerencia I/O e memória, especialmente as políticas de writeback de páginas sujas, é fundamental para qualquer engenheiro que lida com dados em escala.

O que se viu no MonetDB, onde uma query de leitura gera escritas massivas, ecoa cenários complexos de I/O que abordamos anteriormente, como na matéria de 26 de março de 2026,

Linha do tempo

  1. Quando upserts não atualizam, mas ainda escrevem: Depurando o desempenho do Postgres em escala

  2. Nosso pipeline de faturamento ficou lento de repente. O culpado: um gargalo oculto no ClickHouse

  3. Otimização de Query em MySQL Reduz Tempo de Execução de Horas para Milissegundos em Tabela Bilionária

  4. A Eficiência do Batching: Por que Múltiplas Requisições Prejudicam Sua Performance de Dados

  5. Desvendando Latência Inconsistente em Hypertable PostgreSQL: Lições Aprendidas

  6. Migração de Firestore para SQL: Ganho de Performance Atingido com Otimização do Modelo de Leitura

  7. MonetDB e as 'Dirty Pages': Como uma Query Read-Only Escreveu Terabytes e a Solução para o Gargalo de Performance

Perguntas frequentes

O que são 'dirty pages' no contexto do kernel Linux?

Dirty pages são blocos de dados na memória RAM (no page cache do kernel) que foram modificados, mas ainda não foram gravados no disco correspondente. O kernel periodicamente escreve essas páginas modificadas para garantir a persistência dos dados.

Por que o MonetDB usa 'mmap' para arquivos temporários?

O MonetDB utiliza 'mmap' (memory-mapped files) para seus arquivos temporários como uma forma portátil e eficiente de gerenciar memória. Em vez de ter um gerenciador de buffer próprio, ele delega essa tarefa ao page cache do kernel, tratando os arquivos como se fossem memória RAM, simplificando o desenvolvimento e aproveitando otimizações do sistema operacional.

Qual a diferença entre usar 'tmpfs' e tunar o kernel para resolver o problema?

Usar 'tmpfs' move os arquivos temporários para um sistema de arquivos completamente baseado em RAM, eliminando as escritas para disco, mas exige que se defina um tamanho fixo e reserva essa memória. Tunar o kernel ajusta as políticas de 'writeback' das 'dirty pages' para arquivos no disco, permitindo que os dados temporários fiquem na RAM por mais tempo e sejam descartados sem escrita quando não são mais necessários, oferecendo dimensionamento sob demanda e sem reserva de RAM.

Este problema de 'dirty pages' afeta apenas o MonetDB?

Não, este problema não é exclusivo do MonetDB. Ele pode afetar qualquer sistema de banco de dados ou aplicação que faça uso intensivo de arquivos mapeados em memória para dados temporários ou que confie fortemente no page cache do kernel para gerenciamento de memória. As políticas de 'writeback' do kernel são globais e podem impactar diversas cargas de trabalho.

Fontes

Avalie este artigo:
Categoria
CEVIU Web Dev
Publicado
12 de outubro de 2026
Editoria
CEVIU Web Dev

Quer receber mais sobre CEVIU Web Dev?

Conteúdo curado diariamente, direto no seu e-mail.

Conteúdo curado diariamenteDiversas categoriasCancele quando quiser