messa a punto di postgresql per grandi quantità di ram


29

Ho due server identici (in termini di hardware), sono entrambe installazioni standard di Windows Server 2008 R2, con un software minimo installato (fondamentalmente il mio codice e cose richieste come jvm ecc.).

Su un server, sto eseguendo SQL Server 2005, sul secondo server Postgresql 9.1. La differenza nelle prestazioni di questi 2 server è sconcertante, è così grave su postgresql che mi pento del mio discorso iniziale "usiamo postgresql invece di pagare per la licenza del server sql" al mio capo. Stiamo parlando di differenze di 30 secondi contro 15 minuti per lo stesso comando, e non è solo questo comando, è qualsiasi domanda o comando che gli lancio. Entrambi hanno praticamente gli stessi dati (i record sono stati inseriti in un ordine diverso) ed entrambi i database hanno la stessa struttura / indici esatti, ecc.

Ma spero sia solo una questione di ottimizzazione delle prestazioni. Il fatto è che sql server utilizza praticamente tutti i 32 concerti di ram sul server, mentre postgresl non usa nulla, sicuramente meno di un concerto, anche se in realtà non l'ho capito nei minimi dettagli.

Come posso ottenere postgresql per usare più di 20 concerti di ram? Questi server sono stati creati appositamente per questa roba di database, quindi ogni ram non utilizzata dal database e dai processi di supporto è sprecato secondo me.


4
Hai cambiato qualcosa alla messa a punto iniziale? Step1: SET effective_cache_size=18G;(l'impostazione predefinita è estremamente bassa) BTW: supponendo che si tratti di una macchina a 64 bit (no PTE)

1
Non ci stai dando abbastanza per aiutare molto. Oltre a "È lento" non sappiamo molto sul tuo set di dati, su come accedervi, su quali tipi di query vengono generalmente eseguite lentamente, su ciò che hai già fatto per ottimizzare (e possibilmente mettere a punto) il tuo server. Diamine, su una macchina linux con molti core e canali di memoria, puoi ottenere prestazioni scadenti molto prima di aver installato postgresql. Sei associato a CPU o IO? Quali impostazioni non predefinite hai già? Quali tipi di query sono lenti?
Scott Marlowe,

2
Postgres non "usa la ram" nel modo in cui ne parli. Si basa sulla cache della pagina del file system del sistema operativo per gran parte della sua memorizzazione nella cache, quindi quando si osserva l'utilizzo di RAM su un sistema che esegue postgres in genere si vedono molti GB in uso dai buffer / cache del sistema operativo e singoli processi di back-end postgres utilizzando solo alcuni qualche decina di MB ciascuno.
dbenhur,

1
Vedi questo link: tekadempiere.blogspot.ae/2014/09/… E trova i tuoi valori conf basati sulle risorse da qui: pgtune.leopard.in.ua
Sajeev

domanda correlata, forse di interesse: stackoverflow.com/questions/47311485/…
mountainclimber

Risposte:


41

Esistono molte costanti modificabili, inizializzate tramite postgres.conf. I più importanti sono:

  • max_connections: il numero di sessioni simultanee
  • work_mem : la quantità massima di memoria da utilizzare per risultati intermedi come le tabelle hash e per l'ordinamento
  • shared_buffers la quantità di memoria dedicata allo spazio buffer "bloccato".
  • effective_cache_size la quantità di memoria che si presume sia utilizzata dai buffer LRU del sistema operativo.
  • random_page_cost : una stima del costo relativo delle ricerche del disco.

max_connectionsnon dovrebbe essere impostato più alto del necessario, le connessioni costano risorse anche quando sono inattive; nella maggior parte dei casi una connessione impiegherebbe più tempo ad aspettare dentro che ad aspettare fuori. (al prezzo della concorrenza) Una buona formula empirica è "numero di mandrini + numero di processori + X"

work_memè complicato: può essere applicato a ogni subquery, quindi una query con 5 HASHJOINSpotrebbe costare 5 * work_mem. E per gli scenari peggiori, dovresti anche pensare a più sessioni che consumano questo importo (di nuovo un motivo per mantenere max_connectionsbasso).

shared_buffersè (IMHO) sopravvalutato. Normalmente si consiglia di impostarlo su circa 1/4 ... 1/2 di tutta la memoria "libera" disponibile, ma tendo a mantenerlo basso e impostare effective_cache_sizesu tutta la memoria "libera" disponibile.

random_page_costè il costo per una ricerca + lettura sul disco. È relativo a sequential_disk_cost, che è 1. L'impostazione predefinita (4) per random_page_costè impostata su un valore troppo alto per le macchine moderne e l'archiviazione di rete, normalmente può essere abbassata tra 2 e 1.x. Per i dischi SSD potresti anche impostarlo su 1.0, poiché la ricerca è quasi gratuita su SSD.


Eccellente! Non ho mai visto il significato di effect_cache_size, sempre preso in giro solo con shared_buffers. Questo ha fatto davvero una grande differenza. Eseguo anche pgtune e mi ha consigliato di usare 20 GB di 96 per shard_buffers, ma 64 GB per effettive_cache_size. Grazie!

1
FWIW, ho esaminato queste e le altre impostazioni suggerite nei documenti di Postgres e ho fatto un'analisi per il nostro server .
mlissner,

Grazie mille per la risposta. Posso chiedere qual è il valore raccomandato work_memquando max_connectionsè 100 predefinito e la RAM del server è 32 GB (server Postgres dedicato)? Sapevo che avrei dovuto sintonizzarmi da solo sulla base di domande quotidiane. Mi chiedo solo se puoi dirmi un valore "taglia unica per tutte le risposte" (o un valore del punto di partenza). 50 MB sono troppo grandi? Molte grazie.
sgon00,

Dipende dalla tipica attività concorrente sulla tua macchina. 100 sessioni che vogliono 50 M (in cima ai loro 10..20 M) potrebbero adattarsi ciascuna . Oppure potrebbe non esserlo. Per avere un'impressione, controlla vmstat o top. Inoltre: dipende dalla tua query (e dalle altre). Guarda i piani.
wildplasser,

@wildplasser grazie mille per la rapida risposta. Ho trovato un sito Web interessante pgtune.leopard.in.ua . Penso che userò 40 MB come punto di partenza dal suo suggerimento e messa a punto in base a quello. Saluti.
sgon00,

20

Prendi in considerazione l'utilizzo di pgtune per aiutarti a ottimizzare la configurazione di PostgreSQL. Da PgFoundry:

pgtune prende il postgresql.conf predefinito wimpy ed espande il server di database per essere potente quanto l'hardware su cui viene distribuito

La configurazione predefinita di PostgreSQL è molto conservativa e lo strumento è pensato per aiutare con questa situazione esatta. La documentazione è una lettura leggera e l'utilizzo dello strumento è piuttosto semplice.

Tieni presente che non è necessario utilizzare i suggerimenti esatti di pgtune. Giocare con le sue impostazioni e guardare le modifiche risultanti al file conf ti darà una migliore comprensione della configurazione di PostgreSQL e di come modificarla manualmente.


8
L'ultimo aggiornamento di pgtune è stato nel 2009, 5 anni fa e conta ancora. Mi chiedo se sia ancora valido per la serie 9.1-9.2-9.3.
sorin,

9
pgtune è ora disponibile online
Alfabravo

3

Se ogni query o comando viene eseguito lentamente, sospetto che:

  • ti connetti al database per ogni query che esegui;
  • hai configurato una sorta di metodo di autenticazione, che non funziona e interrompe le tue query fino a quando questo particolare metodo di autenticazione non scade.

Potresti dirci quanto tempo ci vuole per eseguire una query del genere select version()? Se dovrebbe essere istantaneo (0,16ms sulla mia workstation).


2

Se OGNI query è molto più lenta, qualcosa è terribilmente sbagliato nel server o qualcosa del genere. Nella mia esperienza, ogni db ha alcune cose in cui è meglio dell'altro, ma per quanto riguarda le prestazioni pgsql è facilmente nello stesso regno del server mssql.

Quindi, su quale sistema operativo stai eseguendo pgsql? Quale hardware? Quali impostazioni hai già cambiato? Quanto è grande il tuo set di dati? Qual è un esempio di query scadente e l'output di spiegato analizza (Esegui la query in questo modo:

spiegare analizzare selezionare ... resto della query qui ...;

Pubblica l'output su http://explain.depesz.com/ e pubblica il link qui.


1
Sì, ogni query / comando viene eseguito lentamente e sì "qualcosa" è terribilmente sbagliato, quindi la mia domanda. Il problema è che mssql sta sfruttando appieno la RAM disponibile sul server (cache così pesante) mentre psql non lo è. Apprezzo i commenti e i consigli, ma devi aver perso la maggior parte della mia domanda e l'oggetto stesso ... Voglio solo sapere come ottenere psql per utilizzare la ram disponibile; attualmente
sto

1
L'uso della RAM NON è il problema. Postgresql si affida al sistema operativo per eseguire la maggior parte della memorizzazione nella cache. Pertanto, non è NECESSARIO utilizzare tutta la RAM. Ancora una volta, hai perso la maggior parte del mio punto. Ci stai dando poco prezioso per aiutarti. Guido 5000 cluster postgresql TPS per vivere. Puoi seguire il mio consiglio o continuare a pensare di sapere come funziona pgsql e discutere.
Scott Marlowe,

@ user85116, per favore, Scott, abbiamo già un flusso di lavoro con MySQL che dipende dalla super latenza, quindi attualmente MySQL sta usando una RAM da 64 GB per eseguire rapidamente le query, mentre lo stesso può essere ottenuto su Postgres 2G con viste appena materializzate. La memorizzazione nella cache di tutto il database nella RAM non risolverà il problema, ma lo renderà meno visibile. Se hai gli stessi problemi nella struttura del DB Postgres non lo risolverà per te né proverà a nasconderlo.
kworr,
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.