Original implementation of the thread pool was limiting max number of threads by terminating oldest thread if the limit was already reached and a new request has arrived. This was causing broken responses under load. Instead we now wait until one of the threads completes before starting a new one.