aicher1998
Goto Top

Eigener Prozess ist schneller als Thread

Hallo

Ich muss zu Demonstrationszwecken sehr viele Post-Requests in kürzester Zeit an meinen Server machen (nein, kein DoS, mein Server verkraftet das).

Jetzt ist das Problem wie sich das realisieren lässt.
Wenn ich das Programm mit 20 Threads öffne, hab ich nicht doppelt so viele Anfragen wie wenn ich das Programm mit nur 10 Threads starte.
Wenn ich allerdings das ganze Programm mit je 10 Threads zwei mal gleichzeitig öffne, dann schon.

Zudem kommt es mir so vor, als kann mein Programme nicht die volle Bandbreite nutzen, da der Download nur bis maximal 2,2 mbps geht, obwohl ich 16 mbps habe, wenn ich in Browser einen Speedtest mach.

Darum:
Wie kann ich es machen, dass jeder Thread die maximale Leistung zugeordnet bekommt?
Ich hab schon nachgedacht, das Programm mehrfach zu öffnen und sie untereinander über Streams kommunizieren könnten...

Ich verwende C# unter Windows 10.

Gruß
Chris

Content-ID: 326309

Url: https://administrator.de/contentid/326309

Ausgedruckt am: 22.11.2024 um 02:11 Uhr

Snuffchen
Snuffchen 13.01.2017 um 15:54:26 Uhr
Goto Top
Mehr Threads bedeuten nicht unbedingt mehr Leistung. Wir hatten das mal bei einem internen Netzwerkscanner getestet .. von 1-8 Threads hat konnte man einen Performanceschub feststellen, alles was darüber ging wurde wieder insgesamt gesehen langsamer. Hängt natürlich auch von der Hardware an, wie die Threads auf die CPU/Kerne verteilt werden.
emeriks
emeriks 13.01.2017 um 16:45:44 Uhr
Goto Top
Hi,
Wenn ich allerdings das ganze Programm mit 10 Threads gleichzeitig öffne, dann schon.
Du meinst, wenn Du 10 Instanzen deines Programms gleichzeitig laufen lässt?

E.
Aicher1998
Aicher1998 13.01.2017 um 17:49:29 Uhr
Goto Top
Zitat von @Snuffchen:

Mehr Threads bedeuten nicht unbedingt mehr Leistung. Wir hatten das mal bei einem internen Netzwerkscanner getestet .. von 1-8 Threads hat konnte man einen Performanceschub feststellen, alles was darüber ging wurde wieder insgesamt gesehen langsamer. Hängt natürlich auch von der Hardware an, wie die Threads auf die CPU/Kerne verteilt werden.
Hab schon gemerkt, dass wenn ich viel mehr Threads mach, dass dann die Requests/Sekunde stark einbrechen

Zitat von @emeriks:

Hi,
Wenn ich allerdings das ganze Programm mit 10 Threads gleichzeitig öffne, dann schon.
Du meinst, wenn Du 10 Instanzen deines Programms gleichzeitig laufen lässt?
Hatte einen kleinen Teil vergessen dazu zuschreiben, habs gerade geändert. Also wenn das Programm zwei mal offen ist und mit je 10 Threads läuft, dann hab ich auch doppelt so viele Requests, als wenn das Programm nur einmal offen wäre.
emeriks
emeriks 13.01.2017 aktualisiert um 17:59:06 Uhr
Goto Top
Wie erzeugst und startest Du denn diese Threads?
131381
131381 13.01.2017 aktualisiert um 18:07:18 Uhr
Goto Top
Zitat von @Aicher1998:
Zudem kommt es mir so vor, als kann mein Programme nicht die volle Bandbreite nutzen, da der Download nur bis maximal 2,2 mbps geht, obwohl ich 16 mbps habe, wenn ich in Browser einen Speedtest mach.
Speedtest im Browser X-) das ist wohl ein Witz face-smile?!
Je nachdem was für Daten (große Dateien, viele kleine Dateien) geladen werden kann es hier auch zu unterschiedlichen Werten kommen.
Darum:
Wie kann ich es machen, dass jeder Thread die maximale Leistung zugeordnet bekommt?
Was verstehst du in dem Zusammenhang unter "Leistung"?
Ich hab schon nachgedacht, das Programm mehrfach zu öffnen und sie untereinander über Streams kommunizieren könnten...
Primäre Frage, wo ist dein Code bzw. wie legst du die Threads genau an, bzw. wie arbeitest du mit AsyncTasks oder Threadpools, Parallel.Foreach, etc.?
Sicher das du die Ports auch wieder vernünftig schließt denn SRC Ports bleiben eine bestimmte Zeit lang offen und sind nur in begrenzter Anzahl verfügbar, sofern man sie nicht in der Registry hochschraubt.

Gruß mik
Aicher1998
Aicher1998 13.01.2017 um 19:01:40 Uhr
Goto Top
Zitat von @emeriks:

Wie erzeugst und startest Du denn diese Threads?

int nr = 200;

            for (int i = 0; i < nr; i++)
            {
                Sender tmp = new Sender();
                ls.Add(tmp);
            }

            foreach(Sender se in ls)
            {
                new Thread(
                () => se.DoIt()
                ).Start();
            }



Zitat von @131381:

Zitat von @Aicher1998:
Zudem kommt es mir so vor, als kann mein Programme nicht die volle Bandbreite nutzen, da der Download nur bis maximal 2,2 mbps geht, obwohl ich 16 mbps habe, wenn ich in Browser einen Speedtest mach.
Speedtest im Browser X-) das ist wohl ein Witz face-smile?!
Je nachdem was für Daten (große Dateien, viele kleine Dateien) geladen werden kann es hier auch zu unterschiedlichen Werten kommen.
Wegen der Steuerbytes, richtig?
Mir ist bewusst, dass das eine hohe Latenz hat, wenn viele kleine Dateien übertragen werden.

Darum:
Wie kann ich es machen, dass jeder Thread die maximale Leistung zugeordnet bekommt?
Was verstehst du in dem Zusammenhang unter "Leistung"?
Weil 1 Programm mit 2 Thread nicht die selbe Leistung hat, wie 2 Programme mit je 1 Thread.
Wie kann ich jedem Thread maximale Ressourcen zuordnen?

Ich hab schon nachgedacht, das Programm mehrfach zu öffnen und sie untereinander über Streams kommunizieren könnten...
Primäre Frage, wo ist dein Code bzw. wie legst du die Threads genau an, bzw. wie arbeitest du mit AsyncTasks oder Threadpools, Parallel.Foreach, etc.?
Ich dachte mir bereits ein List<Action> zu verwenden und das dann mit Parallel.Foreach durchlaufen zu lassen, hab mich aber erst mal für einfache Threads entschieden. Was denkst du, wäre besser?

Sicher das du die Ports auch wieder vernünftig schließt denn SRC Ports bleiben eine bestimmte Zeit lang offen und sind nur in begrenzter Anzahl verfügbar, sofern man sie nicht in der Registry hochschraubt.
Hab alle Classes, die damit involviert sind, in Using-Blöcken.
131381
131381 13.01.2017 aktualisiert um 19:17:55 Uhr
Goto Top
Zitat von @Aicher1998:
Wegen der Steuerbytes, richtig?
Jepp TCP ACKn.
Mir ist bewusst, dass das eine hohe Latenz hat, wenn viele kleine Dateien übertragen werden.
OK.
Weil 1 Programm mit 2 Thread nicht die selbe Leistung hat, wie 2 Programme mit je 1 Thread.
Wie kann ich jedem Thread maximale Ressourcen zuordnen?
Nutze einen ThreadPool mit max. so vielen Threads geichzeitig wie du logische Prozessoren hast.
Ich dachte mir bereits ein List<Action> zu verwenden und das dann mit Parallel.Foreach durchlaufen zu lassen, hab mich aber erst mal für einfache Threads entschieden. Was denkst du, wäre besser?
Async Threadpool so das max. x Prozesse gleichzeitig laufen.

Bei 200 gleichzeitg laufenden Threads ist klar das nicht alle gleichzeitig an die Reihe kommen können.

Wenns dir ums Last testen deiner Webseite geht
https://loadimpact.com/
http://httpd.apache.org/docs/2.2/programs/ab.html
http://www8.hp.com/us/en/software-solutions/loadrunner-load-testing/ind ...
emeriks
emeriks 13.01.2017 um 19:31:31 Uhr
Goto Top
Man kann schon sehr viel mehr Threads starten, als man Cores hat. Es kommt eben darauf an, was man in diesen Threads macht. Grob überschlagen laufen auf meinem PC gerade ca. 500 Threads, laut Taskmanager. Bei 4 Cores, bzw. 8 HT-"Cores".
Aicher1998
Aicher1998 13.01.2017 um 20:27:15 Uhr
Goto Top
Zitat von @131381:

Zitat von @Aicher1998:
Weil 1 Programm mit 2 Thread nicht die selbe Leistung hat, wie 2 Programme mit je 1 Thread.
Wie kann ich jedem Thread maximale Ressourcen zuordnen?
Nutze einen ThreadPool mit max. so vielen Threads geichzeitig wie du logische Prozessoren hast.
Ich dachte mir bereits ein List<Action> zu verwenden und das dann mit Parallel.Foreach durchlaufen zu lassen, hab mich aber erst mal für einfache Threads entschieden. Was denkst du, wäre besser?
Async Threadpool so das max. x Prozesse gleichzeitig laufen.
Danke. Hab das gerade gegoogelt und bin auf das hier gestoßen.
Da steht, die empfehlen einen Backgroundworker.
Daher meine Frage: Was ist in Relation zu einfacher Implementation und Effektivität besser?
emeriks
emeriks 13.01.2017 um 21:10:11 Uhr
Goto Top
Ich bin mir nicht sicher, was der BW an Vorteilen bringt. Ich vermute, er ist als "einfache" Implementierung zum Erstellen von Multi-Threading-Anwendungen gedacht. Für Anfänger vielleicht? Ich mag mich irren ...
Ich setze ihn nicht (mehr) ein.
Aicher1998
Aicher1998 13.01.2017 um 21:16:51 Uhr
Goto Top
Zitat von @emeriks:

Ich bin mir nicht sicher, was der BW an Vorteilen bringt. Ich vermute, er ist als "einfache" Implementierung zum Erstellen von Multi-Threading-Anwendungen gedacht. Für Anfänger vielleicht? Ich mag mich irren ...
Ich setze ihn nicht (mehr) ein.
Ich weiß nicht, ob ich mich als Fortgeschritten bezeichnen darf, Anfänger bin ich nicht mehr. Hab mit 12 angefangen und bin jetzt 18.
Normalerweise suche ich de einfachere Version, wenn mir aber von Profis (ich geh davon aus, weil Lv 4) gesagt wird, dass sie ihn nicht mehr einsetzen, dann geh ich auch diesen Schritt.
Bin letztes Jahr auch auf Rat eines Profis von VB auf C# umgestigen und hab es nicht bereut face-smile

So, ich verwende dann den ThreadPool und schau welche Ergebnisse ich erzielen kann, bislang sind es ziemlich genau 300 Anfragen / Minute, was viel zu wenig ist (einen zweiten PC darf ich nicht verwenden, obwohl ich 12 rumstehen hab).
mayho33
mayho33 14.01.2017 aktualisiert um 13:16:23 Uhr
Goto Top
Wieso ladest du dir nicht einfach den "Free Download Manager portable" herunter, konfigurierst ihn, bindest ihn in dein Tool ein als embedded Resource und fütterst ihn entsprechend (System.Diagnostic.Process usw.). FDM unterstützt die Commandline
Aicher1998
Aicher1998 18.01.2017 um 17:21:33 Uhr
Goto Top
Zitat von @mayho33:

Wieso ladest du dir nicht einfach den "Free Download Manager portable" herunter, konfigurierst ihn, bindest ihn in dein Tool ein als embedded Resource und fütterst ihn entsprechend (System.Diagnostic.Process usw.). FDM unterstützt die Commandline

Will ja nix runterladen, muss nur POST Requests machen