Thread: how to determine what a process is doing

how to determine what a process is doing

From
Alex Howansky
Date:
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/


Re: how to determine what a process is doing

From
Tom Lane
Date:
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

indices

From
Sandeep Joshi
Date:
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

Re: how to determine what a process is doing

From
Jan Wieck
Date:
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 #