Domanda

Quindi, abbiamo un database di produzione che è 32 GB su una macchina con 16 GB di RAM. Grazie alla cache questo di solito non è un problema a tutti. Ma ogni volta che inizio un pg_dump del database, query dai server app iniziare la fila, e dopo pochi minuti le piste di coda di distanza e le nostre macina App per una battuta d'arresto.

Sarò il primo a riconoscere che abbiamo problemi di prestazioni di query, e stiamo affrontando quelli. Nel frattempo, voglio essere in grado di eseguire pg_dump di notte, in un modo che sorsi dal database e non ci vuole la nostra applicazione verso il basso. Non mi importa se ci vogliono ore. La nostra applicazione non viene eseguito alcun DDL, quindi non sono preoccupato per il conflitto di blocchi.

Il tentativo di risolvere il problema, sto correndo pg_dump sia bello e ionice. Purtroppo, questo non risolve il problema.

nice ionice -c2 -n7 pg_dump -Fc production_db -f production_db.sql

Anche con ionice vedo ancora il problema di cui sopra. Sembra che i / o aspetto e un sacco di cerca sono la causa del problema.

vmstat 1 

mi dimostra che iowait si aggira intorno al 20-25% e punte al 40% a volte. % oscilla reale di CPU tra il 2-5% e punte al 70% qualche volta.

Non credo serrature sono un possibile colpevole. Quando faccio funzionare questa domanda:

select pg_class.relname,pg_locks.* from pg_class,pg_locks where pg_class.relfilenode=pg_locks.relation;

vedo solo le serrature che sono contrassegnati = concessi 't'. Non di solito eseguire qualsiasi DDL in produzione -. Così serrature non sembrano essere il problema

Qui viene emesso da un ps con la colonna WCHAN abilitato:

PID WIDE               S TTY          TIME COMMAND
3901 sync_page         D ?        00:00:50 postgres: [local] COPY
3916 -                 S ?        00:00:01 postgres:  SELECT
3918 sync_page         D ?        00:00:07 postgres:  INSERT
3919 semtimedop        S ?        00:00:04 postgres:  SELECT
3922 -                 S ?        00:00:01 postgres:  SELECT
3923 -                 S ?        00:00:01 postgres:  SELECT
3924 -                 S ?        00:00:00 postgres:  SELECT
3927 -                 S ?        00:00:06 postgres:  SELECT
3928 -                 S ?        00:00:06 postgres:  SELECT
3929 -                 S ?        00:00:00 postgres:  SELECT
3930 -                 S ?        00:00:00 postgres:  SELECT
3931 -                 S ?        00:00:00 postgres:  SELECT
3933 -                 S ?        00:00:00 postgres:  SELECT
3934 -                 S ?        00:00:02 postgres:  SELECT
3935 semtimedop        S ?        00:00:13 postgres:  UPDATE waiting
3936 -                 R ?        00:00:12 postgres:  SELECT
3937 -                 S ?        00:00:01 postgres:  SELECT
3938 sync_page         D ?        00:00:07 postgres:  SELECT
3940 -                 S ?        00:00:07 postgres:  SELECT
3943 semtimedop        S ?        00:00:04 postgres:  UPDATE waiting
3944 -                 S ?        00:00:05 postgres:  SELECT
3948 sync_page         D ?        00:00:05 postgres:  SELECT
3950 sync_page         D ?        00:00:03 postgres:  SELECT
3952 sync_page         D ?        00:00:15 postgres:  SELECT
3964 log_wait_commit   D ?        00:00:04 postgres:  COMMIT
3965 -                 S ?        00:00:03 postgres:  SELECT
3966 -                 S ?        00:00:02 postgres:  SELECT
3967 sync_page         D ?        00:00:01 postgres:  SELECT
3970 -                 S ?        00:00:00 postgres:  SELECT
3971 -                 S ?        00:00:01 postgres:  SELECT
3974 sync_page         D ?        00:00:00 postgres:  SELECT
3975 -                 S ?        00:00:00 postgres:  UPDATE
3977 -                 S ?        00:00:00 postgres:  INSERT
3978 semtimedop        S ?        00:00:00 postgres:  UPDATE waiting
3981 semtimedop        S ?        00:00:01 postgres:  SELECT
3982 -                 S ?        00:00:00 postgres:  SELECT
3983 semtimedop        S ?        00:00:02 postgres:  UPDATE waiting
3984 -                 S ?        00:00:04 postgres:  SELECT
3986 sync_buffer       D ?        00:00:00 postgres:  SELECT
3988 -                 R ?        00:00:01 postgres:  SELECT
3989 -                 S ?        00:00:00 postgres:  SELECT
3990 -                 R ?        00:00:00 postgres:  SELECT
3992 -                 R ?        00:00:01 postgres:  SELECT
3993 sync_page         D ?        00:00:01 postgres:  SELECT
3994 sync_page         D ?        00:00:00 postgres:  SELECT
È stato utile?

Soluzione

  1. Il metodo più semplice: Si può strozzare pg_dump utilizzando pv .
  2. Il più duro: Cambiare la procedura di backup. Utilizzare ad esempio:
        psql -c 'pg_start_backup()'
        rsync --checksum --archive /var/lib/pgsql /backups/pgsql
        psql -c 'pg_stop_backup()'
    
    Ma fare attenzione che anche è necessario avere continuo archiviazione set per questo al lavoro e tutto WAL file creati durante il backup nascosto lungo il backup di file di dati.
  3. Ancora più difficile: È possibile impostare un database replicato (usando per esempio login spedizione ) sul disco addizionale a buon mercato e, invece di eseguire il backup backup del database di produzione una replica. Anche cadrà dietro alcune operazioni finirà per recuperare il ritardo. Ma controllare se replica è ragionevolmente aggiornati prima dell'avvio del backup.

Altri suggerimenti

L'output PS ha più istruzioni UPDATE in stato di "attesa", che dice ancora serrature a me (la vostra query di serrature di prova da parte). Sono abbastanza sicuro che non vedrebbe "in attesa" nell'output PS altrimenti. Potete controllare per vedere se questo show di query nulla durante il problema:

SELECT * FROM pg_stat_activity WHERE waiting;

(Lei non ha detto quale versione di PostgreSQL si esegue quindi non sono sicuro se questo funzionerà.)

Se c'è qualcosa lì dentro (cioè, con l'attesa = TRUE), allora è un problema di blocco / transazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top