Thread: "Idle in Transaction" and hung connections

"Idle in Transaction" and hung connections

From
"Gregory S. Williamson"
Date:
Dear peoples,

Periodically we are getting runaway postgres processes on our Linux (2.4.21-0.13 on Dell servers), using 7.4 and GIS
(0.8USE_GEOS=1 USE_PROJ=1 USE_STATS=1). 

All of the queries come in from remote servers using JDBC/proxool; once every 4 hours we have a process on the client
sidethat cleans out old connections. 

All the processes are doing is single queries -- no inserts or updates.

Very occasionally we will see a thread go wild, taking up a huge amount of processor time (the load will climb by "1"
foreach process -- usual load is around .2, when these hit the load rises to 1.x all the way up to a load of about 40
once).The pg_stat_activity shows these conections as being old -- much older than any live thread. All such connections
arein a state of "IDLE IN TRANSACTION" which seems odd as these are all queries and presumably each query is a complete
transaction.My tenative theory is that something is killing the client while the server side still thinks it has data
tosend, or some such variant. The client machines don't have a corresponding connection to the one on the postgres
server.

Killing the runaways with a -15 seems to bring the load back down and all is well, until it happens again.

Does anyone have any ideas what might be triggering this ? It is mostly an annoyance but on a couple of occasions seems
tohave brought down a server, or at least rendered it non-functional. 

Thanks for any advice !

Greg Williamson
DBA
GlobeXplorer LLC

Re: "Idle in Transaction" and hung connections

From
"Gregory S. Williamson"
Date:
Tom --

Thanks for the suggestion, and the rapid response on something which may not be truely a postgres issue (perhaps more a
JDBCthing)! 

I'll make sure to try this next time we see this oddness in action. May be hours, may be days...

Greg

-----Original Message-----
From:    Tom Lane [mailto:tgl@sss.pgh.pa.us]
Sent:    Thu 4/29/2004 3:03 PM
To:    Gregory S. Williamson
Cc:    pgsql-general@postgresql.org
Subject:    Re: [GENERAL] "Idle in Transaction" and hung connections
"Gregory S. Williamson" <gsw@globexplorer.com> writes:
> Very occasionally we will see a thread go wild, taking up a huge
> amount of processor time (the load will climb by "1" for each process
> -- usual load is around .2, when these hit the load rises to 1.x all
> the way up to a load of about 40 once). The pg_stat_activity shows
> these conections as being old -- much older than any live thread. All
> such connections are in a state of "IDLE IN TRANSACTION" which seems
> odd

This is not unexpected due to the way JDBC (mis)uses BEGIN/COMMIT.
However it is strange that such a connection would start using
a significant amount of CPU time.  It should be waiting for a new
client query.

> Does anyone have any ideas what might be triggering this ?

No.  Try attaching to a looping backend with gdb so you can get a stack
trace.  I would suggest something along the lines of

    gdb /path/to/postgres PID
    bt
    cont
    ... wait a few seconds, press control-C, and again do:
    bt
    cont
    ... lather, rinse, repeat a few times, then control-C and:
    quit

Comparison of four or five stack traces obtained this way should make it
fairly clear where the loop is, and then we can determine whether we
need more info to solve it.

            regards, tom lane




Re: "Idle in Transaction" and hung connections

From
Tom Lane
Date:
"Gregory S. Williamson" <gsw@globexplorer.com> writes:
> Very occasionally we will see a thread go wild, taking up a huge
> amount of processor time (the load will climb by "1" for each process
> -- usual load is around .2, when these hit the load rises to 1.x all
> the way up to a load of about 40 once). The pg_stat_activity shows
> these conections as being old -- much older than any live thread. All
> such connections are in a state of "IDLE IN TRANSACTION" which seems
> odd

This is not unexpected due to the way JDBC (mis)uses BEGIN/COMMIT.
However it is strange that such a connection would start using
a significant amount of CPU time.  It should be waiting for a new
client query.

> Does anyone have any ideas what might be triggering this ?

No.  Try attaching to a looping backend with gdb so you can get a stack
trace.  I would suggest something along the lines of

    gdb /path/to/postgres PID
    bt
    cont
    ... wait a few seconds, press control-C, and again do:
    bt
    cont
    ... lather, rinse, repeat a few times, then control-C and:
    quit

Comparison of four or five stack traces obtained this way should make it
fairly clear where the loop is, and then we can determine whether we
need more info to solve it.

            regards, tom lane

Re: "Idle in Transaction" and hung connections

From
Kris Jurka
Date:

On Thu, 29 Apr 2004, Gregory S. Williamson wrote:

> Tom --
>
> Thanks for the suggestion, and the rapid response on something which may
> not be truely a postgres issue (perhaps more a JDBC thing)!
>

This behavior is fixed in the 7.5 cvs version of the JDBC driver if you'd
like to try it out.

Kris Jurka


Re: "Idle in Transaction" and hung connections

From
"Gregory S. Williamson"
Date:
Sounds like an excellent suggestion ... we'll get a copy of this release.

Do you know of any incompatabilities with postgres 7.4 ?

 We can upgrade a server to 7.5 and the JDBC, put running some servers on 7.4/7.4 JDBC might be, uhm, difficult for me
tosell operations (and we have only seen this problem in runtime). We might also be able to look at certain portions of
theCVS code and see what changed and make backward patches ? (forwarding a suggestion from our engineering people) 

Thanks,

Greg W.

-----Original Message-----
From:    Kris Jurka [mailto:books@ejurka.com]
Sent:    Thu 4/29/2004 7:27 PM
To:    Gregory S. Williamson
Cc:    Tom Lane; pgsql-general@postgresql.org
Subject:    Re: [GENERAL] "Idle in Transaction" and hung connections


On Thu, 29 Apr 2004, Gregory S. Williamson wrote:

> Tom --
>
> Thanks for the suggestion, and the rapid response on something which may
> not be truely a postgres issue (perhaps more a JDBC thing)!
>

This behavior is fixed in the 7.5 cvs version of the JDBC driver if you'd
like to try it out.

Kris Jurka





Re: "Idle in Transaction" and hung connections

From
Kris Jurka
Date:

On Fri, 30 Apr 2004, Gregory S. Williamson wrote:

>
> Sounds like an excellent suggestion ... we'll get a copy of this release.
>
> Do you know of any incompatabilities with postgres 7.4 ?
>
>  We can upgrade a server to 7.5 and the JDBC, put running some servers
> on 7.4/7.4 JDBC might be, uhm, difficult for me to sell operations (and
> we have only seen this problem in runtime). We might also be able to
> look at certain portions of the CVS code and see what changed and make
> backward patches ? (forwarding a suggestion from our engineering people)
>

You don't need to upgrade a server to use the latest JDBC driver, it has
support going back to at least 7.1.  I've produced a patch and set of
binary drivers for the 7.4 series available here:

http://www.ejurka.com/pgsql/jars/transaction_state/

This code has not gotten a whole lot of testing so I'd be careful just
dropping it into a production situation.

Kris Jurka


Load Balancing and Backup

From
CS Wagner
Date:
I assume this issue has been solved repeatedly, but I cannot find any
information on it...

I have a website that runs reports on data from a postgres database.  An
average report takes about 10 minutes.  I'd like to load balance it so I
can have multiple people run reports without causing the login request
to take forever.  Also, it is rather important that data updated in the
database be updated on all mirrors of it immediately - not with an
hourly or daily update.

What I would most desire is a program that pretends to be a postgres
server.  I can log into it with psql, a jdbc driver, or php's
pg_connect.  When I do a select (no update) command, it will send that
off to the least loaded mirror.  When I do an update/insert/delete, it
hits all the mirrors.  Also, it can designate one database (most likely
local to this pretend server) as the master so I can easily clone it to
make more mirrors.

Does anything remotely similar to that exist?

-Chris



Re: Load Balancing and Backup

From
Dardo D Kleiner - CONTRACTOR
Date:

Re: Load Balancing and Backup

From
"scott.marlowe"
Date:
On Fri, 30 Apr 2004, CS Wagner wrote:

> I assume this issue has been solved repeatedly, but I cannot find any
> information on it...
>
> I have a website that runs reports on data from a postgres database.  An
> average report takes about 10 minutes.  I'd like to load balance it so I
> can have multiple people run reports without causing the login request
> to take forever.  Also, it is rather important that data updated in the
> database be updated on all mirrors of it immediately - not with an
> hourly or daily update.
>
> What I would most desire is a program that pretends to be a postgres
> server.  I can log into it with psql, a jdbc driver, or php's
> pg_connect.  When I do a select (no update) command, it will send that
> off to the least loaded mirror.  When I do an update/insert/delete, it
> hits all the mirrors.  Also, it can designate one database (most likely
> local to this pretend server) as the master so I can easily clone it to
> make more mirrors.
>
> Does anything remotely similar to that exist?

http://sqlrelay.sourceforge.net/


Re: Load Balancing and Backup

From
Steve Atkins
Date:
On Fri, Apr 30, 2004 at 01:17:16PM -0400, CS Wagner wrote:

> I assume this issue has been solved repeatedly, but I cannot find any
> information on it...
>
> I have a website that runs reports on data from a postgres database.  An
> average report takes about 10 minutes.  I'd like to load balance it so I
> can have multiple people run reports without causing the login request
> to take forever.  Also, it is rather important that data updated in the
> database be updated on all mirrors of it immediately - not with an
> hourly or daily update.
>
> What I would most desire is a program that pretends to be a postgres
> server.  I can log into it with psql, a jdbc driver, or php's
> pg_connect.  When I do a select (no update) command, it will send that
> off to the least loaded mirror.  When I do an update/insert/delete, it
> hits all the mirrors.  Also, it can designate one database (most likely
> local to this pretend server) as the master so I can easily clone it to
> make more mirrors.
>
> Does anything remotely similar to that exist?

Sounds like dbbalancer, but I've no idea whether that's ready for
production use. I supect not.

http://sqlrelay.sourceforge.net/sqlrelay/ may be worth a look for the
"select" side of things. It's high performance and lightweight, and
supports most database access APIs.

To keep the databases in sync you'll need some form of replication to
keep the data consistent on all the mirrors. There are several
master-slave replication solutions for postgresql. Slony is one I've
seen mentioned a lot recently. If you're careful about the update
queries you make you could also replicate at the application level,
which has some different tradeoffs compared to master-slave database
replication.

Cheers,
  Steve


Re: Load Balancing and Backup

From
Richard Huxton
Date:
Steve Atkins wrote:
> On Fri, Apr 30, 2004 at 01:17:16PM -0400, CS Wagner wrote:
>>
>>What I would most desire is a program that pretends to be a postgres
>>server.  I can log into it with psql, a jdbc driver, or php's
>>pg_connect.  When I do a select (no update) command, it will send that
>>off to the least loaded mirror.  When I do an update/insert/delete, it
>>hits all the mirrors.  Also, it can designate one database (most likely
>>local to this pretend server) as the master so I can easily clone it to
>>make more mirrors.
>>
>>Does anything remotely similar to that exist?
>
>
> Sounds like dbbalancer, but I've no idea whether that's ready for
> production use. I supect not.

Possibly pgpool too. See the mailing-list archives for pg-announce (last
month) for the details.

--
   Richard Huxton
   Archonet Ltd

Re: Load Balancing and Backup

From
"John Sidney-Woollett"
Date:
Dardo D Kleiner - CONTRACTOR said:
> http://c-jdbc.objectweb.org/

If you're not using java, this may be an interesting alternative solution
which was recently announced (on this list). It seems to meet quite a few
of your requirements.

John Sidney-Woollett

<quote>
pgpool 1.0, yet another open source replication software for
PostgreSQL is now available at:

ftp://ftp.sra.co.jp/pub/cmd/postgres/pgpool/pgpool-1.0.tar.gz

pgpool is a single master/query based/synchronous replication
server. It acts as a proxy server between PostgreSQL client and
PostgreSQL server. No application change is needed to use pgpool.
pgpool's features include:

o connection pooling. This will reduce the connection establishing
  overhead.

o pre-forking child processes. Like Apache, pgpool pre-forks child
  processes to provide faster service startup.

o degeneration. In the replication mode, if one of PostgreSQL goes
  down, it detaches the broken server and continues operation with the
  surviving server.

o fail over. In the connection pool server mode, if master PostgreSQL
  goes down, it detaches the broken server and continues operation
  with the stand-by server.

pgpool can work with PostgreSQL 7.0 to 7.4. It's small and easy to
install. All you need is gcc. You even do not need PostgreSQL source
tree.

Enjoy,
--
Tatsuo Ishii

</quote>