I attached patch which was already sent on february/april, but it was lost in time. It is originally from Robert Lor and Theo Schlossnagle.
It contains two DTrace probe groups. One is related to monitoring SLRU and second is about executor nodes. I merged it with the head. Original end of mail thread is here: http://archives.postgresql.org/pgsql-hackers/2009-04/msg00148.php Zdenek
diff -r 68b8827f4738 src/backend/access/transam/slru.c --- a/src/backend/access/transam/slru.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/access/transam/slru.c Fri Nov 13 23:29:14 2009 +0100 @@ -57,6 +57,7 @@ #include "storage/fd.h" #include "storage/shmem.h" #include "miscadmin.h" +#include "pg_trace.h" /* @@ -372,6 +373,7 @@ { SlruShared shared = ctl->shared; + TRACE_POSTGRESQL_SLRU_READPAGE_START((uintptr_t)ctl, pageno, write_ok, xid); /* Outer loop handles restart if we must wait for someone else's I/O */ for (;;) { @@ -399,6 +401,7 @@ } /* Otherwise, it's ready to use */ SlruRecentlyUsed(shared, slotno); + TRACE_POSTGRESQL_SLRU_READPAGE_DONE(slotno); return slotno; } @@ -446,6 +449,7 @@ SlruReportIOError(ctl, pageno, xid); SlruRecentlyUsed(shared, slotno); + TRACE_POSTGRESQL_SLRU_READPAGE_DONE(slotno); return slotno; } } @@ -470,6 +474,8 @@ SlruShared shared = ctl->shared; int slotno; + TRACE_POSTGRESQL_SLRU_READPAGE_READONLY((uintptr_t)ctl, pageno, xid); + /* Try to find the page while holding only shared lock */ LWLockAcquire(shared->ControlLock, LW_SHARED); @@ -511,6 +517,8 @@ int pageno = shared->page_number[slotno]; bool ok; + TRACE_POSTGRESQL_SLRU_WRITEPAGE_START((uintptr_t)ctl, pageno, slotno); + /* If a write is in progress, wait for it to finish */ while (shared->page_status[slotno] == SLRU_PAGE_WRITE_IN_PROGRESS && shared->page_number[slotno] == pageno) @@ -525,7 +533,10 @@ if (!shared->page_dirty[slotno] || shared->page_status[slotno] != SLRU_PAGE_VALID || shared->page_number[slotno] != pageno) + { + TRACE_POSTGRESQL_SLRU_WRITEPAGE_DONE(); return; + } /* * Mark the slot write-busy, and clear the dirtybit. After this point, a @@ -569,6 +580,8 @@ /* Now it's okay to ereport if we failed */ if (!ok) SlruReportIOError(ctl, pageno, InvalidTransactionId); + + TRACE_POSTGRESQL_SLRU_WRITEPAGE_DONE(); } /* @@ -593,6 +606,8 @@ SlruFileName(ctl, path, segno); + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_START((uintptr_t)ctl, path, pageno, slotno); + /* * In a crash-and-restart situation, it's possible for us to receive * commands to set the commit status of transactions whose bits are in @@ -607,6 +622,7 @@ { slru_errcause = SLRU_OPEN_FAILED; slru_errno = errno; + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } @@ -614,6 +630,7 @@ (errmsg("file \"%s\" doesn't exist, reading as zeroes", path))); MemSet(shared->page_buffer[slotno], 0, BLCKSZ); + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(true, -1, -1); return true; } @@ -622,6 +639,7 @@ slru_errcause = SLRU_SEEK_FAILED; slru_errno = errno; close(fd); + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } @@ -631,6 +649,7 @@ slru_errcause = SLRU_READ_FAILED; slru_errno = errno; close(fd); + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } @@ -638,9 +657,12 @@ { slru_errcause = SLRU_CLOSE_FAILED; slru_errno = errno; + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(true, -1, -1); + return true; } @@ -668,6 +690,8 @@ char path[MAXPGPATH]; int fd = -1; + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_START((uintptr_t)ctl, pageno, slotno); + /* * Honor the write-WAL-before-data rule, if appropriate, so that we do not * write out data before associated WAL records. This is the same action @@ -753,6 +777,7 @@ { slru_errcause = SLRU_OPEN_FAILED; slru_errno = errno; + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } @@ -781,6 +806,7 @@ slru_errno = errno; if (!fdata) close(fd); + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } @@ -794,6 +820,7 @@ slru_errno = errno; if (!fdata) close(fd); + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } @@ -808,6 +835,7 @@ slru_errcause = SLRU_FSYNC_FAILED; slru_errno = errno; close(fd); + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } @@ -815,10 +843,12 @@ { slru_errcause = SLRU_CLOSE_FAILED; slru_errno = errno; + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } } + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(true, -1, -1); return true; } diff -r 68b8827f4738 src/backend/executor/execScan.c --- a/src/backend/executor/execScan.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/executor/execScan.c Fri Nov 13 23:29:14 2009 +0100 @@ -20,6 +20,7 @@ #include "executor/executor.h" #include "miscadmin.h" +#include "pg_trace.h" #include "utils/memutils.h" @@ -121,6 +122,8 @@ qual = node->ps.qual; projInfo = node->ps.ps_ProjInfo; + TRACE_POSTGRESQL_EXECUTOR_SCAN((uintptr_t)node, ((Scan *)node->ps.plan)->scanrelid, (uintptr_t)accessMtd); + /* * If we have neither a qual to check nor a projection to do, just skip * all the overhead and return the raw scan tuple. diff -r 68b8827f4738 src/backend/executor/nodeAgg.c --- a/src/backend/executor/nodeAgg.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/executor/nodeAgg.c Fri Nov 13 23:29:14 2009 +0100 @@ -81,6 +81,7 @@ #include "parser/parse_agg.h" #include "parser/parse_coerce.h" #include "parser/parse_oper.h" +#include "pg_trace.h" #include "utils/acl.h" #include "utils/builtins.h" #include "utils/lsyscache.h" @@ -818,6 +819,8 @@ node->ss.ps.ps_TupFromTlist = false; } + TRACE_POSTGRESQL_EXECUTOR_AGG((uintptr_t)node, ((Agg *) node->ss.ps.plan)->aggstrategy); + /* * Exit if nothing left to do. (We must do the ps_TupFromTlist check * first, because in some cases agg_done gets set before we emit the diff -r 68b8827f4738 src/backend/executor/nodeGroup.c --- a/src/backend/executor/nodeGroup.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/executor/nodeGroup.c Fri Nov 13 23:29:14 2009 +0100 @@ -24,6 +24,7 @@ #include "executor/executor.h" #include "executor/nodeGroup.h" +#include "pg_trace.h" /* @@ -49,6 +50,8 @@ numCols = ((Group *) node->ss.ps.plan)->numCols; grpColIdx = ((Group *) node->ss.ps.plan)->grpColIdx; + TRACE_POSTGRESQL_EXECUTOR_GROUP((uintptr_t)node, numCols); + /* * Check to see if we're still projecting out tuples from a previous group * tuple (because there is a function-returning-set in the projection diff -r 68b8827f4738 src/backend/executor/nodeHash.c --- a/src/backend/executor/nodeHash.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/executor/nodeHash.c Fri Nov 13 23:29:14 2009 +0100 @@ -33,6 +33,7 @@ #include "executor/nodeHashjoin.h" #include "miscadmin.h" #include "parser/parse_expr.h" +#include "pg_trace.h" #include "utils/dynahash.h" #include "utils/memutils.h" #include "utils/lsyscache.h" @@ -79,6 +80,8 @@ ExprContext *econtext; uint32 hashvalue; + TRACE_POSTGRESQL_EXECUTOR_HASH_MULTI((uintptr_t)node); + /* must provide our own instrumentation support */ if (node->ps.instrument) InstrStartNode(node->ps.instrument); diff -r 68b8827f4738 src/backend/executor/nodeHashjoin.c --- a/src/backend/executor/nodeHashjoin.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/executor/nodeHashjoin.c Fri Nov 13 23:29:14 2009 +0100 @@ -19,6 +19,7 @@ #include "executor/hashjoin.h" #include "executor/nodeHash.h" #include "executor/nodeHashjoin.h" +#include "pg_trace.h" #include "utils/memutils.h" @@ -61,6 +62,8 @@ uint32 hashvalue; int batchno; + TRACE_POSTGRESQL_EXECUTOR_HASHJOIN((uintptr_t)node); + /* * get information from HashJoin node */ diff -r 68b8827f4738 src/backend/executor/nodeLimit.c --- a/src/backend/executor/nodeLimit.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/executor/nodeLimit.c Fri Nov 13 23:29:14 2009 +0100 @@ -23,6 +23,7 @@ #include "executor/executor.h" #include "executor/nodeLimit.h" +#include "pg_trace.h" static void recompute_limits(LimitState *node); @@ -41,6 +42,8 @@ TupleTableSlot *slot; PlanState *outerPlan; + TRACE_POSTGRESQL_EXECUTOR_LIMIT((uintptr_t)node); + /* * get information from the node */ diff -r 68b8827f4738 src/backend/executor/nodeMaterial.c --- a/src/backend/executor/nodeMaterial.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/executor/nodeMaterial.c Fri Nov 13 23:29:14 2009 +0100 @@ -24,6 +24,7 @@ #include "executor/executor.h" #include "executor/nodeMaterial.h" #include "miscadmin.h" +#include "pg_trace.h" /* ---------------------------------------------------------------- * ExecMaterial @@ -45,6 +46,8 @@ bool eof_tuplestore; TupleTableSlot *slot; + TRACE_POSTGRESQL_EXECUTOR_MATERIAL((uintptr_t)node); + /* * get state info from node */ diff -r 68b8827f4738 src/backend/executor/nodeMergejoin.c --- a/src/backend/executor/nodeMergejoin.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/executor/nodeMergejoin.c Fri Nov 13 23:29:14 2009 +0100 @@ -98,6 +98,7 @@ #include "executor/execdefs.h" #include "executor/nodeMergejoin.h" #include "miscadmin.h" +#include "pg_trace.h" #include "utils/acl.h" #include "utils/lsyscache.h" #include "utils/memutils.h" @@ -565,6 +566,8 @@ bool doFillOuter; bool doFillInner; + TRACE_POSTGRESQL_EXECUTOR_MERGEJOIN((uintptr_t)node); + /* * get information from node */ diff -r 68b8827f4738 src/backend/executor/nodeNestloop.c --- a/src/backend/executor/nodeNestloop.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/executor/nodeNestloop.c Fri Nov 13 23:29:14 2009 +0100 @@ -23,6 +23,7 @@ #include "executor/execdebug.h" #include "executor/nodeNestloop.h" +#include "pg_trace.h" #include "utils/memutils.h" @@ -67,6 +68,8 @@ List *otherqual; ExprContext *econtext; + TRACE_POSTGRESQL_EXECUTOR_NESTLOOP((uintptr_t)node); + /* * get information from the node */ diff -r 68b8827f4738 src/backend/executor/nodeSetOp.c --- a/src/backend/executor/nodeSetOp.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/executor/nodeSetOp.c Fri Nov 13 23:29:14 2009 +0100 @@ -46,6 +46,7 @@ #include "executor/executor.h" #include "executor/nodeSetOp.h" +#include "pg_trace.h" #include "utils/memutils.h" @@ -196,6 +197,8 @@ SetOp *plannode = (SetOp *) node->ps.plan; TupleTableSlot *resultTupleSlot = node->ps.ps_ResultTupleSlot; + TRACE_POSTGRESQL_EXECUTOR_SETOP((uintptr_t)node); + /* * If the previously-returned tuple needs to be returned more than once, * keep returning it. diff -r 68b8827f4738 src/backend/executor/nodeSort.c --- a/src/backend/executor/nodeSort.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/executor/nodeSort.c Fri Nov 13 23:29:14 2009 +0100 @@ -18,6 +18,7 @@ #include "executor/execdebug.h" #include "executor/nodeSort.h" #include "miscadmin.h" +#include "pg_trace.h" #include "utils/tuplesort.h" @@ -53,6 +54,8 @@ dir = estate->es_direction; tuplesortstate = (Tuplesortstate *) node->tuplesortstate; + TRACE_POSTGRESQL_EXECUTOR_SORT((uintptr_t)node, dir); + /* * If first time through, read all tuples from outer plan and pass them to * tuplesort.c. Subsequent calls just fetch tuples from tuplesort. diff -r 68b8827f4738 src/backend/executor/nodeSubplan.c --- a/src/backend/executor/nodeSubplan.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/executor/nodeSubplan.c Fri Nov 13 23:29:14 2009 +0100 @@ -24,6 +24,7 @@ #include "executor/nodeSubplan.h" #include "nodes/makefuncs.h" #include "optimizer/clauses.h" +#include "pg_trace.h" #include "utils/array.h" #include "utils/lsyscache.h" #include "utils/memutils.h" @@ -92,6 +93,8 @@ ExprContext *innerecontext = node->innerecontext; TupleTableSlot *slot; + TRACE_POSTGRESQL_EXECUTOR_SUBPLAN_HASH((uintptr_t)node); + /* Shouldn't have any direct correlation Vars */ if (subplan->parParam != NIL || node->args != NIL) elog(ERROR, "hashed subplan with direct correlation not supported"); @@ -227,6 +230,8 @@ ListCell *l; ArrayBuildState *astate = NULL; + TRACE_POSTGRESQL_EXECUTOR_SUBPLAN_SCAN((uintptr_t)node); + /* * We are probably in a short-lived expression-evaluation context. Switch * to the per-query context for manipulating the child plan's chgParam, diff -r 68b8827f4738 src/backend/executor/nodeUnique.c --- a/src/backend/executor/nodeUnique.c Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/executor/nodeUnique.c Fri Nov 13 23:29:14 2009 +0100 @@ -35,6 +35,7 @@ #include "executor/executor.h" #include "executor/nodeUnique.h" +#include "pg_trace.h" #include "utils/memutils.h" @@ -50,6 +51,8 @@ TupleTableSlot *slot; PlanState *outerPlan; + TRACE_POSTGRESQL_EXECUTOR_UNIQUE((uintptr_t)node); + /* * get information from the node */ diff -r 68b8827f4738 src/backend/utils/probes.d --- a/src/backend/utils/probes.d Fri Nov 13 11:17:04 2009 +0000 +++ b/src/backend/utils/probes.d Fri Nov 13 23:29:14 2009 +0100 @@ -15,6 +15,7 @@ * in probe definitions, as they cause compilation errors on Mac OS X 10.5. */ #define LocalTransactionId unsigned int +#define TransactionId unsigned int #define LWLockId int #define LWLockMode int #define LOCKMODE int @@ -90,4 +91,29 @@ probe xlog__switch(); probe wal__buffer__write__dirty__start(); probe wal__buffer__write__dirty__done(); + + probe slru__readpage__start(unsigned long, int, bool, TransactionId); + probe slru__readpage__done(int); + probe slru__readpage__readonly(unsigned long, int, TransactionId); + probe slru__writepage__start(unsigned long, int, int); + probe slru__writepage__done(); + probe slru__readpage__physical__start(unsigned long, char *, int, int); + probe slru__readpage__physical__done(int, int, int); + probe slru__writepage__physical__start(unsigned long, int, int); + probe slru__writepage__physical__done(int, int, int); + + probe executor__scan(unsigned long, unsigned int, unsigned long); + probe executor__agg(unsigned long, int); + probe executor__group(unsigned long, int); + probe executor__hash__multi(unsigned long); + probe executor__hashjoin(unsigned long); + probe executor__limit(unsigned long); + probe executor__material(unsigned long); + probe executor__mergejoin(unsigned long); + probe executor__nestloop(unsigned long); + probe executor__setop(unsigned long); + probe executor__sort(unsigned long, int); + probe executor__subplan__hash(unsigned long); + probe executor__subplan__scan(unsigned long); + probe executor__unique(unsigned long); };
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers