Se seu aplicativo estiver processando uma grande quantidade de dados, tente seguir o caminho dos dados. Se os dados de entrada forem alimentados a partir da rede, verifique possíveis latências, limitações de largura de banda ou erros de transmissão. Você já verificou a E / S do disco, o que de outra forma seria um provável candidato para um gargalo.
Por último, mas não menos importante, uma vez que é um aplicativo .NET altamente multithreaded, você deve garantir que coleta de lixo do servidor é usado, caso contrário, você poderá ver características de carga estranhas, conforme descrito neste postar do estouro de pilha .