I guess this goes into Ron's area. Back in 2004 we had had a similar issue.
In MicroSocketClientInvoker.transport(), having obtained a socket, if an exception occurs during the invocation, the code that decrements usedPooled never gets called thus inflating overtime. Eventually reaches 50, the hard limit which in turn, makes clients unable to obtain a socket from pool or create a new one.
I guess, a try, finally block is needed starting right after successful socket acquired, till where you decrement the usedPooled (marked with // Put socket back in pool for reuse).
This will make sure the usedPooled is decremented.
I searched the JIRA and also found similar bug reports which I believe all should be related.