PostgreSQL - Se eseguo più query contemporaneamente, in quali circostanze vedrei una velocità? In quali circostanze vedrei un rallentamento?


10

Mi rivolgo umilmente a tutti voi come uno che NON è un DBA, e sono sicuro che la mia domanda sia piena di carenze concettuali e "dipende da" mine antiuomo. Sono anche abbastanza sicuro che tutti coloro che scelgono di rispondere vorranno molto di più in termini di specifiche di quelle che posso attualmente fornire.

Detto questo, sono curioso del seguente scenario in generale:

  • Dì che ho due domande non banali.
  • La query 1 richiede in media 2 minuti.
  • La query 2 richiede in media 5 minuti.

Se li eseguo in serie, uno dopo l'altro, mi aspetto che in media occorrano 7 minuti. È ragionevole?

Oltre a ciò, tuttavia, cosa succede se eseguo le due query contemporaneamente? Due connessioni separate contemporaneamente.

  • In quali condizioni mi sarei aspettato di vedere uno speedup? (Tempo totale <7 minuti)
  • In quali condizioni mi sarei aspettato di vedere un rallentamento? (Tempo totale> 7 minuti)

Ora, se avessi 1.000 query non banali in esecuzione contemporaneamente, ho la sensazione che ciò comporterebbe un rallentamento generale. In tal caso, dove sarebbe probabilmente il collo di bottiglia? Processore? RAM? Azionamenti?

Ancora una volta, so che probabilmente è impossibile rispondere alla domanda con precisione senza conoscere i dettagli (cosa che non ho.) Sto cercando alcune linee guida generali a cui pensare quando si pongono le seguenti domande:

  • In quali circostanze le query simultanee si traducono in uno speedup complessivo?
  • In quali circostanze le query simultanee provocano un rallentamento generale?

Risposte:


14

Se li eseguo in serie, uno dopo l'altro, mi aspetto che in media occorrano 7 minuti. È ragionevole?

Se utilizzano set di dati non correlati, quindi sì.

Se condividono un set di dati e la cache è fredda per la prima query e la query è principalmente associata a I / O, la seconda potrebbe essere completata in pochi istanti. È necessario considerare gli effetti di memorizzazione nella cache quando si ha a che fare con l'analisi delle prestazioni e la tempistica delle query.

Oltre a ciò, tuttavia, cosa succede se eseguo le due query contemporaneamente? Due connessioni separate contemporaneamente.

"Dipende".

Se entrambi utilizzassero le scansioni sequenziali della stessa tabella, in PostgreSQL si tratterebbe di un enorme vantaggio in termini di prestazioni grazie al supporto delle scansioni sequenziali sincronizzate.

Se condividessero gli stessi indici, probabilmente trarrebbero beneficio dalle letture reciproche nella cache.

Se sono indipendenti e toccano dati diversi, potrebbero competere per la larghezza di banda I / O, nel qual caso potrebbero impiegare lo stesso tempo di esecuzione sequenziale. Se il sottosistema I / O beneficia della concorrenza (throughput netto più elevato con più client), il tempo totale potrebbe essere inferiore. Se il sottosistema I / O gestisce la concorrenza in modo scadente, potrebbe richiedere più tempo rispetto all'esecuzione sequenziale. Oppure potrebbero non essere affatto legati all'I / O, nel qual caso se c'è una CPU libera per ognuna potrebbero ben eseguirla come se l'altra non fosse affatto in esecuzione.

Dipende molto dalla configurazione hardware e di sistema, dal set di dati e dalle query stesse.

Ora, se avessi 1.000 query non banali in esecuzione contemporaneamente, ho la sensazione che ciò comporterebbe un rallentamento generale. In tal caso, dove sarebbe probabilmente il collo di bottiglia? Processore? RAM? Azionamenti?

Sì, molto probabilmente rallenterebbe le cose per una serie di motivi.

  • I costi generali di PostgreSQL nel coordinamento tra processi, gestione delle transazioni e dei blocchi, gestione del buffer, ecc. Questo può essere un costo piuttosto elevato e PostgreSQL non è davvero progettato per un numero elevato di clienti - funziona meglio se lavori in coda .

  • Concorso per memoria di lavoro, cache, ecc.

  • Pianificazione del sistema operativo in sovraccarico mentre destreggia 1000 processi in competizione tutti desiderando fasce orarie. Abbastanza minore oggigiorno, i moderni sistemi operativi hanno programmatori veloci.

  • Thrashing I / O. La maggior parte dei sistemi I / O ha un conteggio dei client con prestazioni di picco. A volte è 1, cioè è meglio con un solo client, ma spesso è più alto. A volte le prestazioni diminuiscono nuovamente al di sopra della soglia. A volte raggiunge solo un altopiano.


Questo è esattamente il tipo di spiegazione che stavo cercando. Chiaro, conciso, informativo. Grazie!
Aaron Johnson,

Ciao @Craig Ringer, cosa succede se eseguirò 1000 query contemporaneamente su una singola tabella (200 milioni di righe). Postgres li gestirà bene? Le scansioni sequenziali sincronizzate aiutano?
Rahul Gautam,

@RahulGautam Nuova domanda con dettagli per favore, con un link a questo.
Craig Ringer,

@CraigRinger aggiunto. Si prega di controllare dba.stackexchange.com/questions/188649/…
Rahul Gautam,

@RahulGautam Il tuo link è morto. Mi chiedo se potresti fornire un aggiornamento su quello che è successo? È un argomento molto interessante.
Zeruno,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.