As solicitações estão na fila no Azure AppService, embora haja threads suficientes no pool de threads

Eu escrevi uma API usando aspap webapi e a implantei no azure como Appservice. O nome do meu controlador é TestController e Meu método de ação é algo como abaixo.

    [Route("Test/Get")]
    public string Get()
    {
        Thread.Sleep(10000);
        return "value";
    }

Portanto, para cada solicitação, espere 10 segundos antes de retornar a string "value". Também escrevi outro ponto de extremidade para ver o número de threads no conjunto de threads trabalhando para executar solicitações. Essa ação é algo como abaixo.

    [Route("Test/ThreadInfo")]
    public ThreadPoolInfo Get()
    {
        int availableWorker, availableIO;
        int maxWorker, maxIO;

        ThreadPool.GetAvailableThreads(out availableWorker, out availableIO);
        ThreadPool.GetMaxThreads(out maxWorker, out maxIO);

        return new ThreadPoolInfo
        {
            AvailableWorkerThreads = availableWorker,
            MaxWorkerThreads = maxWorker,
            OccupiedThreads = maxWorker - availableWorker
        };
    }

Agora, quando fazemos 29 chamadas simultâneas para o ponto de extremidade Test / Get, leva quase 11 segundos para obter êxito em todas as solicitações. Portanto, o servidor executa todas as solicitações simultaneamente em 11 threads. Para ver o status dos threads, fazer uma chamada para Test / ThreadInfo logo após fazer uma chamada para Test / Get retorna imediatamente (sem esperar) {"AvailableWorkerThreads": 8161, "MaxWorkerThreads": 8191, "OccupiedThreads": 30}

Parece que 29 threads estão executando solicitações de Teste / Obtenção e 1 thread está executando uma solicitação de Test / ThreadInfo.

Quando faço 60 chamadas para Test / Get, leva quase 36 segundos para obter sucesso. Fazer uma chamada para Test / ThreadInfo (leva algum tempo) retorna {"AvailableWorkerThreads": 8161, "MaxWorkerThreads": 8191, "OccupiedThreads": 30}

Se aumentarmos o número de solicitações, o valor de OccupiedThreads aumenta. Como para 1000 solicitações, são necessários 2 min 22 seg e o valor de OccupiedThreads é 129.

Parece solicitar e ficar na fila após 30 chamadas simultâneas, embora muitos threads estejam disponíveis no WorkerThread. Gradualmente, aumenta o encadeamento para execução simultânea, mas isso não é suficiente (129 para 1000 solicitações).

Como nossos serviços têm muitas chamadas de E / S (algumas são chamadas de API externas e outras são consultas de banco de dados), a latência também é alta. Como estamos usando todas as chamadas de E / S de forma assíncrona, o servidor pode atender muitas solicitações simultaneamente, mas precisamos de mais simultaneidade quando o processador estiver realizando um trabalho. Estamos usando o plano de serviço S2 com uma instância. O aumento da instância aumentará a simultaneidade, mas precisamos de mais simultaneidade da instância única.

Depois de ler algum blog e documentação no IIS, vimos que existe uma configuraçãominFreeThreads. Se o número de threads disponíveis no pool de threads estiver abaixo do valor dessa configuração, o IIS começará a enfileirar a solicitação. Existe algo no appservice como este? E é realmente possível obter mais simultaneidade do serviço de aplicativo azul ou estamos perdendo alguma configuração lá?

questionAnswers(2)

yourAnswerToTheQuestion