PostgreSQL $B$X$NAH$_9~$_(B

$B$3$NJ8>O$G$O!"(Bhardmeter $B$N(B PostgreSQL $B$X$NAH$_9~$_J}K!!";HMQJ}K!!"@)8B(B
$B;v9`$r5-=R$7$^$9!#(B

* PostgreSQL $B$X$NAH$_9~$_(B

hardmeter $B$N%3%s%Q%$%k$r9T$&$H!"(Bsrc/libhardmeter.o $B$H$$$&%U%!%$%k$,:n(B
$B@.$5$l$^$9!#$3$N%U%!%$%k$r(B PostgreSQL $B$N%=!<%9%D%j!<$N(B
src/backend/postmaster/ $B$N2<$K%3%T!<$7$F$/$@$5$$!#(B

$B<!$K!"(Bpatch/postgres-7.3.dif $B$r(B PostgreSQL $B$N%=!<%9%D%j!<$KE,MQ$7$^$9!#(B

$BNc(B:
   cd postgersql-7.3
   patch -p1 < PATH_TO_HARDMETER_SOURCE/patch/postgres-7.3.dif


configure $B$r<B9T$9$k$H$-$K!"(BCFLAGS="-g -O" $B$r;XDj$7$F!"%G%P%C%0>pJs$D(B
$B$-$G(B PostgreSQL $B$r%3%s%Q%$%k$7$F$/$@$5$$!#(B

$BNc(B:
   CFLAGS="-g -O" ./configure

$BB>$N(B configure $B$N%*%W%7%g%s$O%5%$%H$N@_Dj$K$7$?$,$C$FG$0U$K;XDj$7$F$/(B
$B$@$5$$!#$"$H$OIaDL$N(B PostgreSQL $B$N%3%s%Q%$%k(B&$B%$%s%9%H!<%k$HF1$8$G$9!#(B

* .hardmeterrc $B$N@_Dj(B

postgres $B%f!<%6$N%[!<%`%G%#%l%/%H%j$K!"0J2<$N$h$&$J%j%=!<%9%U%!%$%k(B
.hardmeterrc $B$rCV$$$F$/$@$5$$!#0J2<$NNc$G$O!"%f!<%6%b!<%I$G5/$3$C$?(B
l1_cache_miss $B%$%Y%s%H$N>pJs$r:N<h$9$k$h$&$K$J$C$F$$$^$9!#:N<h$5$l$?%$(B
$B%Y%s%H$O!"(Bpostgres.dumpfile $B$G;XDj$5$l$?%U%!%$%k$K=PNO$5$l$^$9!#(B

-------------- .hardmeterrc $BNc(B:$B$3$3$+$i(B --------------
# sample events in user-mode when non-zero. default 0.
postgres.user           1
# sample events in kernel-mode when non-zero. default 0.
postgres.kernel         0
# specify event name.
postgres.event          l1_cache_miss
# output file
#      %Y - year (1970...)
#      %y - year (00..99)
#      %m - month (01..12)
#      %d - day of month (01..31)
#      %H - hour (00..23)
#      %M - minute (00..59)
#      %S - second (00..60)
#      %P - process id
postgres.dumpfile /tmp/hardmeter.%y%m%d-%H%M%S.%P
# max sampling count. default 2000, max 524270 for pebs.
postgres.count          40000
# sampling interval. default 10000.
postgres.interval       10000
-------------- .hardmeterrc $BNc(B:$B$3$3$^$G(B --------------

* $B%W%m%U%!%$%j%s%0$N<B9T$H%$%Y%s%H$N5/$3$C$?%"%I%l%9$N<}=8(B

$B:#2sE,MQ$7$?%Q%C%A$G$O!"(BPostgreSQL $B$N%/%i%$%"%s%H$,%5!<%P$X@\B3$9$kKh(B
$B$K(B .hardmeterrc $B$rFI$_9~$s$G%W%m%U%!%$%k$r3+;O$7!"%5!<%P$H$N@\B3$r@Z$k(B
$B$H!"(Bpostgres.dumpfile $B$G;XDj$5$l$?%U%!%$%k$K%W%m%U%!%$%k$N7k2L$,=PNO$5(B
$B$l$^$9!#(B

$BNc(B: $B%H%C%W(B10$B%j%9%H$N:n@.(B
    # pgbench $B$N%$%K%7%c%i%$%:(B
    pgbench -i
    # $B%$%K%7%c%i%$%:Cf$K:n@.$5$l$?%U%!%$%k$N:o=|(B
    rm /tmp/hardmeter.*
    # pgbench $B$G$NB,Dj3+;O(B
    pgbench -c 10 -t 1000
    # l1_cache_miss $B$r5/$3$7$?%"%I%l%9$N%H%C%W(B10$B$rI=<((B
    cat /tmp/hardmeter.* | awk '/^[^#]/ {print $2}' | sort | uniq -c | sort -rn | head -10

* $B%$%Y%s%H$N5/$C$?%=!<%9%3!<%I>e$N0LCV$rFCDj(B(1)

postgres $B$N<B9T%U%!%$%k$KBP$7$F!"(B

   objdump -S postgres > postgres.dmp

$B$r<B9T$7$F5U%"%;%s%V%k$7!"%"%I%l%9$H%=!<%9%3!<%I$H$NBP1~$rF@$k!#(B
$B$"$H$O!"%H%C%W(B10$B%j%9%H$N%"%I%l%9$r(B postgres.dmp $B$NCf$+$i8!:w$9$k$H!"$I(B
$B$3$G%$%Y%s%H$,5/$C$?$+$,FCDj$G$-$^$9!#(B

* $B%$%Y%s%H$N5/$C$?%=!<%9%3!<%I>e$N0LCV$rFCDj(B(2)

$B%"%I%l%9$H$=$l$KBP1~$9$k%=!<%9%3!<%I$N9THV9f$rI=<($9$k(B perl $B$N%9%/%j%W(B
$B%H(B eip2r $B$rMQ0U$7$^$7$?!#(Btop10.lst $B$r:n@.$7!"(Bpostmaster $B%W%m%;%9$,F0$$(B
$B$F$$$k:GCf$K(B

   ./eip2r -p 8 -m /proc/<postmaster$B$N(BPID>/maps -o result.lst top10.lst 

$B$r<B9T$7$F$/$@$5$$!#(B
