Bug de logging do Codex pode gerar gravações na casa dos TB em SSDs locais e desgastar rapidamente sua vida útil
(github.com/openai)- O Codex grava continuamente grandes volumes de dados no banco de logs de feedback SQLite local e, em um ambiente de usuário, após 21 dias de funcionamento cerca de 37 TB foram gravados no SSD principal
- Isso equivale a cerca de 640 TB por ano, ou aproximadamente 640 gravações completas da unidade por ano em um SSD de 1 TB, podendo esgotar em menos de 1 ano a vida útil garantida de gravação de alguns SSDs de consumo (cerca de 600 TBW)
- Embora apenas cerca de 500 mil linhas sejam retidas, o contador AUTOINCREMENT ultrapassou 5,5 bilhões de IDs, criando uma diferença de cerca de 10 mil vezes entre linhas preservadas e IDs de inserção acumulados
- A causa é que o sink de sincronização do log de feedback em SQLite foi configurado com o TRACE global como padrão (
Targets::new().with_default(Level::TRACE)), fazendo com que até logs internos de dependências e payloads brutos de protocolo em grande volume fossem gravados permanentemente - Em 22 de junho de 2026, dois PRs foram mesclados, bloqueando cerca de 85% dos logs e encerrando o issue
Principais sintomas e escopo do impacto
- O Codex faz gravações contínuas e volumosas nos seguintes arquivos
~/.codex/logs_2.sqlite~/.codex/logs_2.sqlite-wal~/.codex/logs_2.sqlite-shm
- Após 21 dias de execução, cerca de 37 TB foram gravados no SSD principal, e inspeções por processo/arquivo confirmaram que os logs SQLite do Codex eram a principal fonte de gravação contínua
- Isso equivale a cerca de 640 TB por ano, ou aproximadamente 640 gravações completas da unidade por ano em um SSD de 1 TB
- Alguns SSDs de consumo têm classificação de cerca de 600 TBW, o que pode consumir a vida útil garantida de gravação em menos de 1 ano
Dados de evidência
-
Evidence1 — amplificação de escrita (write amplification)
- Tamanho atual do arquivo
logs_2.sqlite: 1.2 GiB - Linhas atualmente retidas: 506,149
row idtotal alocado: 5,543,677,486- Há uma diferença de cerca de 10 mil vezes entre as linhas retidas (cerca de 0,5M) e os IDs acumulados de inserção (5,5B+), sugerindo mais de 10 TB de churn histórico de logs mesmo sem contar WAL, índices, pruning, checkpoints, regravação de páginas e amplificação no nível do dispositivo
- Tamanho atual do arquivo
-
Evidence2 — distribuição por nível/alvo
- 681,774 linhas retidas, com conteúdo de log preservado estimado em cerca de 1,035.6 MiB
- Participação por nível: TRACE 70.7%, INFO 25.7%, DEBUG 3.0%, WARN 0.6%
- Maiores pares target+level
codex_api::endpoint::responses_websocket(TRACE) 527.4 MiBcodex_otel.log_only(INFO) 141.2 MiBcodex_otel.trace_safe(INFO) 121.2 MiBlog(TRACE) 97.4 MiB
- As principais fontes são, em sua maioria, logs TRACE globais, logs de telemetria espelhados e gravação de payloads brutos de websocket/SSE
codex_otel.log_only+codex_otel.trace_saferespondem por mais 25.3%, e filtrar essas categorias poderia remover cerca de 96% dos bytes de log preservados na amostra- A fonte TRACE mais frequente (
target=log) inclui muitos itens de baixo nível comoinotify event(por exemplo,ld.so.cache128,764 vezes), chamadas internas de tokio-tungstenite eWouldBlock
-
Medição da amplificação de escrita
- Em uma amostra de 15 segundos, o número de linhas retidas permaneceu em 681,774, mas cerca de 36,211 linhas foram inseridas
- O padrão repetido de insert-and-prune — inserir → indexar → gravar no WAL → podar — gera amplificação de escrita
Causa estimada
- O sink de log de feedback em SQLite foi instalado com o TRACE global como padrão (
Targets::new().with_default(Level::TRACE)) - Com isso, todos os alvos passam a ser armazenados permanentemente em nível TRACE, incluindo logs internos/de dependências e payloads brutos de protocolo em grande volume
Direção de correção proposta
- Manter os logs de feedback, mas reduzir o escopo do armazenamento persistente por padrão
- Não usar TRACE global no sink de log de feedback SQLite
- Aumentar o limiar ou remover ruído de baixo valor como
target=log,hyper_util, internals do tokio-tungstenite, spam de inotify e logs de baixo nível do OpenTelemetry SDK - Em vez de armazenar payloads brutos completos de websocket/SSE, guardar apenas um resumo (tipo de evento, duração, sucesso/falha, uso de tokens, tamanho do payload em bytes)
- Evitar armazenar eventos espelhados de
codex_otel.log_only/codex_otel.trace_safe, exceto quando forem úteis para depuração - Como limites por thread não bastam, adicionar também um limite global de tamanho/gravação para o banco de logs
- Uma opção como
sqlite_logs_enabled = falsetambém seria útil, mas a correção principal é uma filtragem padrão melhor
Relatos de reprodução em múltiplas plataformas
-
macOS
- Em macOS 15.7.7 / Codex 26.616.51431,
logs_2.sqlitetinha 113M,MAX(id)=34,277,360, 31,405 linhas retidas, e duas amostras de 60 segundos mostraram cerca de 60 gravações por segundo - Houve relato de uma sessão de 1–2 horas em que o processo
codexgravou cerca de 50 GB
- Em macOS 15.7.7 / Codex 26.616.51431,
-
Windows
- No Codex Desktop para Windows (
codex.exe app-server --analytics-default-enabled), linhas TRACE continuaram sendo inseridas mesmo semRUST_LOG=warne sem configuração explícita de trace - Havia cerca de 71 mil linhas retidas, enquanto o valor
logsemsqlite_sequencepassava de 18,5 milhões, indicando muito churn histórico de insert/prune - Em uma distribuição de 10 minutos, havia 1,812 linhas TRACE, com
codex_api::endpoint::responses_websocket(3.5MB+) ecodex_api::sse::responsesentre os principais alvos TRACE - Comportamento esperado: com
RUST_LOG=warn, logs TRACE internos/de dependências e payloads volumosos não deveriam ser armazenados persistentemente
- No Codex Desktop para Windows (
Riscos adicionais e medidas paliativas temporárias
-
Risco de perda de dados
- Se o disco encher, um reboot pode impedir o login no Linux
- O modo
/goaldo Codex pode tentar liberar espaço em disco apagando arquivos/pastas, o que pode causar perda de dados
-
Scripts temporários de mitigação
trim-codex-wal.sh, que reduz o WAL em execução usandoPRAGMA wal_checkpoint(TRUNCATE), podendo ser executado a cada 15 minutos via cronfix-codex-wal.sh, que apaga os arquivos de log/WAL e envia SIGTERM → SIGKILL para processos relacionados ao Codex para liberar espaço imediatamente- Também é possível adicionar um gatilho SQLite (
block_log_inserts) para ignorar inserções na tabelalogs, interrompendo o crescimento do WAL; para reverter, useDROP TRIGGER IF EXISTS block_log_inserts- Como
VACUUMregrava o banco, ele pode causar uma grande escrita única em arquivos grandes; por isso, recomenda-se primeiro adicionar o trigger, confirmar que o crescimento do WAL parou, e só então executarDELETE/VACUUM - Como isso altera um schema privado do SQLite, futuras atualizações/migrações do Codex podem recriar tabelas, remover o trigger etc.
- Como
- Até sair uma correção permanente, também foi sugerido colocar esse banco em um ramdisk para evitar desgaste do SSD
Resolução e encerramento
- Em 22 de junho de 2026, a mesclagem de dois PRs reduziu os logs em cerca de 85%, e o issue foi marcado como concluído
- Interrupção do logging de todos os eventos de Responses WebSocket (#29432)
- Filtragem de alvos ruidosos nos logs persistentes (#29457)
- Um patch proposto separadamente troca o TRACE global por armazenamento padrão em
INFO+, elevandocodex_otel.log_only,codex_otel.trace_safe,hyper_util,logeopentelemetry_sdkparaWARN+ - As correções foram lançadas em
rust-v0.142.0
1 comentários
Comentários do Hacker News
Codex me parece um dos casos mais infames de slopware
No macOS, só de deixar a janela visível ele usa 100% da GPU para exibir a mensagem do spinner
100% da GPU em um MBP M5 só por causa da mensagem do spinner, e os ventiladores ficam girando forte durante boa parte do tempo de espera pelo modelo, então é bom tomar cuidado ao usar na bateria
Esse problema está no GitHub há quase 6 meses e provavelmente existe desde que lançaram essa tranqueira feita com vibe coding
Mesmo que eu quisesse corrigir, por algum motivo não dá, porque é código fechado
Há muito debate sobre qual modelo é melhor e se vibe coding funciona, mas esse parece ser o nível do que uma das empresas com mais dinheiro, gente e capacidade de modelo consegue fazer com vibe coding
Quando o CEO já declarou que a empresa está “focada em programação”, um erro grave desses parece sinal de que há algo realmente quebrado internamente, e no Polymarket quase ninguém acha que a OpenAI vai lançar tão cedo um modelo líder
É trágico, porque o mundo precisa de um concorrente para a Anthropic
Parece que a “revolução da IA agêntica” já deveria ter resolvido esse tipo de problema
Espero que internamente eles não estejam dizendo “estamos processando, aguarde” ou “essa tarefa é difícil demais”
Ninguém quer ser a cara pública de uma base de código horrível
E se você ainda estiver usando esse código para justificar preços absurdos, esse peso deve ser triplicado
Não faz sentido
Mesmo tentando usar o Google AI Studio no navegador, ele consome 100% da CPU
Dá vontade de achar que vou ter de transformar tudo em app nativo
Publicaram no X uma solução temporária para esse problema[1]
sqlite3 ~/.codex/logs_2.sqlite "CREATE TRIGGER IF NOT EXISTS block_log_inserts BEFORE INSERT ON logs BEGIN SELECT RAISE(IGNORE); END;"Além disso, ao executar
VACUUM FULLnesse arquivo sqlite em um notebook, ele caiu de 27 GB para 73 MB[2][1]: https://xcancel.com/bdsqlsz/status/2067964486615810369
[2]: https://xcancel.com/jeethu/status/2068087449469780434
Todo mundo está criticando a OpenAI, e com razão, mas vale lembrar que, ao contrário do Claude Code, o Codex é oficialmente customizável: https://github.com/openai/codex
Também é bem fácil de aplicar patch
Chocante
Já faz uma semana que a issue foi aberta e, pelo que vejo, a OpenAI simplesmente está em silêncio
Eu achava que fornecedores desse tipo seriam extremamente sensíveis a esse tipo de problema, então não entendo
Presumivelmente eles já devem ter vários agentes monitorando issues em potencial no GitHub e propondo correções, certo? …Certo?
Fazer as próprias ferramentas corrigirem issues do GitHub em tempo real deveria ser algo trivial a essa altura
Meu exemplo favorito é a #2472: fizeram uma demonstração no palco do lançamento do GPT-5 dizendo que estava “corrigida”, mas o ticket continua aberto e essa “correção” nem foi incorporada
O post original apontando isso é https://blog.tymscar.com/posts/openaiunmergeddemo/ e a issue é https://github.com/openai/openai-python/issues/2472
Eu uso bastante o Codex e estou muito satisfeito com o desempenho dele (UX e saída), mas é difícil entender por que esse problema ainda não foi corrigido
Esse problema parece ter sido corrigido[0] e deve entrar na próxima versão
[0] https://github.com/openai/codex/commit/e98d43ac372ddf7f513c0...
Vibe coding leva o “mova-se rápido e quebre tudo” a um nível completamente diferente
Em produto real, engenheiros de software de verdade nunca serão substituídos
Um pouco fora do assunto, mas essas empresas precisam parar de sujar a raiz do repositório com Claude.md ou copilot.md
Deviam se juntar de uma vez e definir uma estrutura de pasta conhecida, como
docs/llm/*No fim do ano passado, quando o Claude Code estava um desastre por causa da latência, a OpenAI deixou escapar uma vitória quase garantida
Hoje em dia, o Codex já começa com atraso na digitação desde o início, enquanto o Claude Code, embora às vezes trave, no geral quando eu aperto uma tecla ele… literalmente… mostra o que eu digitei
Sempre preciso digitar no neovim quando vou escrever mais do que algumas palavras
Isso na verdade é um erro bem típico
Lançaram com logs de rastreamento/depuração ativados para tudo, mas o engraçado é que o impacto não aparece do jeito tradicional
Antigamente, um desenvolvedor ativava logging em nível trace, o app ficava catastroficamente lento e isso era corrigido já na atualização seguinte; agora memória, CPU e disco ficaram tão absurdamente rápidos que chegamos num ponto em que isso já não se revela de forma tão imediata, o que é insano
Queria que alguém doasse alguns tokens para essa valente startup. Parece que eles estão precisando de ajuda