Lets get things straight.
It's an issue on localhost, for each and every getwork request pushpoold gets - it opens up a NEW socket against bitcoind, and issues getwork over that socket.
When it's finished and pushpoold got his work, the socket is left untouched and still opened.
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.