PostgreSQL: si ejecuto varias consultas al mismo tiempo, ¿en qué circunstancias vería una aceleración? ¿Bajo qué circunstancias vería una desaceleración?

10

Me acerco a todos humildemente como alguien que NO es un DBA, y estoy seguro de que mi pregunta está llena de deficiencias conceptuales y "depende de" las minas terrestres. También estoy bastante seguro de que todos los que elijan responder van a querer mucho más en cuanto a detalles de lo que puedo ofrecer actualmente.

Dicho esto, tengo curiosidad sobre el siguiente escenario en general:

  • Digamos que tengo dos consultas no triviales.
  • La consulta 1 requiere 2 minutos para completar en promedio.
  • La consulta 2 requiere 5 minutos para completar en promedio.

Si los ejecuto en serie, uno después del otro, espero que requiera 7 minutos para completar en promedio. ¿Es esto razonable?

Más que eso, sin embargo, ¿qué pasa si ejecuto las dos consultas al mismo tiempo? Dos conexiones separadas al mismo tiempo.

  • ¿En qué condiciones esperaría ver una aceleración? (Tiempo total <7 minutos)
  • ¿En qué condiciones esperaría ver una desaceleración? (Tiempo total> 7 minutos)

Ahora, si tuviera 1,000 consultas no triviales ejecutándose simultáneamente, tengo el presentimiento de que resultaría en una desaceleración general. En ese caso, ¿dónde estaría el cuello de botella? ¿Procesador? ¿RAM? Unidades?

Una vez más, sé que probablemente sea imposible responder la pregunta con precisión sin conocer los detalles (que no tengo). Estoy buscando algunas pautas generales en las que pensar cuando hago las siguientes preguntas:

  • ¿En qué circunstancias las consultas concurrentes resultan en una aceleración general?
  • ¿En qué circunstancias las consultas concurrentes resultan en una desaceleración general?
Aaron Johnson
fuente

Respuestas:

14

Si los ejecuto en serie, uno después del otro, espero que requiera 7 minutos para completar en promedio. ¿Es esto razonable?

Si usan conjuntos de datos no relacionados, entonces sí.

Si comparten un conjunto de datos, y el caché está inactivo para la primera consulta y la consulta está principalmente vinculada a E / S, entonces la segunda podría completarse en unos momentos. Debe tener en cuenta los efectos de almacenamiento en caché al tratar el análisis de rendimiento y el tiempo de consulta.

Más que eso, sin embargo, ¿qué pasa si ejecuto las dos consultas al mismo tiempo? Dos conexiones separadas al mismo tiempo.

"Depende".

Si ambos estuvieran usando escaneos secuenciales de la misma tabla, entonces en PostgreSQL sería una gran ganancia de rendimiento debido a su soporte para escaneos secuenciales sincronizados.

Si compartieran los mismos índices, probablemente se beneficiarían de las lecturas de los demás en la memoria caché.

Si son independientes y tocan datos diferentes, entonces podrían competir por el ancho de banda de E / S, en cuyo caso podrían tomar la misma cantidad de tiempo que la ejecución secuencial. Si el subsistema de E / S se beneficia de la concurrencia (mayor rendimiento neto con más clientes), entonces el tiempo total podría ser menor. Si el subsistema de E / S maneja la concurrencia de manera deficiente, entonces podrían tomar más tiempo que ejecutarlos secuencialmente. O puede que no estén vinculados a E / S, en cuyo caso, si hay una CPU libre para cada uno, podrían ejecutarse como si el otro no se estuviera ejecutando.

Depende mucho de la configuración del hardware y del sistema, del conjunto de datos y de las consultas mismas.

Ahora, si tuviera 1,000 consultas no triviales ejecutándose simultáneamente, tengo el presentimiento de que resultaría en una desaceleración general. En ese caso, ¿dónde estaría el cuello de botella? ¿Procesador? ¿RAM? Unidades?

Sí, eso probablemente ralentizaría las cosas por varias razones.

  • Los gastos generales de PostgreSQL en la coordinación entre procesos, la gestión de transacciones y bloqueos, la gestión de búfer, etc. Esto puede ser un costo bastante grande, y PostgreSQL no está realmente diseñado para un alto recuento de clientes: funciona mejor si hace cola .

  • Competencia por memoria de trabajo, caché, etc.

  • Gastos generales de programación del sistema operativo, ya que hace malabares con 1000 procesos competitivos, todos los segmentos de tiempo que desean. Bastante menor en estos días, los sistemas operativos modernos tienen programadores rápidos.

  • Golpe de E / S. La mayoría de los sistemas de E / S tienen un recuento de clientes de máximo rendimiento. A veces es 1, es decir, es mejor con un solo cliente, pero a menudo es más alto. A veces, el rendimiento disminuye nuevamente por encima del umbral. A veces solo llega a una meseta.

Craig Ringer
fuente
Este es exactamente el tipo de explicación que estaba buscando. Claro, sucinto, informativo. ¡Gracias!
Aaron Johnson
Hola @Craig Ringer, ¿y si voy a ejecutar 1000 consultas al mismo tiempo en una sola tabla (200 millones de filas)? ¿Postgres los manejará bien? ¿Ayudan los escaneos secuenciales sincronizados?
Rahul Gautam
@RahulGautam Nueva pregunta con detalles por favor, con un enlace a esta.
Craig Ringer
@CraigRinger agregado. Por favor, consulte dba.stackexchange.com/questions/188649/…
Rahul Gautam
@RahulGautam Su enlace está muerto. Me pregunto si podría proporcionar una actualización sobre lo que sucedió. Es un tema muy interesante.
Zeruno