27.5. ÐинамиÑеÑÐºÐ°Ñ ÑÑаÑÑиÑовка
Postgres Pro позволÑÐµÑ Ð²ÑполнÑÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑкÑÑ ÑÑаÑÑиÑÐ¾Ð²ÐºÑ ÑеÑвеÑа Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐмеÑÑиеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи позволÑÑÑ Ð²ÑзÑваÑÑ Ð²Ð½ÐµÑнÑÑ ÑÑилиÑÑ Ð² опÑеделÑннÑÑ ÑоÑÐºÐ°Ñ ÐºÐ¾Ð´Ð° и Ñаким обÑазом оÑÑлеживаÑÑ ÐµÐ³Ð¾ вÑполнение.
ÐеÑколÑко подобнÑÑ ÑоÑек ÑбоÑа меÑÑик, или ÑоÑек ÑÑаÑÑиÑовки, Ñже вÑÑÑоено в иÑÑ Ð¾Ð´Ð½Ñй код. ÐÑедполагаеÑÑÑ, ÑÑо ÑÑи ÑоÑки бÑдÑÑ Ð¸ÑполÑзоваÑÑÑÑ ÑазÑабоÑÑиками и админиÑÑÑаÑоÑами Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑоÑки ÑÑаÑÑиÑовки не Ð²Ñ Ð¾Ð´ÑÑ Ð² ÑбоÑÐºÑ Postgres Pro; полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ Ñвно ÑказаÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ð¾Ð½Ð½Ð¾Ð¼Ñ ÑкÑипÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ ÑÑÐ¸Ñ Ð¼Ð°ÐºÑоÑов.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаеÑÑÑ ÑолÑко ÑÑилиÑа DTrace, коÑоÑÐ°Ñ Ð´Ð¾ÑÑÑпна Ð´Ð»Ñ Solaris, OS X, FreeBSD, NetBSD и Oracle Linux. ÐÑÐ¾ÐµÐºÑ SystemTap Ð´Ð»Ñ Linux пÑедÑÑавлÑÐµÑ Ñобой ÑÐºÐ²Ð¸Ð²Ð°Ð»ÐµÐ½Ñ DTrace и Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован. ТеоÑеÑиÑеÑки возможна поддеÑжка и дÑÑгиÑ
ÑÑÐ¸Ð»Ð¸Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑкой ÑÑаÑÑиÑовки, Ð´Ð»Ñ ÑÑого необÑ
одимо измениÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¼Ð°ÐºÑоÑа в src/include/utils/probes.h.
27.5.1. ÐомпилÑÑÐ¸Ñ Ð´Ð»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑкой ÑÑаÑÑиÑовки
Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑоÑки ÑÑаÑÑиÑовки недоÑÑÑпнÑ, поÑÑÐ¾Ð¼Ñ Ð² конÑигÑÑаÑионном ÑкÑипÑе Postgres Pro ÑÑебÑеÑÑÑ Ñвно ÑказаÑÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑÑ Ð¸Ñ
подклÑÑениÑ. ÐÐ»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки ÑÑилиÑÑ DTrace ÑкажиÑе --enable-dtrace пÑи конÑигÑÑиÑовании.
27.5.2. ÐÑÑÑоеннÑе ÑоÑки ÑÑаÑÑиÑовки
РиÑÑ Ð¾Ð´Ð½Ñй код Ð²Ñ Ð¾Ð´Ð¸Ñ Ð½ÐµÑколÑко ÑÑандаÑÑнÑÑ ÑоÑек ÑÑаÑÑиÑовки, коÑоÑÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² ТаблиÑе 27.22; в ТаблиÑе 27.23 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , коÑоÑÑе иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ ÑÑÐ¸Ñ ÑоÑек. ÐонеÑно, Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ деÑалÑного оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÑабоÑÑ Postgres Pro можно добавлÑÑÑ Ð¸ дÑÑгие ÑоÑки ÑÑаÑÑиÑовки.
ТаблиÑа 27.22. ÐÑÑÑоеннÑе ÑоÑки ÑÑаÑÑиÑовки DTrace
| ÐÐ¼Ñ | ÐаÑамеÑÑÑ | ÐпиÑание |
|---|---|---|
transaction-start | (LocalTransactionId) | СÑабаÑÑÐ²Ð°ÐµÑ Ð² наÑале новой ÑÑанзакÑии. arg0 задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑÑанзакÑии. |
transaction-commit | (LocalTransactionId) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ñи ÑÑпеÑном завеÑÑении ÑÑанзакÑии. arg0 задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑÑанзакÑии. |
transaction-abort | (LocalTransactionId) | СÑабаÑÑваеÑ, когда ÑÑанзакÑÐ¸Ñ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ Ñ Ð¾Ñибкой. arg0 задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑÑанзакÑии. |
query-start | (const char *) | СÑабаÑÑваеÑ, когда наÑинаеÑÑÑ Ð¾Ð±ÑабоÑка запÑоÑа. arg0 задаÑÑ ÑекÑÑ Ð·Ð°Ð¿ÑоÑа. |
query-done | (const char *) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении обÑабоÑки запÑоÑа. arg0 задаÑÑ ÑекÑÑ Ð·Ð°Ð¿ÑоÑа. |
query-parse-start | (const char *) | СÑабаÑÑваеÑ, когда наÑинаеÑÑÑ ÑÐ°Ð·Ð±Ð¾Ñ Ð·Ð°Ð¿ÑоÑа. arg0 задаÑÑ ÑекÑÑ Ð·Ð°Ð¿ÑоÑа. |
query-parse-done | (const char *) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении ÑазбоÑа (parsing) запÑоÑа. arg0 задаÑÑ ÑекÑÑ Ð·Ð°Ð¿ÑоÑа. |
query-rewrite-start | (const char *) | СÑабаÑÑваеÑ, когда наÑинаеÑÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑа. arg0 задаÑÑ ÑекÑÑ Ð·Ð°Ð¿ÑоÑа. |
query-rewrite-done | (const char *) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении модиÑикаÑии запÑоÑа. arg0 задаÑÑ ÑекÑÑ Ð·Ð°Ð¿ÑоÑа. |
query-plan-start | () | СÑабаÑÑваеÑ, когда наÑÐ¸Ð½Ð°ÐµÑ ÑабоÑаÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑик вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. |
query-plan-done | () | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении ÑабоÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑика запÑоÑа. |
query-execute-start | () | СÑабаÑÑваеÑ, когда наÑинаеÑÑÑ Ð²Ñполнение запÑоÑа. |
query-execute-done | () | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. |
statement-status | (const char *) | СÑабаÑÑÐ²Ð°ÐµÑ ÐºÐ°Ð¶Ð´Ñй Ñаз, когда ÑеÑвеÑнÑй пÑоÑеÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑÐµÑ Ñвой ÑÑаÑÑÑ Ð² pg_stat_activity.status. arg0 задаÑÑ Ð½Ð¾Ð²ÑÑ ÑÑÑÐ¾ÐºÑ ÑоÑÑоÑниÑ. |
checkpoint-start | (int) | СÑабаÑÑÐ²Ð°ÐµÑ Ð² наÑале конÑÑолÑной ÑоÑки. arg0 ÑодеÑÐ¶Ð¸Ñ Ð±Ð¸ÑовÑе Ñлаги, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾ÑоÑÑÑ Ð·Ð°Ð´Ð°ÑÑÑÑ ÑазнÑе ÑÐ¸Ð¿Ñ ÐºÐ¾Ð½ÑÑолÑнÑÑ ÑоÑек, Ñакие как shutdown, immediate или force. |
checkpoint-done | (int, int, int, int, int) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении конÑÑолÑной ÑоÑки. (ÐеÑеÑиÑленнÑе далее ÑоÑки ÑÑаÑÑиÑовки ÑÑабаÑÑваÑÑ Ð¿Ð¾ÑледоваÑелÑно пÑи обÑабоÑке конÑÑолÑной ÑоÑки.) arg0 задаÑÑ ÑиÑло запиÑаннÑÑ Ð±ÑÑеÑов. arg1 â обÑее ÑиÑло бÑÑеÑов. arg2, arg3 и arg4 задаÑÑ ÑиÑло Ñайлов WAL, коÑоÑÑе бÑли добавленÑ, ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð¸Ð»Ð¸ пеÑеÑабоÑанÑ, ÑооÑвеÑÑÑвенно. |
clog-checkpoint-start | (bool) | СÑабаÑÑваеÑ, когда наÑинаеÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки в CLOG. arg0 = true Ð´Ð»Ñ Ð¾Ð±ÑÑнÑÑ ÐºÐ¾Ð½ÑÑолÑнÑÑ ÑоÑек и false Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑолÑнÑÑ ÑоÑек Ñипа shutdown. |
clog-checkpoint-done | (bool) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении запиÑи конÑÑолÑной ÑоÑки в CLOG. ÐнаÑение arg0 задаÑÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ clog-checkpoint-start. |
subtrans-checkpoint-start | (bool) | СÑабаÑÑваеÑ, когда наÑинаеÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки в SUBTRANS. arg0 = true Ð´Ð»Ñ Ð¾Ð±ÑÑнÑÑ ÐºÐ¾Ð½ÑÑолÑнÑÑ ÑоÑек и false Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑолÑнÑÑ ÑоÑек Ñипа shutdown. |
subtrans-checkpoint-done | (bool) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении запиÑи конÑÑолÑной ÑоÑки в SUBTRANS. ÐнаÑение arg0 задаÑÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ subtrans-checkpoint-start. |
multixact-checkpoint-start | (bool) | СÑабаÑÑваеÑ, когда наÑинаеÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки в MultiXact. arg0 = true Ð´Ð»Ñ Ð¾Ð±ÑÑнÑÑ ÐºÐ¾Ð½ÑÑолÑнÑÑ ÑоÑек и false Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑолÑнÑÑ ÑоÑек Ñипа shutdown. |
multixact-checkpoint-done | (bool) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении запиÑи конÑÑолÑной ÑоÑки в MultiXact. ÐнаÑение arg0 задаÑÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ multixact-checkpoint-start. |
buffer-checkpoint-start | (int) | СÑабаÑÑваеÑ, когда наÑинаеÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð±ÑÑеÑов конÑÑолÑной ÑоÑки. arg0 ÑодеÑÐ¶Ð¸Ñ Ð±Ð¸ÑовÑе Ñлаги, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾ÑоÑÑÑ Ð·Ð°Ð´Ð°ÑÑÑÑ ÑазнÑе ÑÐ¸Ð¿Ñ ÐºÐ¾Ð½ÑÑолÑнÑÑ ÑоÑек, Ñакие как shutdown, immediate или force. |
buffer-sync-start | (int, int) | СÑабаÑÑÐ²Ð°ÐµÑ Ð²Ð¾ вÑÐµÐ¼Ñ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки, когда наÑинаеÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð³ÑÑзнÑÑ Ð±ÑÑеÑов (поÑле Ð½Ð°Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±ÑÑеÑов, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð·Ð°Ð¿Ð¸ÑанÑ). arg0 задаÑÑ Ð¾Ð±Ñее ÑиÑло бÑÑеÑов. arg1 задаÑÑ ÑиÑло бÑÑеÑов, коÑоÑÑе в наÑÑоÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑвлÑÑÑÑÑ Ð³ÑÑзнÑми и Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð·Ð°Ð¿Ð¸ÑанÑ. |
buffer-sync-written | (int) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾Ñле запиÑи каждого бÑÑеÑа пÑи вÑполнении конÑÑолÑной ÑоÑки. arg0 задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð±ÑÑеÑа. |
buffer-sync-done | (int, int, int) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾Ñле запиÑи вÑеÑ
гÑÑзнÑÑ
бÑÑеÑов. arg0 задаÑÑ Ð¾Ð±Ñее ÑиÑло бÑÑеÑов. arg1 задаÑÑ ÑиÑло бÑÑеÑов, коÑоÑÑе ÑакÑиÑеÑки бÑли запиÑÐ°Ð½Ñ Ð¿ÑоÑеÑÑом вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки. arg2 задаÑÑ ÑиÑло бÑÑеÑов, коÑоÑое должно бÑло бÑÑÑ Ð·Ð°Ð¿Ð¸Ñано (arg1 из buffer-sync-start); ÑазнÑе знаÑÐµÐ½Ð¸Ñ Ð³Ð¾Ð²Ð¾ÑÑÑ Ð¾ Ñом, ÑÑо во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑой конÑÑолÑной ÑоÑки бÑÑеÑÑ ÑбÑаÑÑвалиÑÑ Ð´ÑÑгими пÑоÑеÑÑами. |
buffer-checkpoint-sync-start | () | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾Ñле запиÑи гÑÑзнÑÑ Ð±ÑÑеÑов в ÑдÑо и до наÑала ÑоÑмиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов fsync. |
buffer-checkpoint-done | () | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении ÑÐ¸Ð½Ñ ÑонизаÑии бÑÑеÑов Ñ Ð´Ð¸Ñком. |
twophase-checkpoint-start | () | СÑабаÑÑваеÑ, когда наÑинаеÑÑÑ Ð´Ð²ÑÑ ÑазнÑй ÑÑап вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки. |
twophase-checkpoint-done | () | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении двÑÑ Ñазного ÑÑапа вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки. |
buffer-read-start | (ForkNumber, BlockNumber, Oid, Oid, Oid, int, bool) | СÑабаÑÑваеÑ, когда наÑинаеÑÑÑ ÑÑение из бÑÑеÑа. arg0 и arg1 ÑодеÑÐ¶Ð°Ñ Ð½Ð¾Ð¼ÐµÑ ÑÐ»Ð¾Ñ Ð¸ блока ÑÑой ÑÑÑаниÑÑ (arg1 бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°Ñение -1, еÑли вÑполнÑеÑÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð° ÑаÑÑиÑение меÑÑа Ð´Ð»Ñ ÑаблиÑÑ). arg2, arg3 и arg4 ÑодеÑÐ¶Ð°Ñ OID-Ñ ÑаблиÑного пÑоÑÑÑанÑÑва, Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
и оÑноÑениÑ, коÑоÑÑе однознаÑно иденÑиÑиÑиÑÑÑÑ Ð¾ÑноÑение. arg5 Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñного бÑÑеÑа задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑеÑвеÑного пÑоÑеÑÑа, ÑоздавÑего вÑеменное оÑноÑение, или InvalidBackendId (-1) â Ð´Ð»Ñ ÑазделÑемого бÑÑеÑа. arg6 = true Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов на ÑаÑÑиÑение меÑÑа Ð´Ð»Ñ ÑаблиÑÑ, false â в ÑлÑÑае обÑÑного ÑÑениÑ. |
buffer-read-done | (ForkNumber, BlockNumber, Oid, Oid, Oid, int, bool, bool) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении ÑÑÐµÐ½Ð¸Ñ Ð±ÑÑеÑа. arg0 и arg1 ÑодеÑÐ¶Ð°Ñ Ð½Ð¾Ð¼ÐµÑ ÑÐ»Ð¾Ñ Ð¸ Ð½Ð¾Ð¼ÐµÑ Ð±Ð»Ð¾ÐºÐ° ÑÑой ÑÑÑаниÑÑ (arg1 бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð½Ð¾Ð¼ÐµÑ ÑолÑко ÑÑо добавленного блока, еÑли вÑполнÑеÑÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð° ÑаÑÑиÑение меÑÑа Ð´Ð»Ñ ÑаблиÑÑ). arg2, arg3 и arg4 ÑодеÑÐ¶Ð°Ñ OID-Ñ ÑаблиÑного пÑоÑÑÑанÑÑва, Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
и оÑноÑениÑ, коÑоÑÑе однознаÑно иденÑиÑиÑиÑÑÑÑ Ð¾ÑноÑение. arg5 Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñного бÑÑеÑа задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑеÑвеÑного пÑоÑеÑÑа, ÑоздавÑего вÑеменное оÑноÑение, или InvalidBackendId (-1) â Ð´Ð»Ñ ÑазделÑемого бÑÑеÑа. arg6 = true Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов на ÑаÑÑиÑение меÑÑа Ð´Ð»Ñ ÑаблиÑÑ, false â в ÑлÑÑае обÑÑного ÑÑениÑ. arg7 = true, еÑли бÑÑÐµÑ Ð±Ñл обнаÑÑжен в пÑле, false â еÑли неÑ. |
buffer-flush-start | (ForkNumber, BlockNumber, Oid, Oid, Oid) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿ÐµÑед ÑоÑмиÑованием лÑбого запÑоÑа на запиÑÑ Ð² ÑазделÑемÑй бÑÑеÑ. arg0 и arg1 ÑодеÑÐ¶Ð°Ñ Ð½Ð¾Ð¼ÐµÑ ÑÐ»Ð¾Ñ Ð¸ Ð½Ð¾Ð¼ÐµÑ Ð±Ð»Ð¾ÐºÐ° ÑÑой ÑÑÑаниÑÑ. arg2, arg3 и arg4 ÑодеÑÐ¶Ð°Ñ OID-Ñ ÑаблиÑного пÑоÑÑÑанÑÑва, Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ оÑноÑениÑ, коÑоÑÑе однознаÑно иденÑиÑиÑиÑÑÑÑ Ð¾ÑноÑение. |
buffer-flush-done | (ForkNumber, BlockNumber, Oid, Oid, Oid) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении запÑоÑа на запиÑÑ. (УÑÑиÑе, ÑÑо ÑÑо оÑÑÐ°Ð¶Ð°ÐµÑ ÑолÑко Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿ÐµÑедаÑи даннÑÑ
в ÑдÑо; обÑÑно на диÑк они еÑÑ Ð½Ðµ запиÑанÑ.) ÐÑгÑменÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ÑÐ½Ñ buffer-flush-start. |
buffer-write-dirty-start | (ForkNumber, BlockNumber, Oid, Oid, Oid) | СÑабаÑÑваеÑ, когда ÑеÑвеÑнÑй пÑоÑеÑÑ Ð½Ð°ÑÐ¸Ð½Ð°ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð³ÑÑзного бÑÑеÑа. (ЧаÑÑое повÑоÑение Ñакой пÑÐ¾Ð±Ñ Ð¾Ð·Ð½Ð°ÑаеÑ, ÑÑо знаÑение shared_buffers ÑлиÑком мало или ÑÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ оÑкоÑÑекÑиÑоваÑÑ ÑпÑавлÑÑÑие паÑамеÑÑÑ Ð¿ÑоÑеÑÑа Ñоновой запиÑи.) arg0 и arg1 ÑодеÑÐ¶Ð°Ñ Ð½Ð¾Ð¼ÐµÑ ÑÐ»Ð¾Ñ Ð¸ блока ÑÑой ÑÑÑаниÑÑ. arg2, arg3 и arg4 ÑодеÑÐ¶Ð°Ñ OID-Ñ ÑаблиÑного пÑоÑÑÑанÑÑва, Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ оÑноÑениÑ, коÑоÑÑе однознаÑно иденÑиÑиÑиÑÑÑÑ Ð¾ÑноÑение. |
buffer-write-dirty-done | (ForkNumber, BlockNumber, Oid, Oid, Oid) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении запиÑи гÑÑзного бÑÑеÑа. ÐÑгÑменÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ÑÐ½Ñ buffer-write-dirty-start. |
wal-buffer-write-dirty-start | () | СÑабаÑÑваеÑ, когда ÑеÑвеÑнÑй пÑоÑеÑÑ Ð½Ð°ÑÐ¸Ð½Ð°ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð³ÑÑзного WAL бÑÑеÑа из-за Ñого, ÑÑо ÑвободнÑе WAL бÑÑеÑÑ Ð·Ð°ÐºÐ¾Ð½ÑилиÑÑ. (ЧаÑÑое повÑоÑение Ñакой ÑиÑÑаÑии ознаÑаеÑ, ÑÑо знаÑение wal_buffers ÑлиÑком мало.) |
wal-buffer-write-dirty-done | () | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении запиÑи гÑÑзного WAL бÑÑеÑа. |
xlog-insert | (unsigned char, unsigned char) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ñи добавлении запиÑи в WAL. arg0 задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑа ÑеÑÑÑÑов (rmid) Ð´Ð»Ñ ÑÑой запиÑи. arg1 задаÑÑ Ð¸Ð½ÑоÑмаÑионнÑе Ñлаги. |
xlog-switch | () | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ñи запÑоÑе на пеÑеклÑÑение ÑегменÑа WAL. |
smgr-md-read-start | (ForkNumber, BlockNumber, Oid, Oid, Oid, int) | СÑабаÑÑваеÑ, когда наÑинаеÑÑÑ ÑÑение блока из оÑноÑениÑ. arg0 и arg1 ÑодеÑÐ¶Ð°Ñ Ð½Ð¾Ð¼ÐµÑ ÑÐ»Ð¾Ñ Ð¸ Ð½Ð¾Ð¼ÐµÑ Ð±Ð»Ð¾ÐºÐ° ÑÑой ÑÑÑаниÑÑ. arg2, arg3 и arg4 ÑодеÑÐ¶Ð°Ñ OID-Ñ ÑаблиÑного пÑоÑÑÑанÑÑва, Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
и оÑноÑениÑ, коÑоÑÑе однознаÑно иденÑиÑиÑиÑÑÑÑ Ð¾ÑноÑение. arg5 Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñного бÑÑеÑа задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑеÑвеÑного пÑоÑеÑÑа, ÑоздавÑего вÑеменное оÑноÑение, или InvalidBackendId (-1) Ð´Ð»Ñ ÑазделÑемого бÑÑеÑа. |
smgr-md-read-done | (ForkNumber, BlockNumber, Oid, Oid, Oid, int, int, int) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении ÑÑÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ°. arg0 и arg1 ÑодеÑÐ¶Ð°Ñ Ð½Ð¾Ð¼ÐµÑ ÑÐ»Ð¾Ñ Ð¸ Ð½Ð¾Ð¼ÐµÑ Ð±Ð»Ð¾ÐºÐ° ÑÑÑаниÑÑ. arg2, arg3 и arg4 ÑодеÑÐ¶Ð°Ñ OID-Ñ ÑаблиÑного пÑоÑÑÑанÑÑва, Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
и оÑноÑениÑ, коÑоÑÑе однознаÑно иденÑиÑиÑиÑÑÑÑ Ð¾ÑноÑение. arg5 Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñного бÑÑеÑа задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑеÑвеÑного пÑоÑеÑÑа, ÑоздавÑего вÑеменное оÑноÑение, или InvalidBackendId (-1) â Ð´Ð»Ñ ÑазделÑемого бÑÑеÑа. arg6 задаÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑакÑиÑеÑки пÑоÑиÑаннÑÑ
байÑов, Ñогда как arg7 задаÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво запÑоÑеннÑÑ
байÑов (ÑазлиÑÐ¸Ñ Ð³Ð¾Ð²Ð¾ÑÑÑ Ð¾ налиÑии пÑоблемÑ). |
smgr-md-write-start | (ForkNumber, BlockNumber, Oid, Oid, Oid, int) | СÑабаÑÑваеÑ, когда наÑинаеÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð±Ð»Ð¾ÐºÐ° в оÑноÑение. arg0 и arg1 ÑодеÑÐ¶Ð°Ñ Ð½Ð¾Ð¼ÐµÑ ÑÐ»Ð¾Ñ Ð¸ Ð½Ð¾Ð¼ÐµÑ Ð±Ð»Ð¾ÐºÐ° ÑÑой ÑÑÑаниÑÑ. arg2, arg3 и arg4 ÑодеÑÐ¶Ð°Ñ OID-Ñ ÑаблиÑного пÑоÑÑÑанÑÑва, Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
и оÑноÑениÑ, коÑоÑÑе однознаÑно иденÑиÑиÑиÑÑÑÑ Ð¾ÑноÑение. arg5 Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñного бÑÑеÑа задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑеÑвеÑного пÑоÑеÑÑа, ÑоздавÑего вÑеменное оÑноÑение, или InvalidBackendId (-1) â Ð´Ð»Ñ ÑазделÑемого бÑÑеÑа. |
smgr-md-write-done | (ForkNumber, BlockNumber, Oid, Oid, Oid, int, int, int) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении запиÑи блока. arg0 и arg1 ÑодеÑÐ¶Ð°Ñ Ð½Ð¾Ð¼ÐµÑ ÑÐ»Ð¾Ñ Ð¸ Ð½Ð¾Ð¼ÐµÑ Ð±Ð»Ð¾ÐºÐ° ÑÑой ÑÑÑаниÑÑ. arg2, arg3 и arg4 ÑодеÑÐ¶Ð°Ñ OID-Ñ ÑаблиÑного пÑоÑÑÑанÑÑва, Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
и оÑноÑениÑ, коÑоÑÑе однознаÑно иденÑиÑиÑиÑÑÑÑ Ð¾ÑноÑение. arg5 Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñного бÑÑеÑа задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑеÑвеÑного пÑоÑеÑÑа, ÑоздавÑего вÑеменное оÑноÑение, или InvalidBackendId (-1) â Ð´Ð»Ñ ÑазделÑемого бÑÑеÑа. arg6 задаÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑакÑиÑеÑки запиÑаннÑÑ
байÑов, Ñогда как arg7 задаÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво запÑоÑеннÑÑ
байÑов (ÑазлиÑÐ¸Ñ Ð³Ð¾Ð²Ð¾ÑÑÑ Ð¾ налиÑии пÑоблемÑ). |
sort-start | (int, bool, int, int, bool) | СÑабаÑÑваеÑ, когда наÑинаеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ ÑоÑÑиÑовки. arg0 задаÑÑ ÑоÑÑиÑÐ¾Ð²ÐºÑ ÑаблиÑÑ, индекÑа или ÑлеменÑа даннÑÑ . arg1 = true, еÑли даннÑе ожидаÑÑÑÑ ÑникалÑнÑми. arg2 задаÑÑ ÑиÑло клÑÑевÑÑ ÑÑолбÑов. arg3 задаÑÑ Ð¾Ð±ÑÑм доÑÑÑпной ÑабоÑей памÑÑи в килобайÑÐ°Ñ . arg4 = true, еÑли ÑÑебÑеÑÑÑ Ð¿ÑоизволÑнÑй доÑÑÑп к ÑезÑлÑÑаÑÑ ÑоÑÑиÑовки. |
sort-done | (bool, long) | СÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ завеÑÑении ÑоÑÑиÑовки. arg0 = true Ð´Ð»Ñ Ð²Ð½ÐµÑней ÑоÑÑиÑовки, false â Ð´Ð»Ñ Ð²Ð½ÑÑÑенней ÑоÑÑиÑовки. arg1 задаÑÑ ÑиÑло диÑковÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð², иÑполÑзованнÑÑ Ð´Ð»Ñ Ð²Ð½ÐµÑней ÑоÑÑиÑовки, или обÑÑм памÑÑи, иÑполÑзованной Ð´Ð»Ñ Ð²Ð½ÑÑÑенней ÑоÑÑиÑовки, в килобайÑÐ°Ñ . |
lwlock-acquire | (char *, int, LWLockMode) | СÑабаÑÑваеÑ, когда накладÑваеÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовка LWLock. arg0 задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки. arg1 задаÑÑ ÑмеÑение LWLOCK в Ñвоей ÑаÑÑи. arg2 задаÑÑ Ñип запÑоÑенной блокиÑовки: монополÑÐ½Ð°Ñ Ð¸Ð»Ð¸ ÑазделÑемаÑ. |
lwlock-release | (char *, int) | СÑабаÑÑваеÑ, когда блокиÑовка LWLock бÑла ÑнÑÑа (однако ÑÑÑиÑе, ÑÑо никакие ждÑÑие пÑоÑеÑÑÑ ÐµÑÑ Ð½Ðµ бÑли акÑивиÑованÑ). arg0 задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки LWLock. arg1 задаÑÑ ÑмеÑение внÑÑÑи иденÑиÑикаÑоÑа блокиÑовки LWLock. |
lwlock-wait-start | (char *, int, LWLockMode) | СÑабаÑÑваеÑ, когда оказÑваеÑÑÑ, ÑÑо наложиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ LWLock немедленно нелÑзÑ, и ÑеÑвеÑнÑй пÑоÑеÑÑ Ð½Ð°ÑÐ¸Ð½Ð°ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð¾ÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки. arg0 задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки LWLock. arg1 задаÑÑ ÑмеÑение внÑÑÑи иденÑиÑикаÑоÑа блокиÑовки LWLock. arg2 задаÑÑ Ñип запÑоÑенной блокиÑовки, монополÑÐ½Ð°Ñ Ð¸Ð»Ð¸ ÑазделÑемаÑ. |
lwlock-wait-done | (char *, int, LWLockMode) | СÑабаÑÑваеÑ, когда ÑеÑвеÑнÑй пÑоÑеÑÑ Ð¿ÑекÑаÑÐ°ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ðµ блокиÑовки LWLock (но ÑÐ°Ð¼Ñ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð¾Ð½ еÑÑ Ð½Ðµ полÑÑил). arg0 задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки LWLock. arg1 задаÑÑ ÑмеÑение внÑÑÑи иденÑиÑикаÑоÑа блокиÑовки LWLock. arg2 задаÑÑ Ñип запÑоÑенной блокиÑовки, монополÑÐ½Ð°Ñ Ð¸Ð»Ð¸ ÑазделÑемаÑ. |
lwlock-condacquire | (char *, int, LWLockMode) | СÑабаÑÑваеÑ, когда блокиÑовка LWLock бÑла ÑÑпеÑно полÑÑена пÑоÑеÑÑом, запÑоÑивÑим ÐµÑ Ð² Ñежиме без ожиданиÑ. arg0 задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки LWLock. arg1 задаÑÑ ÑмеÑение внÑÑÑи иденÑиÑикаÑоÑа блокиÑовки LWLock. arg2 задаÑÑ Ñип запÑоÑенной блокиÑовки, монополÑÐ½Ð°Ñ Ð¸Ð»Ð¸ ÑазделÑемаÑ. |
lwlock-condacquire-fail | (char *, int, LWLockMode) | СÑабаÑÑваеÑ, когда пÑоÑеÑÑ, запÑоÑивÑий блокиÑÐ¾Ð²ÐºÑ LWLock в Ñежиме без ожиданиÑ, не Ñмог ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ. arg0 задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки LWLock. arg1 задаÑÑ ÑмеÑение внÑÑÑи иденÑиÑикаÑоÑа блокиÑовки LWLock. arg2 задаÑÑ Ñип запÑоÑенной блокиÑовки, монополÑÐ½Ð°Ñ Ð¸Ð»Ð¸ ÑазделÑемаÑ. |
lock-wait-start | (unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE) | СÑабаÑÑваеÑ, когда запÑÐ¾Ñ Ð½Ð° ÑÑжÑлÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ (блокиÑÐ¾Ð²ÐºÑ lmgr) пеÑÐµÑ Ð¾Ð´Ð¸Ñ Ð² ÑоÑÑоÑние ожиданиÑ, поÑколÑÐºÑ Ð±Ð»Ð¾ÐºÐ¸Ñовка недоÑÑÑпна. ÐÑгÑменÑÑ Ñ arg0 до arg3 задаÑÑ Ð°ÑÑибÑÑÑ, иденÑиÑиÑиÑÑÑÑие обÑекÑ, на коÑоÑÑй накладÑваеÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовка. arg4 задаÑÑ Ñип обÑекÑа, на коÑоÑÑй накладÑваеÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовка. arg5 задаÑÑ Ñип запÑоÑенной блокиÑовки. |
lock-wait-done | (unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE) | СÑабаÑÑваеÑ, когда запÑÐ¾Ñ Ð½Ð° ÑÑжÑлÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ (блокиÑÐ¾Ð²ÐºÑ lmgr) вÑÑ
Ð¾Ð´Ð¸Ñ Ð¸Ð· ÑоÑÑоÑÐ½Ð¸Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (Ñ. е. полÑÑÐ°ÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ). ÐÑгÑменÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ÑÐ½Ñ lock-wait-start. |
deadlock-found | () | СÑабаÑÑваеÑ, когда деÑекÑÐ¾Ñ Ð²Ð·Ð°Ð¸Ð¼Ð½ÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовок обнаÑÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑакÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð½ÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ |
ТаблиÑа 27.23. ÐÑедопÑеделÑннÑе ÑипÑ, иÑполÑзÑемÑе в паÑамеÑÑÐ°Ñ ÑоÑек ÑÑаÑÑиÑовки
| Тип | ÐпÑеделение |
|---|---|
LocalTransactionId | unsigned int |
LWLockMode | int |
LOCKMODE | int |
BlockNumber | unsigned int |
Oid | unsigned int |
ForkNumber | int |
bool | char |
27.5.3. ÐÑполÑзование ÑоÑек ÑÑаÑÑиÑовки
РпÑиведÑнном ниже пÑимеÑе показан ÑкÑÐ¸Ð¿Ñ DTrace Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° ÑиÑла ÑÑанзакÑий в ÑиÑÑеме, коÑоÑÑй можно иÑполÑзоваÑÑ Ð² каÑеÑÑве алÑÑеÑнаÑÐ¸Ð²Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñнимка даннÑÑ
pg_stat_database до и поÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑеÑÑа пÑоизводиÑелÑноÑÑи:
#!/usr/sbin/dtrace -qs
postgresql$1:::transaction-start
{
@start["Start"] = count();
self->ts = timestamp;
}
postgresql$1:::transaction-abort
{
@abort["Abort"] = count();
}
postgresql$1:::transaction-commit
/self->ts/
{
@commit["Commit"] = count();
@time["Total time (ns)"] = sum(timestamp - self->ts);
self->ts=0;
}ÐÑи вÑполнении ÑÑÐ¾Ñ D-ÑкÑÐ¸Ð¿Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ Ð²Ð¸Ð´Ð°:
# ./txn_count.d `pgrep -n postgres` or ./txn_count.d <PID> ^C Start 71 Commit 70 Total time (ns) 2312105013
ÐÑимеÑание
SystemTap иÑполÑзÑÐµÑ Ð¾ÑлиÑнÑÑ Ð¾Ñ DTrace ноÑаÑÐ¸Ñ Ð´Ð»Ñ ÑкÑипÑов ÑÑаÑÑиÑовки, Ñ Ð¾ÑÑ Ð»ÐµÐ¶Ð°Ñие в Ð¸Ñ Ð¾Ñнове ÑоÑки ÑÑаÑÑиÑовки ÑовмеÑÑимÑ. СÑÐ¾Ð¸Ñ Ð¾ÑмеÑиÑÑ, ÑÑо на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÑÑой Ð³Ð»Ð°Ð²Ñ Ð² ÑкÑипÑÐ°Ñ SystemTap имена ÑоÑек ÑÑаÑÑиÑовки Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑамлÑÑÑÑÑ Ð´Ð²Ð¾Ð¹Ð½Ñми подÑÑÑкиваниÑми, а не деÑиÑами. ÐжидаеÑÑÑ, ÑÑо ÑÑа пÑоблема бÑÐ´ÐµÑ ÑеÑена в ÑледÑÑÑÐ¸Ñ Ð²ÐµÑÑиÑÑ SystemTap.
ÐÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ помниÑÑ, ÑÑо ÑкÑипÑÑ DTrace Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð°ÐºÐºÑÑаÑно напиÑÐ°Ð½Ñ Ð¸ оÑлаженÑ, в пÑоÑивном ÑлÑÑае ÑобÑÐ°Ð½Ð½Ð°Ñ ÑÑаÑÑиÑовоÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð±ÐµÑÑмÑÑленной. РболÑÑинÑÑве ÑлÑÑаев пÑиÑиной обнаÑÑженнÑÑ Ð¿Ñоблем ÑвлÑеÑÑÑ Ð¸Ð½ÑÑÑÑменÑаÑий, а не Ñама ÑиÑÑема. ÐÑпÑавлÑÑ Ð½Ð° ÑаÑÑмоÑÑение даннÑе, полÑÑеннÑе Ñ Ð¸ÑполÑзованием динамиÑеÑкой ÑÑаÑÑиÑовки, обÑзаÑелÑно пÑилагайÑе ÑкÑипÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾ÑоÑого они бÑли полÑÑенÑ, Ð´Ð»Ñ Ñого ÑÑÐ¾Ð±Ñ ÐµÐ³Ð¾ Ñакже пÑовеÑиÑÑ Ð¸ обÑÑдиÑÑ.
27.5.4. Ðадание новÑÑ ÑоÑек ÑÑаÑÑиÑовки
ÐовÑе ÑоÑки ÑÑаÑÑиÑовки ÑазÑабоÑÑик Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑеделиÑÑ Ð² лÑбом ÑÑаÑÑке кода, однако ÑÑо поÑÑебÑÐµÑ Ð¿ÐµÑекомпилÑÑии. Ðиже пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ñаги, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²ÑÑ ÑоÑек ÑÑаÑÑиÑовки:
ÐпÑеделиÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑоÑек ÑÑаÑÑиÑовки и даннÑе, коÑоÑÑе бÑдÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð² ÑÑÐ¸Ñ ÑоÑкаÑ
ÐобавиÑÑ Ð¾Ð¿Ð¸Ñание ÑоÑек ÑÑаÑÑиÑовки в
src/backend/utils/probes.dÐклÑÑиÑÑ
pg_trace.h, еÑли его еÑÑ Ð½Ðµ иÑполÑзовали в модÑле (модÑлÑÑ ), ÑодеÑжаÑÐ¸Ñ ÑоÑки ÑÑаÑÑиÑовки, и вÑÑавиÑÑTRACE_POSTGRESQLоÑладоÑнÑе макÑоÑÑ Ð² нÑжнÑе меÑÑа иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кодаÐеÑекомпилиÑоваÑÑ Ð¸ ÑбедиÑÑÑÑ Ð² доÑÑÑпноÑÑи новÑÑ ÑоÑек ÑÑаÑÑиÑовки
ÐÑимеÑ: ÐÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ñого, как можно добавиÑÑ ÑоÑÐºÑ Ð´Ð»Ñ ÑÑаÑÑиÑовки вÑÐµÑ Ð½Ð¾Ð²ÑÑ ÑÑанзакÑий по Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑÑ.
УÑÑанавливаем, ÑÑо пÑоба бÑÐ´ÐµÑ Ð½Ð°Ð·ÑваÑÑÑÑ
transaction-startи пÑинимаÑÑ Ð¿Ð°ÑамеÑÑ ÑипаLocalTransactionIdÐобавлÑем опÑеделение пÑÐ¾Ð±Ñ Ð²
src/backend/utils/probes.d:probe transaction__start(LocalTransactionId);
ÐбÑаÑиÑе внимание на иÑполÑзование двойного подÑÑÑÐºÐ¸Ð²Ð°Ð½Ð¸Ñ Ð² имени пÑобÑ. Ð ÑкÑипÑе DTrace, иÑполÑзÑÑÑем ÑÑÑ ÑоÑкÑ, двойное подÑÑÑкивание нÑжно бÑÐ´ÐµÑ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ Ð´ÐµÑиÑом, поÑÑÐ¾Ð¼Ñ Ð² докÑменÑаÑии Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелей Ð¸Ð¼Ñ ÑÑой пÑÐ¾Ð±Ñ â
transaction-start.Ðо вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии
transaction__startпÑеобÑазÑеÑÑÑ Ð² макÑоÑTRACE_POSTGRESQL_TRANSACTION_START(обÑаÑиÑе внимание, ÑÑо здеÑÑ Ð¸ÑполÑзÑеÑÑÑ Ð¾Ð´Ð¸Ð½Ð°Ñное подÑÑÑкивание), коÑоÑÑй доÑÑÑпен в ÑезÑлÑÑаÑе вклÑÑениÑpg_trace.h. Ðобавим вÑзов макÑоÑа в ÑÑебÑемÑÑ ÑоÑÐºÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кода. Рданном ÑлÑÑае ÑÑо бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ð¿ÑиблизиÑелÑно Ñак:TRACE_POSTGRESQL_TRANSACTION_START(vxid.localTransactionId);
ÐоÑле пеÑекомпилÑÑии и запÑÑка нового бинаÑного Ñайла иÑполÑзÑйÑе ÑледÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ DTrace, ÑÑÐ¾Ð±Ñ Ð¿ÑовеÑиÑÑ Ð´Ð¾ÑÑÑпноÑÑÑ ÑолÑко ÑÑо добавленной пÑобÑ. Ðолжен полÑÑиÑÑÑÑ ÑезÑлÑÑаÑ, подобнÑй ÑÑомÑ:
# dtrace -ln transaction-start ID PROVIDER MODULE FUNCTION NAME 18705 postgresql49878 postgres StartTransactionCommand transaction-start 18755 postgresql49877 postgres StartTransactionCommand transaction-start 18805 postgresql49876 postgres StartTransactionCommand transaction-start 18855 postgresql49875 postgres StartTransactionCommand transaction-start 18986 postgresql49873 postgres StartTransactionCommand transaction-start
ÐÑи добавлении макÑоÑов ÑÑаÑÑиÑовки в код, напиÑаннÑй на ÑзÑке C, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ позабоÑиÑÑÑÑ Ð¾ ÑледÑÑÑем:
ÐÑжно ÑбедиÑÑÑÑ, ÑÑо ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , опÑеделÑннÑе в паÑамеÑÑÐ°Ñ Ð¿ÑобÑ, ÑовпадаÑÑ Ñ Ñипами даннÑÑ Ð¿ÐµÑеменнÑÑ , коÑоÑÑе иÑполÑзÑÑÑÑÑ Ð² макÑоÑе. РпÑоÑивном ÑлÑÑае компилÑÑÐ¸Ñ Ð·Ð°Ð²ÐµÑÑиÑÑÑ Ñ Ð¾Ñибками.
РболÑÑинÑÑве плаÑÑоÑм в ÑлÑÑае, еÑли Postgres Pro ÑобÑан Ñ Ñказанием
--enable-dtrace, Ñо аÑгÑменÑÑ Ð¼Ð°ÐºÑоÑа ÑÑаÑÑиÑовки вÑÑиÑлÑÑÑÑÑ ÐºÐ°Ð¶Ð´Ñй Ñаз, когда макÑÐ¾Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ ÑпÑавление, даже еÑли ÑÑаÑÑиÑовка не вÑполнÑеÑÑÑ. Ðб ÑÑом не ÑÑÐ¾Ð¸Ñ Ð±ÐµÑпокоиÑÑÑÑ, еÑли Ð²Ñ Ð¿ÑоÑÑо возвÑаÑаеÑе знаÑÐµÐ½Ð¸Ñ Ð½ÐµÐ±Ð¾Ð»ÑÑого ÑиÑла локалÑнÑÑ Ð¿ÐµÑеменнÑÑ . Ðднако избегайÑе иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑеÑÑÑÑоÑÐ¼ÐºÐ¸Ñ Ð²Ñзовов ÑÑнкÑий в аÑгÑменÑÐ°Ñ . ÐÑли ÑÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾, Ñо поÑÑаÑайÑеÑÑ Ð·Ð°ÑиÑиÑÑ Ð¼Ð°ÐºÑÐ¾Ñ Ð¿ÑовеÑкой, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¾Ð¿ÑеделÑÑÑ, дейÑÑвиÑелÑно ли вклÑÑена ÑÑаÑÑиÑовка:if (TRACE_POSTGRESQL_TRANSACTION_START_ENABLED()) TRACE_POSTGRESQL_TRANSACTION_START(some_function(...));ÐаждÑй макÑÐ¾Ñ ÑÑаÑÑиÑовки Ð¸Ð¼ÐµÐµÑ ÑооÑвеÑÑÑвÑÑÑий макÑоÑ
ENABLED.