Mae eich adroddiad yn gorffen mewn tua eiliad ar y gwesteiwr cronfa ddata a phedair dros y VPN, ac mae'r rhif y mae psql yn ei argraffu yn pwyntio'n syth at y gronfa ddata. Stopwats ochr y cleient yw'r rhif hwnnw, nid mesuriad gweinydd. Mae'n cwmpasu'r datganiad ar ei ffordd allan, yr aros am ateb, a'r rhesi ar eu ffordd yn ôl. Gwahanu'r tri hynny yw'r unig ffordd i wybod pa ochr i'w addasu.

Beth mae amserydd psql yn ei fesur mewn gwirionedd

\timing on yn cychwyn stopwats ychydig cyn i'r cleient ysgrifennu'r datganiad i'r soced ac yn stopio pan fydd rhes olaf y canlyniad hwnnw wedi'i darllen. Mae gweithrediad y gweinydd ei hun yn rhywle o fewn y ffenestr honno, a phob milieiliad y mae'r pecynnau'n ei dreulio yn y twnnel hefyd. Nid oes dim yn yr allbwn yn eu gwahanu. Mae EXPLAIN hefyd yn argraffu rhif, ond mae'r gweinydd yn cynhyrchu hwnnw ac mae'n eithrio aros y cleient. Dau rif, dau gwestiwn gwahanol.

Dechreuwch un sesiwn, gadewch amseru ymlaen, a rhedwch y datganiad sydd o bwys i chi o'i mewn. Mae ailddefnyddio sesiwn yn cadw cost cysylltu allan o'r mesuriad cyntaf.

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';"

Mae'r ffigur yn dal i gynnwys trosglwyddo'r canlyniad, sef yr hyn rydych chi ei eisiau yma. Nid yw'n cynnwys y gyfnewid cysylltu a dilysu y byddai galwad newydd yn ei hychwanegu.

Cymharwch un datganiad ar draws tri llwybr

Rhedwch yr un datganiad dros soced Unix, dros gyfeiriad LAN a dros enw gwesteiwr VPN, a chymharwch y tri. Os mai dim ond yr olaf sy'n araf, nid yr ymholiad yw'r newidyn.

Mae pob galwad yn cysylltu'n gyntaf ac yna'n amseru'r datganiad, felly mae cost cysylltu'n aros allan o'r rhif tra bo'r trosglwyddo'n aros i mewn. Cadwch y cymal WHERE, y cyfrif rhesi a'r peiriant cleient yr un fath, neu rydych chi'n cymharu llwythi gwaith yn lle llwybrau.

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;"

Ar LAN mae'r gwahaniaeth fel arfer yn ddigon bach i'w anwybyddu; dros VPN yn aml nid yw. Mae trefnu'r tri chanlyniad wedyn yn dweud wrthych pa aros i ymosod arno.

Mae soced lleol araf yn golygu gwaith gweinydd neu gynllunio. Mae canlyniad LAN araf yn golygu'r ymholiad neu'r gyfrol y mae'n ei symud. Dim ond canlyniad VPN araf sy'n golygu oedi, MTU neu led band ar gael ar y llwybr, ac nid oes unrhyw newid mynegai yn datrys hynny.

Tynnwch amser gweithredu'r gweinydd ei hun

Gall y gweinydd adrodd faint o amser a dreuliodd, a dyna'r ffigur i'w ddal yn erbyn un y cleient. Mae EXPLAIN gydag ANALYZE yn rhedeg y datganiad ac yn argraffu amser cynllunio a gweithredu o fewn y cynllun, tra bo BUFFERS yn ychwanegu ymddygiad cach sy'n aml yn esbonio rhediad cynnes yn erbyn un oer. Peidiwch â'i anelu at ddatganiadau ysgrifennu oni bai eich bod yn bwriadu ysgrifennu. Ar replica darllen yn unig dyma'r lle mwyaf diogel i ddechrau, ac mae'r cyfeirlyfr psql yn dogfennu sgôp yr amserydd ar ochr y cleient.

Ar gyfer datganiadau y mae'r cymhwysiad yn eu rhedeg eisoes, mae pg_stat_statements yn crynhoi gweithrediad ochr y gweinydd heb ailredeg unrhyw beth. Mae'r rhesi fesul ymholiad wedi'i normaleiddio, felly gall un cofnod gwmpasu sawl man galw.

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

Mae enwau colofnau'n amrywio yn ôl rhyddhau: mae PostgreSQL 13 a hwyrach yn dangos mean_exec_time, tra bo fersiynau hŷn yn ei alw'n mean_time, felly gwiriwch gyda \d pg_stat_statements os yw'r ymholiad hwnnw'n rhoi gwall. Mae'r gwerthoedd hyn yn eithrio cynllunio ac yn eithrio'r daith i'ch cleient. Yr eithriad hwnnw yn union yw'r rheswm eu bod yn ddefnyddiol ar gyfer y gymhariaeth.

Cyfrifwch deithiau mynd a dod, nid milieiliadau yn unig

Mae adroddiad wedi'i adeiladu o ddau gant o ddatganiadau bach dibynnol yn lluosi pa bynnag oedi y mae'r llwybr yn ei ychwanegu â dau gant. Mae un datganiad sy'n dychwelyd miliwn o resi yn talu'r oedi hwnnw unwaith ac yna'n talu lled band am amser hir. Mae'r ddau yn edrych yn union yr un fath mewn amserydd cleient, ac mae arnynt angen cywiriadau cyferbyniol.

Mesurwch y cyfrif datganiadau yn lle ei amcangyfrif. Darllenwch y cyfanswm, rhedwch yr adroddiad unwaith, yna darllenwch ef eto a thynnwch.

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

Os yw'r delta yn fawr ac mae pob datganiad yn rhad ar y gweinydd, batching yw'r cywiriad sy'n talu. Cyfunwch ymholiadau dibynnol, defnyddiwch un datganiad sy'n seiliedig ar setiau, neu gyflwynwch y ddolen o gwrser. Mewn psql rhyngweithiol, \set FETCH_COUNT 1000 yn gwneud i ganlyniad mawr gyrraedd mewn sypynnau ac yn newid sut mae'r trosglwyddo a chof y cleient yn ymddwyn. Nid yw'n lleihau gwaith y gweinydd, felly ni fydd yn achub ymholiad araf.

Archwiliwch y twnnel am ail-drosglwyddiadau a thagfeydd MTU

Pan fo datganiadau bach yn gyflym ac mae canlyniadau mawr yn stopio hanner ffordd, mae'r ymholiad fel arfer yn iawn ac nid yw'r llwybr. Mae twnnel y mae ei MTU yn is na'r cyswllt sylfaenol, ynghyd ag ICMP wedi'i rwystro, yn cynhyrchu'r patrwm hwnnw'n union: mae'r pecynnau cyntaf yn cyrraedd, mae'r rhai mawr yn diflannu, ac mae'r trosglwyddo'n hongian nes iddo geisio eto. Mae cownteri ail-drosglwyddo ochr y cleient yn dangos hyn.

Gwyliwch y soced a chownteri'r cnewyllyn tra bo trosglwyddo araf bwriadol yn rhedeg. Mae cyfansymiau ail-drosglwyddo yn gronnus, felly nodwch hwy cyn ac ar ôl yn lle darllen un sampl.

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

Mae ail-drosglwyddiadau sy'n codi yn ystod y trosglwyddo, ynghyd â ping sy'n llwyddo ar 1400 beit ond yn methu ar 1472, yn awgrymu problem MTU yn hytrach na phroblem cronfa ddata. Gostwng MTU rhyngwyneb y twnnel neu glampio MSS yn y porth yw'r cywiriad arferol, ac mae'r un tri gorchymyn yn ei gadarnhau wedyn. Os yw ail-drosglwyddiadau'n aros yn wastad tra bo'r trosglwyddo'n dal yn araf, edrychwch ar y lled band a ganiateir i'r twnnel yn hytrach na'r golled.

Mae dilyniant byr yn cwmpasu'r adroddiad araf nesaf: cymharwch un datganiad yn lleol, ar y LAN a dros y VPN; darllenwch weithrediad y gweinydd o EXPLAIN neu pg_stat_statements; cyfrifwch alwadau cyn ac ar ôl un rhediad; a gwyliwch ail-drosglwyddiadau tra bo'r canlyniad mawr yn symud. Mae pob cam yn diystyru un ochr o'r llwybr. Nid oes yr un ohonynt yn gofyn dyfalu pa gydran i'w hailgychwyn.

Erthyglau cysylltiedig