how to determine what a process is doing

Started by Alex Howanskyover 25 years ago4 messagesgeneral
Jump to latest
#1Alex Howansky
alex@wankwood.com

I've looked in the docs, Bruce's book, and the list archives, but I've been
unable to find an answer to this. Any help would be greatly appreciated.

I have a database front-ended by a web site. All queries (apart from a few cron
jobs and developer's manual tests) come from the web site through PHP. Lately,
my database server's load average has been spiking badly. There may be 50
concurrent queries running, and top shows that maybe three or four of them are
really sucking up the horsepower. I'd like to find out what these hog processes
are actually processing -- but it could be any one of a few hundred different
queries. Is there any way to determine exactly what a postgres process is
doing at any time? The output from the ps command only shows "INSERT" or
"SELECT", and not the full query string.

TIA,

--
Alex Howansky
Wankwood Associates
http://www.wankwood.com/

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alex Howansky (#1)
Re: how to determine what a process is doing

Alex Howansky <alex@wankwood.com> writes:

Is there any way to determine exactly what a postgres process is
doing at any time? The output from the ps command only shows "INSERT" or
"SELECT", and not the full query string.

There isn't any really nice solution at the moment, but you could run
the postmaster with -d2 to cause writing of all queries to the
postmaster's log file (ie, its stdout/stderr). You'd probably also want
to compile with ELOG_TIMESTAMPS defined (see include/config.h) to get
timestamps and process PIDs included in the log. That'd give you info
to correlate against what "top" shows.

regards, tom lane

#3Sandeep Joshi
sjoshi@Zambeel.com
In reply to: Alex Howansky (#1)
indices

Hi,
I had learned in theory that Hash indices are used for "=" and
B-tree for "<" ,">".

explain command doesn't tell us which index it is using. Hash or
Btree?
Also,
should a following query
"id < 1243" invoke a index ? (assuming there is an index on id).

I have seen Postgres using Seq scan. Is sequential scan done afer
getting the first
page for "1243"?

Sandeep

#4Jan Wieck
JanWieck@Yahoo.com
In reply to: Tom Lane (#2)
Re: how to determine what a process is doing

Tom Lane wrote:

Alex Howansky <alex@wankwood.com> writes:

Is there any way to determine exactly what a postgres process is
doing at any time? The output from the ps command only shows "INSERT" or
"SELECT", and not the full query string.

There isn't any really nice solution at the moment, but you could run
the postmaster with -d2 to cause writing of all queries to the
postmaster's log file (ie, its stdout/stderr). You'd probably also want
to compile with ELOG_TIMESTAMPS defined (see include/config.h) to get
timestamps and process PIDs included in the log. That'd give you info
to correlate against what "top" shows.

If you compiled postgres with -g (what I do by default :-)
you could use this little script:

#!/bin/sh

gdb <<_EOF_
file /usr/home/pgsql/bin/postgres
attach $1
break pg_exec_query_string
commands 1
silent
print query_string
continue
end
continue
_EOF_

OK, could have some error checking and so, but it's a quick
hack - not a final solution.

Find the PID of a backend you want to examine and give it as
argument to the script. It'll then attach to the backend and
dump all queries sent from PHP until you hit ^C. It'll detach
again and the PHP script will never know.

If you redirect it's output to a file, just wait a few
seconds and hit ^C, there will not even be much delay for the
PHP. So the user might not notice too.

Jan

--

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#================================================== JanWieck@Yahoo.com #