Has this been confirmed as a bitcoind problem? Maybe it is pushpool that is misbehaving? What about explicitly terminating the connection? Adding keepalive isn't really a magical fix for that because pushpoold could decide it wants to open a new connection anyway.
You can try it by connecting to port 8332 with telnet: after one request has been serverd, bitcoind will close the connection. Even worse, as long as that connection is open it won't accept an other one. Everything is done on a single thread, you can see it in rpc.cpp, at ThreadRPCServer2()