64 votes

Nombre maximum de requêtes HttpWeb simultanées

Je suis en stress test d'une application web et les avons mis en place un programme de test de windows qui tourne en place un certain nombre de fils et envoie une requête web sur chacun d'eux.

Le problème est que je obtenir la sortie suivante:

01/09/09 11:34:04 Starting new HTTP request on 10
01/09/09 11:34:04 Starting new HTTP request on 11
01/09/09 11:34:04 Starting new HTTP request on 13
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 Starting new HTTP request on 11
01/09/09 11:34:05 11 has finished!
01/09/09 11:34:05 Starting new HTTP request on 13
01/09/09 11:34:05 13 has finished!
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 14 has finished!
01/09/09 11:34:05 Starting new HTTP request on 11
01/09/09 11:34:05 11 has finished!
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 14 has finished!
01/09/09 11:34:05 Starting new HTTP request on 13
01/09/09 11:34:05 13 has finished!
01/09/09 11:34:05 Starting new HTTP request on 15
01/09/09 11:34:06 Starting new HTTP request on 11
01/09/09 11:34:06 11 has finished!
01/09/09 11:34:06 Starting new HTTP request on 14
01/09/09 11:34:06 14 has finished!

qui semble qu'il y ait un maximum de 5 fils, même si je créer 100 de la manière suivante:

int numberOfThreads = Convert.ToInt32(txtConcurrentThreads.Text);

    List<BackgroundWorker> workers = new List<BackgroundWorker>();

    for (int N = 0; N < numberOfThreads; N++)
    {

        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        workers.Add(worker);
    }


    foreach(BackgroundWorker worker in workers)
    {
        worker.RunWorkerAsync();
    }

Quelqu'un peut-il m'éclairer à ce qui se passe?

Merci

EDIT: Si, comme l'a suggéré je dors pendant 5 secondes, au lieu de httpwebrequest, alors je ne reçois plus les threads de tir, mais pas autant que je l'aurais prévu:

01/09/09 11:56:14 Starting new HTTP request on 7
01/09/09 11:56:14 Starting new HTTP request on 11
01/09/09 11:56:15 Starting new HTTP request on 12
01/09/09 11:56:15 Starting new HTTP request on 13
01/09/09 11:56:16 Starting new HTTP request on 14
01/09/09 11:56:16 Starting new HTTP request on 15
01/09/09 11:56:17 Starting new HTTP request on 16
01/09/09 11:56:17 Starting new HTTP request on 17
01/09/09 11:56:18 Starting new HTTP request on 18
01/09/09 11:56:19 Starting new HTTP request on 7
01/09/09 11:56:19 7 has finished!
01/09/09 11:56:19 Starting new HTTP request on 11
01/09/09 11:56:19 11 has finished!
01/09/09 11:56:19 Starting new HTTP request on 19
01/09/09 11:56:20 Starting new HTTP request on 20
01/09/09 11:56:20 Starting new HTTP request on 12
01/09/09 11:56:20 12 has finished!

Il a toujours l'air comme je suis le seul à en avoir 2 threads de départ à chaque seconde, ce qui semble puissant lent pour moi. Je suppose que la Console.WriteLine pourrait être un problème?

EDIT: j'ai mis

ThreadPool.SetMinThreads(100, 4);

et

System.Net.ServicePointManager.DefaultConnectionLimit = 100;

et a obtenu les résultats suivants:

01/09/09 14:00:07 Starting new HTTP request on 11
01/09/09 14:00:07 Starting new HTTP request on 81
01/09/09 14:00:07 Starting new HTTP request on 82
01/09/09 14:00:07 Starting new HTTP request on 79
01/09/09 14:00:07 Starting new HTTP request on 83
01/09/09 14:00:07 Starting new HTTP request on 84
01/09/09 14:00:07 Starting new HTTP request on 85
01/09/09 14:00:07 Starting new HTTP request on 87
01/09/09 14:00:07 Starting new HTTP request on 88
...
01/09/09 14:00:07 84 has finished! Took 323.0323 milliseconds
01/09/09 14:00:08 88 has finished! Took 808.0808 milliseconds
01/09/09 14:00:08 96 has finished! Took 806.0806 milliseconds
01/09/09 14:00:08 94 has finished! Took 806.0806 milliseconds
01/09/09 14:00:08 98 has finished! Took 801.0801 milliseconds
01/09/09 14:00:08 80 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 86 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 92 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 100 has finished! Took 812.0812 milliseconds
01/09/09 14:00:08 82 has finished! Took 1010.101 milliseconds

donc, a été en mesure de faire sortir tout un tas de requêtes web en même temps. Qui semblait file d'attente (appel à un STA serveur COM+) c'est ce que j'attendais.

Merci pour votre aide

72voto

Jon Skeet Points 692016

Sont tous (ou presque) de votre demande va vers le même hôte, par hasard? Il y a une limite intégrée sur une base par hôte. Vous pouvez changer ceci en application.config dans la system.Net connectionManagement élément.

L'autre chose, c'est que le pool de threads seulement augmente son nombre de threads peu à peu, il démarre un nouveau thread à chaque demi-seconde, IIRC. Peut-être que ce que vous voyez? Essayer de se débarrasser de HttpWebRequest à partir de l'équation - juste dormir pour un couple de secondes à la place...

Je soupçonne le dernier problème est celui que vous avez initialement en cours d'exécution, mais le premier va vous causer des problèmes.

57voto

Fredrik Mörk Points 85694

Le nombre de connexions HTTP sortantes simultanées est limité. Je pense que vous pouvez contrôler cela en utilisant la propriété System.Net.ServicePointManager.DefaultConnectionLimit static avant de créer les objets HttpWebRequest .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X