I've inherited a large PHP application that needs tuning. I've
written the following function that I run at the end of every web
page to log resource usage, so I can decide which web pages generate
the most load, and focus my optimization efforts.
But, to quantify the PostgreSQL load, I don't know how to gather any
other information besides the number of queries.
I can set
debug_print_query = true
log_pid = true
in postgres.conf, so that I can see which queries were run during a
particular database connection.
But, how can I match the PHP log with the PID of the database
connection? Is there an SQL command I can run to find out my
connections PID, or some other identifier that I can put in
PostgreSQL's log?
Also, is there a query I can run that will quantify the amount of
resources that PostgreSQL had to use to satisfy all the queries made
during the connection?
-scott
=============================================================================
// These two commands are run at the start of every page (by
// putting them into an include file that all pages use)
// collect initial data for resource logging
$startWallTime = gettimeofday();
$startRusage = getrusage();
// these lines are put inside my low-level function that sends
// queries to PostgreSQL
global $queryCount;
$queryCount += 1;
// This function is called at the end of every page
function logResourcesUsed()
{
global $startWallTime, $startRusage, $queryCount;
global $REMOTE_ADDR, $REQUEST_METHOD, $REQUEST_URI;
$endWallTime = gettimeofday();
$endRusage = getrusage();
$CPUtime = posix_times(); // this data is reset for each page
$date = date("ymd:His");
if ( ($fp = fopen(RESOURCE_LOG, "a")) == FALSE)
return;
$msecs = ($endWallTime["sec"] - $startWallTime["sec"]) * 1000;
$msecs += ($endWallTime["usec"] - $startWallTime["usec"]) / 1000;
# verbose format to make debugging easier
$format = "%s %s %s %s PID=%d msecs=%d utime=%d stime=%d " .
"cutime=%d cstime=%d pagefault=%d nswap=%d queries=%d\n";
# machine readable format, the default
$format = "%s %s %s %s %d %d %d %d %d %d %d %d %d\n";
$record = sprintf($format,
$REMOTE_ADDR, $date, $REQUEST_METHOD, $REQUEST_URI,
getmypid(), $msecs,
$CPUtime["utime"], $CPUtime["stime"],
$CPUtime["cutime"], $CPUtime["cstime"],
$endRusage["ru_majflt"] - $startRusage["ru_majflt"],
$endRusage["ru_nswap"] - $startRusage["ru_nswap"],
$queryCount);
fputs($fp, $record);
fclose($fp);
}