Many thanks for your advice! I'll try to check the memory pools when I reproduce the issue next time.
Further, since it sounds like you initially had sockets configured in blocking mode, when the new socket tries to transmit, it will block trying to allocate TCP segments due to the exhausted memory pool. The blocking will continue until SO_SNDTIMEOUT is reached or the memory exhaustion is resolved
To clarify, I ran two tests: In the first, all sockets used the MSG_DONTWAIT flag for send() (non-blocking), in the second no socket used the flag (blocking), so there should be no mixing of blocking/non-blocking from my point of view. I'm not sure if I understand what you mean with "initially configured in blocking mode". Does this mean that send() may still block under certain circumstances (exhausted memory pool) even with MSG_DONTWAIT flag set, so I should initially set the O_NONBLOCK option on the socket to ensure that send() never blocks?