Configuración de caché para VM PostgreSQL/TimescaleDB en ZFS con proxmox

Configuración de caché para VM PostgreSQL/TimescaleDB en ZFS con proxmox

Tengo un cluster proxmox de un solo nodo y quiero iniciar una nueva VM con PostgreSQL y TimescaleDB y después de leer mucho sobre cómo ajustar volúmenes ZFS para este propósito todavía tengo algunas dudas con las opciones de caché. Tenemos 3 cachés: El de proxmox (ARC), el de linux vm (LRU) y el de PostgreSQL (barrido de reloj); en orden de más a más cerca de los DB.

He leído mucha información, alguna contradictoria, así que no sé si esto es cierto, pero parece que el caché PG no está diseñado de la misma manera que un caché del kernel donde intenta capturarlo todo y desalojar sólo cuando no haya suficiente espacio para continuar con el almacenamiento en caché. De hecho, parece más bien un búfer para los datos que se están procesando en ese momento y no un caché a largo plazo. De hecho, se llama buffers compartidos. Supongo que es por eso que el documento no recomienda configurar los búferes compartidos en un porcentaje alto de la RAM disponible como lo hace ARC, sino entre el 25 y el 50%. Parece que el caché PG real es el del núcleo y no los búferes compartidos.

Teniendo esto en cuenta existen algunas configuraciones posibles a tener en cuenta:

  1. Cree una máquina virtual con una cantidad moderada de RAM (digamos 12 GB) y configure los búferes compartidos en 10 GB. Intentando con eso: 1) Tener una buena cantidad de memoria para actuar como búfer para las consultas en curso. 2) Sofocar la RAM de la VM para no usar su caché, que con su configuración LRU debería ser la peor y en su lugar usar ARC uno con mejores pesos. El problema con esta configuración puede venir porque el caché está fuera de la VM y podría reducir el rendimiento en lugar de mejorarlo. Tampoco estoy seguro de cuánto espacio me queda sobre el tamaño de los búferes compartidos para permitir ejecutar el sistema operativo VM y los otros procesos de base de datos.
  2. Cree una máquina virtual con una gran cantidad de RAM (digamos 48 GB) y mantenga los búferes compartidos en los mismos 10 GB. Además, zfs configura la caché principal en metadatos. De esta manera el caché estará más cerca de la base de datos y dentro de la VM pero con la peor lógica. Parece que LRU es un poco malo para DB.
  3. Cree una máquina virtual con una gran cantidad de RAM y caché principal = todo. Creo que esto será algo malo porque: 1) Los cachés de VM y proxmox competirán por los recursos. 2) Duplicación de caché.

Para dar un poco de contexto, el nodo tiene 64 GB de RAM total y PG/timescaleDB será la aplicación más exigente/prioritaria que se ejecute en él.

Entonces, ¿son correctas mis suposiciones iniciales? ¿Qué configuración funcionará mejor? ¿Qué cambiarías?

Saludos cordiales, gracias por tu tiempo,

Héctor

Respuesta1

Mi recomendación es utilizar la Solución n.º 4: crear una máquina virtual con una gran cantidad de RAM y utilizarla en el lado KVM (Proxmox) cache=nonepara el disco de datos. Esto evitará que Proxmox utilice el caché de la página del host, ejecutando de manera efectiva la sincronización del almacenamiento real. De esta manera, se acercará lo más posible al hardware básico de su máquina virtual y podrá ajustar sus cachés allí.

Tenga en cuenta que, para todas las bases de datos que conozco (incluido PostgreSQL), el búfer RAM no es solo un caché de disco, sino que mantendrá al menos parte de los datos en un formato listo para leer en el formato en disco. Esto implica que la RAM reservada para el proceso de base de datos es más valiosa que la RAM utilizada simplemente como buffers de E/S.

Si su base de datos puede responder una consulta desde (su propia) RAM, no se ejecutará en absoluto a través de la pila de E/S, lo que ahorrará enormemente en latencia.

información relacionada