psql-en denbora neurtzea VPN baten bidez: sareko itxaronaldia kontsultaren lanetik bereiztea
psql-ek denbora-balio bakarra ematen du adierazpen bakoitzeko, beraz VPN geldoak handitu egiten du. Bereizi konexio-, exekuzio-, transferentzia- eta joan-etorriko denbora alde bietako edozein doitu aurretik.
Zure txostena segundu batean amaitzen da datu-basearen ostalarian eta lauretan VPN bidez, eta psql-ek inprimatzen duen zenbakiak zuzenean datu-baseari seinalatzen dio. Zenbaki hori bezeroaren aldeko kronometroa da, ez zerbitzariaren neurketa. Adierazpena irteerako bidean, erantzunaren zain egotea eta itzulerako ilarak hartzen ditu. Hiru horiek bereiztea da alde bat edo bestea doitzeko modu bakarra.
Zer neurtzen du benetan psql-ren tenporizadoreak
\timing on kronometro bat abiatzen du bezeroak adierazpena socket-era idatzi baino justu lehenago, eta emaitza horren azken ilara irakurri denean gelditzen du. Zerbitzariaren exekuzioa leiho horren barruan dago nonbait, eta paketeek tunelen igarotzen duten milisegundo bakoitza ere bai. Irteeran ezerk ez ditu bereizten. EXPLAIN-ek zenbaki bat ere inprimatzen du, baina hura zerbitzariak sortzen du eta bezeroaren itxaronaldia baztertzen du. Bi zenbaki, bi galdera desberdin.
Hasi saio bat, utzi denbora-neurketa piztuta, eta exekutatu axola zaizun adierazpena haren barrualdetik. Saio bat berrerabiltzeak konexio-kostua lehen neurtetik kanpo uzten du.
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';"Zifrak emaitzaren transferentzia barne hartzen du oraindik, eta hori da hemen nahi duzuna. Jada ez du barne hartzen deialdi berri batek gehituko lukeen konexio- eta autentifikazio-trukea.
Konparatu adierazpen bat hiru bidetatik
Exekutatu adierazpen bera Unix socketaren, LAN helbidearen eta VPN ostalari-izenaren bidez, eta konparatu hirurak. Azkena soilik motela bada, kontsulta ez da aldagaia.
Deialdi bakoitzak lehenengo konektatzen du eta gero bakarrik neurtzen du adierazpena, beraz konexio-kostua zenbakitik kanpo geratzen da transferentzia barruan dagoen bitartean. Eutsi WHERE klausula, ilara-kopurua eta bezero-makina berdinak, bestela lan-kargak konparatzen ari zara, ez bideak.
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;"LAN batean aldea normalean nahikoa txikia da ez ikusteko; VPN bidez askotan ez. Hiru emaitzak ordenatzeak zer itxaronaldi eraso esaten dizu gero.
Socket lokal motelak zerbitzariaren lana edo plangintza esan nahi du. LAN emaitza motelak kontsulta edo mugitzen duen bolumena esan nahi du. VPN emaitza soilik motela izateak latentzia, MTU edo bidean dagoen banda-zabalera erabilgarria esan nahi du, eta inongo indize-aldaketak ez du hori konpontzen.
Atera zerbitzariaren beraren exekuzio-denbora
Zerbitzariak zenbat denbora eman duen jakinaraz dezake, eta zenbaki hori da bezeroarenaren aurka jarri behar dena. EXPLAIN ANALYZE-rekin adierazpena exekutatzen du eta plangintza- eta exekuzio-denbora inprimatzen ditu planaren barruan, eta BUFFERS-ek cache-portaera gehitzen du, sarritan exekuzio epel bat hotz baten aurrean azaltzen duena. Ez zuzendu idazketa-adierazpenetara idazteko asmorik ez baduzu. Irakurtzeko soilik den erreplika batean hasteko lekurik seguruena da, eta psql erreferentzia tenporizadorearen bezero-aldeko irismena dokumentatzen du.
Aplikazioak jada exekutatzen dituen adierazpenetarako, pg_stat_statements-ek zerbitzari-aldeko exekuzioa biltzen du ezer berriro exekutatu gabe. Ilarak kontsulta normalizatu bakoitzeko dira, beraz sarrera batek hainbat deialdi-leku estal ditzake.
select calls, round(mean_exec_time::numeric, 2) as mean_ms, rows
from pg_stat_statements
order by mean_exec_time desc
limit 5;Zutabe-izenak bertsioaren arabera aldatzen dira: PostgreSQL 13 eta berriagoek mean_exec_time erakusten dute, bertsio zaharrek mean_time deitzen diote, beraz egiaztatu \d pg_stat_statements erabiliz, kontsulta horrek errorea ematen badu. Balio hauek plangintza baztertzen dute eta zure bezerorako bidaia baztertzen dute. Bazterketa hori da hain zuzen konparaketarako erabilgarri egiten dituena.
Zenbatu joan-etorriak, ez soilik milisegundoak
Berrehun adierazpen txiki mendekoz osatutako txosten batek bideak gehitzen duen latentzia edozein berrehun bider biderkatzen du. Milioi bat ilara itzultzen dituen adierazpen bakar batek latentzia hori behin ordaintzen du eta gero banda-zabalera luze ordaintzen du. Biek berdin dirudite bezero-tenporizadore batean, eta kontrako konponketak behar dituzte.
Neurtu adierazpen-kopurua, ez estimatu. Irakurri guztirakoa, exekutatu txostena behin, gero irakurri berriro eta kendu.
select sum(calls) as calls from pg_stat_statements;
-- run the report here
select sum(calls) as calls from pg_stat_statements;Delta handia bada eta adierazpen bakoitza zerbitzarian merkea bada, sortakatzea da ordaintzen duen konponketa. Konbinatu mendeko kontsultak, erabili multzoan oinarritutako adierazpen bakarra, edo gidatu begizta kurtsoretik. psql interaktiboan, \set FETCH_COUNT 1000 emaitza handia sortetan iristen da, eta aldatu egiten du transferentziak eta bezeroaren memoriak duten portaera. Ez du zerbitzariaren lana murrizten, beraz ez du kontsulta motel bat salbatuko.
Egiaztatu tunela berbidalketen eta MTU geldialdien bila
Adierazpen txikiak azkarrak direnean eta emaitza handiak erdibidean trabatzen direnean, kontsulta normalean ondo dago eta bidea ez. MTU azpiko esteka baino txikiagoa duen tunel batek, ICMP blokeatuarekin batera, eredu hori bera sortzen du: lehen paketeak iristen dira, handiak desagertu egiten dira, eta transferentzia zintzilik geratzen da berriro saiatu arte. Bezero-aldeko berbidalketa-kontagailuek erakusten dute.
Begiratu socketa eta kernelaren kontagailuak nahita motela den transferentzia bat exekutatzen ari den bitartean. Berbidalketa-batuketak metagarriak dira, beraz idatzi itzazu aurretik eta ondoren, lagin bakarra irakurri beharrean.
ss -tin dst 10.40.0.12
netstat -s | grep -iE "retransmit|segments retransmitted"
ping -M do -s 1400 -c 3 10.40.0.12Transferentzian zehar igotzen diren berbidalketek, 1400 byteetan arrakastatsua baina 1472tan huts egiten duen ping batekin batera, MTU arazo bati seinalatzen diote, ez datu-base arazo bati. Tunelaren interfazearen MTU jaistea edo MSS atean muxikatzea da ohiko konponketa, eta hiru komando berberek berresten dute gero. Berbidalketek lau jarraitzen badute transferentzia oraindik motela delarik, begiratu tunelari baimendutako banda-zabalera, ez galera.
Segida labur batek hurrengo txosten motela estaltzen du: konparatu adierazpen bat lokalean, LANean eta VPN bidez; irakurri zerbitzariaren exekuzioa EXPLAIN edo pg_stat_statements-etik; zenbatu deialdiak exekuzio baten aurretik eta ondoren; eta begiratu berbidalketak emaitza handia mugitzen den bitartean. Urrats bakoitzak bidearen alde bat baztertzen du. Horietako batek ere ez du eskatzen zein osagai berrabiarazi asmatzea.