> And the patch is where?
You caught me; guess I'd better make something up fast, huh?
Here it is, thanks.
-- Korry
>
> ---------------------------------------------------------------------------
>
> [EMAIL PROTECTED] wrote:
> > It's difficult to profile a backend server process (using gprof)
> > because each process overwrites any earlier profile as it exits.
> >
> > It is especially tricky to nab a useful profile if you happen to have
> > autovacuum enabled.
> >
> > This patch reduces the problem by forcing the backend to 'cd' to a new
> > directory ($PGDATA/gprof/pid) just before calling exit(), but only if
> > the backend was compiled with -DLINUX_PROFILE.
> >
> > I've tested this with Linux, but not with other host architectures.
> >
> > -- Korry
> >
> >
> >
> > --
> > Korry Douglas [EMAIL PROTECTED]
> > EnterpriseDB http://www.enterprisedb.com
>
--
Korry Douglas [EMAIL PROTECTED]
EnterpriseDB http://www.enterprisedb.com
Index: src/backend/storage/ipc/ipc.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/storage/ipc/ipc.c,v
retrieving revision 1.95
diff -c -r1.95 ipc.c
*** src/backend/storage/ipc/ipc.c 5 Jan 2007 22:19:37 -0000 1.95
--- src/backend/storage/ipc/ipc.c 31 Jan 2007 15:48:55 -0000
***************
*** 110,115 ****
--- 110,145 ----
on_proc_exit_list[on_proc_exit_index].arg);
elog(DEBUG3, "exit(%d)", code);
+
+ #ifdef LINUX_PROFILE
+ {
+ /*
+ * If we are profiling ourself then gprof's mcleanup() is about
+ * to write out a profile to ./gmon.out. Since mcleanup() always
+ * uses a fixed file name, each backend will overwrite earlier
+ * profiles. To fix that, we create a separate subdirectory for
+ * each backend (./gprof/pid) and 'cd' to that subdirectory before
+ * we exit() - that forces mcleanup() to write each profile into
+ * its own directory. We end up with something like:
+ * $PGDATA/gprof/8829/gmon.out
+ * $PGDATA/gprof/8845/gmon.out
+ * ...
+ *
+ * Note that we do this here instead of in an on_proc_exit()
+ * callback because we want to ensure that this code executes
+ * last - we don't want to interfere with any other on_proc_exit()
+ * callback.
+ */
+ char gprofDirName[MAXPGPATH];
+
+ snprintf(gprofDirName, MAXPGPATH, "./gprof/%d", getpid());
+
+ mkdir("./gprof", 0777);
+ mkdir(gprofDirName, 0777);
+ chdir(gprofDirName);
+ }
+ #endif
+
exit(code);
}
---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly