PostgreSQL y el OOM killer: por qué usamos un overcommit estricto de memoria
Modos de overcommit de Linux y PostgreSQL
- Varios comentaristas señalan que el overcommit estricto (
vm.overcommit_memory=2) puede romperfork()y los reinicios de aplicaciones, especialmente si los ratios de overcommit ya están ajustados. - Recomendación: probarlo estrictamente en QA/perf, hacer pruebas de carga y desplegarlo mediante scripts de despliegue antes de integrarlo en
sysctl. - Algunos prefieren el modo heurístico (
0) con unovercommit_ratiomuy bajo y un uso intensivo deoom_score_adj(por ejemplo, -1000 para servicios críticos), además de ajustar la reserva del kernel. - Para PostgreSQL en particular, el overcommit estricto puede resultar atractivo porque maneja
ENOMEMcorrectamente y revierte transacciones en lugar de fallar.
Hosts compartidos: Go / lenguajes gestionados frente a Postgres
- Problema del mundo real: backend en Go y Postgres en el mismo host.
- El overcommit heurístico causó fallos de asignación en Postgres; el overcommit estricto volvió inestable todo el sistema debido a grandes reservas virtuales de Go.
- Soluciones alternativas: ajustar empíricamente
overcommit_ratio, usar GOMEMLIMIT para limitar el heap de Go, o aislar la base de datos y la app en nodos separados o mediante contenedores/cgroups.
OOM killer frente a fallos de asignación
- Hay un fuerte desacuerdo sobre si desactivar el overcommit es una buena idea.
- Algunos usuarios desactivan el overcommit y prefieren congelaciones breves en las que cierran aplicaciones manualmente, en lugar de que el kernel mate procesos “aleatorios” o críticos.
- Otros sostienen que eso solo cambia los OOM kills por fallos con
ENOMEM, ya que la mayoría del software de escritorio no gestiona fallos de asignación y puede corromper el estado. - El comportamiento del OOM killer del kernel en escritorios es ampliamente criticado por ser lento, impredecible y hostil para el usuario.
Windows/macOS y swap / compresión
- Varios comentarios contraponen Linux con Windows: Windows rastrea el commit charge, nunca hace overcommit y, por lo general, maneja las situaciones de poca memoria con más gracia.
- Algunos dicen que Windows, en la práctica, no tiene “OOM killer”, sino que rechaza asignaciones irrazonables; otros señalan que todavía puede matar o pedir cerrar la app problemática.
- Debate sobre desactivar el archivo de paginación de Windows: algunos lo hacen para “desactivar el overcommit”, otros dicen que casi siempre es una mala idea y destacan el archivo de paginación como salvaguarda.
- En Linux, los comentaristas abogan por swap, zram/zswap, MGLRU y demonios de OOM en espacio de usuario como valores por defecto más sensatos, especialmente frente a configuraciones estilo hyperscaler de “sin swap”.
Ángulos más amplios de diseño / lenguaje
- Algunos sostienen que el overcommit estricto en el escritorio es una trampa peligrosa debido a la falta generalizada de manejo de errores de
malloc. - Otros destacan que los sistemas robustos (especialmente las bases de datos) deberían implementar su propia contabilidad de memoria y estrategias de OOM.
- Un hilo secundario sugiere que los tipos más ricos de Rust (enums/Result) habrían evitado el error concreto de entero/booleano en C discutido en el artículo.