Äre Rapport ass an ongeféier enger Sekonn um Datebankhost fäerdeg an a véier iwwer d’VPN, an d’Zuel, déi psql dréckt, weist direkt op d’Datebank. Déi Zuel ass eng Stoppauer op der Client-Säit, net eng Miessung vum Server. Si deckt d’Uweisung um Wee eraus, d’Waarden op eng Äntwert an d’Reien um Wee zréck. Dës dräi ze trennen ass den eenzegen Wee, fir ze wëssen, wéi eng Säit anzestellen.

Wat den psql-Timer wierklech misst

\timing on startet eng Stoppauer just ier de Client d’Uweisung an de Socket schreift, a stoppt si, wann déi lescht Rei vun deem Resultat gelies ass. D’Ausféierung vum Server selwer sëtzt irgendwou an deem Fënster, an och all Millisekonn, déi d’Paketen am Tunnel verbréngen. Näischt an der Ausgab trennt si. EXPLAIN dréckt och eng Zuel, awer déi mécht de Server, an si schléisst d’Waarde vum Client aus. Zwou Zuelen, zwou verschidde Froen.

Start eng Sitzung, loos d’Zäitmiessung un, a féier d’Uweisung, déi Dir wëllt, vun bannen aus. Eng Sitzung erëm ze benotzen hält d’Verbindungskäschte baussen der éischter Miessung.

psql "host=db.internal port=5432 dbname=appdb user=app" \
  -c "\timing on" \
  -c "select count(*) from orders where created_at > now() - interval '1 day';"

D’Zuel enthält nach ëmmer den Iwwerdroe vum Resultat, wat hei gewollt ass. Si enthält net méi den Austausch vu Verbannen an Authentifizéieren, deen en neien Opruff géif bäisetzen.

Vergläicht eng Uweisung iwwer dräi Weeër

Féiert déi selwecht Uweisung iwwer den Unix-Socket, iwwer d’LAN-Adress an iwwer den VPN-Hostnumm aus, a vergläicht déi dräi. Wann nëmmen déi lescht lues ass, ass d’Query net déi Verännerlech.

All Opruff verbënnt sech fir d’éischt a misst d’Uweisung eréischt duerno, sou datt d’Verbindungskäschte baussen der Zuel bleiwen, wärend den Iwwerdroe bannen bleift. Hält d’WHERE-Klausel, d’Reiezuel an d’Clientmaschinn identesch, soss vergläicht Dir Aarbechtslaaschten anstatt Weeër.

psql -h /var/run/postgresql -U app -d appdb -c "\timing on" -c "select count(*) from orders;"
psql -h 10.40.0.12 -U app -d appdb -c "\timing on" -c "select count(*) from orders;"
psql -h db.vpn.internal -U app -d appdb -c "\timing on" -c "select count(*) from orders;"

An engem LAN ass den Ënnerscheed meeschtens kleng genuch ze ignoréieren; iwwer eng VPN dacks net. D’dräi Resultater ze sortéieren seet Iech duerno, wéi eng Waard unzegräifen.

En lues lokalen Socket bedeit Serveraarbecht oder Planung. En lues LAN-Resultat bedeit d’Query oder de Volume, deen se beweegt. Nëmmen en lues VPN-Resultat bedeit Latenz, MTU oder verfügbar Bandbreed op dem Wee, a keng Indexännerung mécht dat gutt.

Huet d’Ausféierungszäit vum Server selwer eraus

De Server kann mellene wéi vill Zäit hien ausginn huet, an dat ass d’Zuel, déi een der Client-Zuel entgéinstellt. EXPLAIN mat ANALYZE féiert d’Uweisung aus an dréckt Planungs- an Ausféierungszäit am Plang, wärend BUFFERS Cache-Verhalen dobäisetzt, dat dacks en waarmen Laf géint en kalen erklärt. Riicht et net op schreiwend Uweisungen, wann Dir net wëllt schreiwen. Op enger nëmmen-liesbarer Replika ass et déi sécherst Plaz fir unzefänken, an déi psql-Referenz dokumentéiert d’Client-Säit vum Timer.

Fir Uweisungen, déi d’Applikatioun schonn ausféiert, aggregéiert pg_stat_statements d’Ausféierung op der Server-Säit, ouni eppes nach eng Kéier ze starten. D’Reie si pro normaliséierter Query, also kann en Entrée méi Call-Site decken.

select calls, round(mean_exec_time::numeric, 2) as mean_ms, rows
from pg_stat_statements
order by mean_exec_time desc
limit 5;

D’Spaltennimm ënnerscheede sech no Release: PostgreSQL 13 an duerno weisen mean_exec_time, wärend eeler Versiounen et mean_time nennen, also kontrolléiert mat \d pg_stat_statements, wann déi Query e Feeler gëtt. Dës Wäerter schléissen d’Planung aus an schléissen de Wee bis bei Äre Client aus. Genau dës Ausgrenzung mécht se nëtzlech fir de Verglach.

Zielt d’Hin-an-zeréck-Reesen, net nëmmen d’Millisekonnen

E Rapport aus zweehonnert klengen ofhängegen Uweisungen multiplizéiert all Latenz, déi de Wee bäisetzt, mat zweehonnert. Eng eenzeg Uweisung, déi eng Millioun Reien zréckgëtt, bezuelt déi Latenz eng Kéier an duerno laang Bandbreed. Béid gesinn an engem Client-Timer identesch aus, an si brauchen entgéintgesate Korrekturen.

Misst d’Zuel vun den Uweisungen, anstatt se ze schätzen. Liest den Total, féiert de Rapport eng Kéier aus, liest en dann nach eng Kéier a subtrahéiert.

select sum(calls) as calls from pg_stat_statements;
-- run the report here
select sum(calls) as calls from pg_stat_statements;

Wann den Delta grouss ass an all Uweisung um Server bëlleg ass, ass Batchen d’Korrektur, déi sech bezilt. Kombinéiert ofhängeg Queryen, benotzt eng eenzeg set-baséiert Uweisung oder féiert d’Schleif vun engem Cursor. An interaktive psql, \set FETCH_COUNT 1000 kënnt e grousst Resultat a Batchen un an et ännert, wéi sech den Iwwerdroe an de Client-Speicher verhalen. Et reduzéiert keng Serveraarbecht, also rett et eng lues Query net.

Kuckt den Tunnel op Neisendungen an MTU-Stoppen

Wann kleng Uweisungen séier sinn an grouss Resultater hallefweegs stoppen, ass d’Query meeschtens an der Rei an de Wee net. En Tunnel, deem seng MTU manner ass wéi de Grondlink, zesumme mat blockéiertem ICMP, produzéiert genau dat Muster: déi éischt Pakete kommen un, déi grouss verschwannen, an den Iwwerdroe hänkt, bis en et nach eng Kéier versicht. Neisendungszieler op der Client-Säit weisen et.

Kuckt de Socket an d’Kär-Zieler, wärend en absichtlech luesen Iwwerdroe leeft. Neisendungssumme sinn kumulativ, also notéiert se virun a duerno, anstatt eng eenzeg Probe ze liesen.

ss -tin dst 10.40.0.12
netstat -s | grep -iE "retransmit|segments retransmitted"
ping -M do -s 1400 -c 3 10.40.0.12

Neisendungen, déi wärend dem Iwwerdroe klammen, zesumme mat engem ping, dee bei 1400 Byte geléngt, awer bei 1472 feelt, weisen op en MTU-Problem an net op en Datebankproblem. D’MTU vum Tunnel-Interface erofsetzen oder MSS um Gateway klemmen ass déi üblech Korrektur, an déiselwecht dräi Kommandoen bestätegen se duerno. Wann d’Neisendungen flaach bleiwen, wärend den Iwwerdroe nach lues ass, kuckt op d’Bandbreed, déi den Tunnel däerf, an net op Verloscht.

Eng kuerz Sequenz deckt den nächsten luesen Rapport: vergläicht eng Uweisung lokal, am LAN an iwwer d’VPN; liest d’Server-Ausféierung aus EXPLAIN oder pg_stat_statements; zielt Opruff virun an no engem Laf; a kuckt Neisendungen, wärend dat grousst Resultat sech beweegt. All Schrëtt schléisst eng Säit vum Wee aus. Keen dovun erfuerdert ze roden, wéi eng Komponent nei ze starten ass.

Ähnlech Artikelen