I wrote:
> How about export dtrace functions as hook function pointers?
Here is a proposal to integrate profiler to postgres without adding
any tracing markers. The goal is to provide platform-independent
and easy-to-use performance profiler. (typically just adding some
configuration to postgresql.conf.)
----
1. Add Gen_trace_hooks.sed to generate hook functions from probes.d. It appends hook variables at the tail of
probes.hlike: extern void (*TRANSACTION_START_hook)(LocalTransactionId arg1);
2. Rewrite trace function calls into PG_TRACE(name, (args...)). Trace macros are defined as: #define
PG_TRACE(name,args) \ do { \ TRACE_POSTGRESQL_##name args; \ if (name##_hook) \
name##_hook args; \ } while(0) and called as: PG_TRACE(TRANSACTION_START,
(vxid.localTransactionId));
The changes are not always necessary, but PG_TRACE macro is useful to add common logic for all probes. We can also
useit to disable probes; Gen_dummy_probes.sed will be no longer needed.
3. Implement profiler using trace hooks. Timer callbacks might be needed for periodical sampling, but I'll try to
usesimple polling from sql for now.
----
I tested performance regression by empty dtrace-probes and empty
trace-hooks, but the differences were 1-2%. Close enough to dtrace.
$ pgbench -n -S -c8 -T60 No probes : tps = 28103 ENABLE_TRACE_HOOK only : tps = 28101
ENABLE_DTRACEonly : tps = 27945 Enable both : tps = 27760
Regards,
---
ITAGAKI Takahiro
NTT Open Source Software Center