Сиздин отчет маалымат базасынын хостунда болжол менен бир секундада жана VPN аркылуу төрттө бүтөт, ал эми psql басып чыгарган сан түздөн-түз маалымат базасын көрсөтөт. Бул сан кардар тараптагы секунд өлчөгүч, сервердин өлчөмү эмес. Ал билдирүүнүн сыртка чыгуу жолун, жооп күтүүнү жана кайтып келген саптарды камтыйт. Ушул үчөөнү бөлүү гана кайсы тарапты жөндөө керектигин билүүнүн жалгыз жолу.

psql таймери чындыгында эмнени өлчөйт

\timing on кардар билдирүүнү сокетке жазганга чейин эле секунд өлчөгүчтү иштетип, ошол жыйынтыктын акыркы сабы окулганда токтотот. Сервердин өзүнүн аткарылышы ошол терезедин ичинде бир жерде, ошондой эле пакеттер туннелде өткөргөн ар бир миллисекунд да. Чыгарылышта эч нерсе аларды ажыратпайт. EXPLAIN да санды басып чыгарат, бирок аны сервер жасайт жана кардардын күтүүсүн эсепке албайт. Эки сан, эки башка суроо.

Бир сессияны баштаңыз, убакыт өлчөөнү күйүк тутуңуз жана керектүү билдирүүнү анын ичинен аткарыңыз. Сессияны кайра колдонуу туташуу наркын биринчи өлчөмдөн тышкары калтырат.

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

Сан дагы эле жыйынтыкты өткөрүүнү камтыйт, бул ушул жерде керек нерсе. Ал жаңы чакыруу кошочу туташуу жана аутентификация алмашуусун мындан ары камтыбайт.

Бир билдирүүнү үч жол менен салыштырыңыз

Ошол эле билдирүүнү Unix сокети, LAN дареги жана VPN хост аты аркылуу аткарып, үчөөнү салыштырыңыз. Эгер акыркысы гана жай болсо, суроо өзгөрмө эмес.

Ар бир чакыруу адегенде туташат, анан гана билдирүүнү өлчөйт, ошондуктан туташуу наркы сандан тышкары калат, ал эми өткөрүү анын ичинде калат. WHERE бөлүгүн, сап санын жана кардар машинасын бирдей кармаңыз, болбосо жолдорду эмес, иш жүктөрүн салыштырасыз.

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 ичинде айырма адатта этибарга албасак боло тургандай кичине; VPN аркылуу көп учурда андай эмес. Үч жыйынтыкты иреттөө кийин кайсы күтүүгө кол салуу керектигин айтат.

Жай жергиликтүү сокет сервердин ишин же пландоону билдирет. Жай LAN жыйынтыгы суроону же анын жылдырган көлөмүн билдирет. VPN жыйынтыгы гана жай болушу жолдогу кечигүүнү, MTU же жеткиликтүү өткөрүү жөндөмүн билдирет, жана эч бир индекстин өзгөрүшү аны оңдобойт.

Сервердин өзүнүн аткаруу убактысын алыңыз

Сервер канча убакыт сарптаганын билдире алат, жана кардардын санына салыштырылуучу сан ошол. EXPLAIN ANALYZE менен билдирүүнү аткарат жана пландын ичинде пландоо жана аткаруу убактысын басып чыгарат, ал эми BUFFERS жылуу жүгүртүүнү муздак жүгүртүүгө каршы көп түшүндүргөн кэш жүрүм-турумун кошот. Жазуу ниетиңиз жок болсо, аны жазуу билдирүүлөрүнө багыттабаңыз. Окууга гана арналган көчүрмөдө бул баштоонун эң коопсуз жери, жана psql маалымдамасы таймердин кардар тарабындагы аймагын документтештирет.

Колдонмо мурунтан аткарган билдирүүлөр үчүн pg_stat_statements эч нерсени кайра иштетпей эле сервер тарабындагы аткарууну жыйнайт. Саптар нормалдаштырылган суроо боюнча, ошондуктан бир жазуу бир нече чакыруу ордун камтый алат.

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

Баган аттары чыгарылышка жараша ар башка: PostgreSQL 13 жана андан кийинкилер mean_exec_time көрсөтөт, эски версиялар аны mean_time деп атайт, ошондуктан текшериңиз \d pg_stat_statements, эгер бул суроо ката берсе. Бул маанилер пландоону жана сиздин кардарыңызга чейинки сапарды камтыбайт. Так ошол тышкары калтыруу аларды салыштыруу үчүн пайдалуу кылат.

Барып-кайтууларды санаңыз, миллисекунддарды гана эмес

Эки жүз кичине көз каранды билдирүүдөн курулган отчет жол кошкон ар кандай кечигүүнү эки жүзгө көбөйтөт. Миллион сап кайтарган бир билдирүү ошол кечигүүнү бир жолу төлөп, анан узак убакыт өткөрүү жөндөмүн төлөйт. Экөө тең кардар таймеринде бирдей көрүнөт, жана аларга карама-каршы түзөтүүлөр керек.

Билдирүүлөрдүн санын болжолдобой өлчөңүз. Жалпыны окуңуз, отчетту бир жолу аткарыңыз, анан кайра окуп кемитиңиз.

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

Эгер дельта чоң болсо жана ар бир билдирүү серверде арзан болсо, топтоштуруу — төлөнүүчү түзөтүү. Көз каранды суроолорду бириктириңиз, бир жыйындыга негизделген билдирүү колдонуңуз же циклди курсордон башкарыңыз. Интерактивдүү psql ичинде, \set FETCH_COUNT 1000 чоң жыйынтык топтомдор менен келүүгө мажбурлайт жана өткөрүү менен кардардын эстутумунун жүрүм-турумун өзгөртөт. Ал сервердин ишин азайтпайт, ошондуктан жай суроону куткарбайт.

Туннелди кайра жөнөтүүлөр жана MTU токтоп калуулар боюнча текшериңиз

Кичине билдирүүлөр тез, ал эми чоң жыйынтыктар жарым жолдо токтоп калса, суроо адатта тартибинде, ал эми жол андай эмес. MTU негизги звенодон төмөн туннель бөгөттөлгөн ICMP менен бирге так ошол үлгүнү жаратат: алгачкы пакеттер келет, чоңдору жоголот, жана өткөрүү кайра аракет кылганга чейин илинип турат. Кардар тарабындагы кайра жөнөтүү эсептегичтери муну көрсөтөт.

Атайын жай өткөрүү жүрүп жатканда сокетти жана ядро эсептегичтерин көзөмөлдөңүз. Кайра жөнөтүү суммалары топтолот, ошондуктан бир үлгүнү окуунун ордуна аларды мурун жана кийин жазып алыңыз.

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

Өткөрүү учурунда өсүп жаткан кайра жөнөтүүлөр, 1400 байтта ийгиликтүү болуп 1472де ийгиликсиз болгон ping менен бирге, маалымат базасынын эмес, MTU маселесин көрсөтөт. Туннел интерфейсинин MTUсун төмөндөтүү же шлюзда MSSти кысуу — адаттагы түзөтүү, жана ошол үч буйрук муну кийин ырастайт. Эгер өткөрүү дагы жай болуп турганда кайра жөнөтүүлөр тегиз калса, жоготууга эмес, туннелге уруксат берилген өткөрүү жөндөмүнө караңыз.

Кыска ырааттуулук кийинки жай отчетту камтыйт: бир билдирүүнү жергиликтүү, LANда жана VPN аркылуу салыштырыңыз; сервердин аткарылышын EXPLAIN же pg_stat_statementsтен окуңуз; бир жолу иштетүүнүн алдында жана кийин чакырууларды санаңыз; жана чоң жыйынтык кыймылдап жатканда кайра жөнөтүүлөрдү көзөмөлдөңүз. Ар бир кадам жолдун бир тарабын жокко чыгарат. Алардын эч бири кайсы компонентти кайра иштетүүнү болжолдоону талап кылбайт.

Тектеш макалалар