Based on the exception it seems that the problem is in establishing the connection so the procedure hasn't even been called yet:
at Oracle.DataAccess.Client.OracleConnection.Open()
Does the connection timeout in the connection string have effect? What I mean is that if you define 600, does it take 60 seconds to get the exception. What I'm after is to ensure that the correct connection string is modified.
Another thing is that do you use different user names? If you do the connection pool is user specific (well actually connection string specific) so this could cause a situation where there is no connection waiting for use.
Also as this happens only with high workload it's quite possible that the server just isn't capable of answering in sufficient amount of time. I would make sure that the server isn't paging and has enough resources to run operations. For example an oversized SGA could cause serious problems.
Also check from the server side if you see the connections in v$session and when connecting, are they waiting for something.
Just an additional though: You could also try defining
Validate Connection
to true to perhaps get more information about the situation, not sure if it reveals anything new but perhaps worth trying.