PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (C#) - Upload Speed Problem



maz
24.08.2016, 15:09
Ich hoffe, das einer von euch mir helfen kann. Bei Stackovflow hiess es bisher nur: Das kann viele Gründe haben (you don't say)

Mein Upload Tool erreicht bei Uploads zu Google (andere Dienste hab ich noch nicht implementiert) auf allen Geräten "nur" eine Geschwindigkeit von ca 200Mbps. Dabei ist es egal, ob ich 5 oder 20 Files paralell uploade.
Wenn ich hingegen das Tool 5 mal starte und 5 mal 5 Dateien paralell hochlade, erreiche ich die GBit Grenze.

Irgendjemand ein Hauch einer Idee wer da limitiert? Google kanns kaum sein, da sie nicht unterscheiden können ob der Upload von einer neuen Instanz oder einem neuen Thread innerhalb der gleichen Instanz, kommt.

Vielleicht Haze ;)

Nimbus
24.08.2016, 15:18
Vermutlich teilen sich die parallelen Uploads eine Ressource/Instanz. Keine Ahnung wie genau du das implementiert hast, daher spekuliere ich einfach mal. Das kann irgendetwas sein, was die Verbindungen handelt oder es liegt womöglich daran, dass du dich nur einmal bei Google authentifizierst pro Instanz des Programms (quasi 1 authentifizieren und 5x uploaden vs. 5x authentifizieren und 5x uploaden)

maz
24.08.2016, 15:25
Das war auch meine erste Vermutung, deshalb ist das nun nicht mehr so. Jeder Upload authentifiziert sich bei Google. Aber natürlich läuft alles in der selben exe (instanz).

y0l0sw4gg3r
24.08.2016, 15:28
Connectiontion-pooling, cookies, .... sind ein paar der faktoren, die hier dazu spielen. Ohne konkreten Code ist das nahezu unmöglich zu sagen. Kannst du hierzu noch futter liefern?

1stAid
24.08.2016, 15:35
Du kannst versuchen mehrere anonyme Threads zu starten. Erstmal ohne Rückmeldung. Wenn du dann vollen Speed hast, bau darauf auf.
Es könnte aber auch die Verwaltug/Overhead sein die drosselt.
Es kann wirklich viel sein.

maz
24.08.2016, 15:42
Ich hab nun eben gesehen, dass der z_o_o_m Uploader bei Google exakt das selbe Problem hat :emoji50: Und das nur bei GD.
Ist also doch irgendwie ein GD Problem.

Hier mal der Code

Ein Upload eines Files (Auszug)

Dim service = newGDService()
Dim uploadStream As FileStream
uploadStream = File.OpenRead(localpath)
Dim insertrequest As FilesResource.CreateMediaUpload = New FilesResource.CreateMediaUpload(service, body, uploadStream, mimeType)
AddHandler insertrequest.ProgressChanged, Sub(e As IUploadProgress) GD_UploadProgressChanged(e, Id)
insertrequest.ChunkSize = 256 * 4 * 1024 * chunksize_
Dim answer = insertrequest.Upload()
uploadStream.Dispose()


Function newGDService()
' Create Drive API service.
Dim service As DriveService
Using stream = New FileStream(System.AppDomain.CurrentDomain.BaseDire ctory + "client_secret.json", FileMode.Open, FileAccess.Read)
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(Google ClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, New FileDataStore(credPath, True)).Result
End Using
service = New DriveService(New BaseClientService.Initializer() With {.HttpClientInitializer = credential, .ApplicationName = "simpleGDM"})
Return service
End Function

y0l0sw4gg3r
24.08.2016, 15:44
Mich verwirrt doch immer wieder das "C#"-Tag und der VB-Code ....
Kannst du nen converter empfehlen?

maz
24.08.2016, 16:15
Ich kann kein VB Tag setzten das das nicht gibt :emoji28: Und das Problem ist ja in C# das selbe :D

Und ja Code Converter (http://converter.telerik.com/) ist recht gut.


dynamic service = newGDService();
FileStream uploadStream = default(FileStream);
uploadStream = File.OpenRead(localpath);
FilesResource.CreateMediaUpload insertrequest = new FilesResource.CreateMediaUpload(service, body, uploadStream, mimeType);
dynamic answer = insertrequest.Upload();
uploadStream.Dispose();


public object newGDService()
{
// Create Drive API service.
DriveService service = default(DriveService);
using (stream == new FileStream(System.AppDomain.CurrentDomain.BaseDire ctory + "client_secret.json", FileMode.Open, FileAccess.Read)) {
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(Google ClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore(credPath, true)).Result;
}
service = new DriveService(new BaseClientService.Initializer {
HttpClientInitializer = credential,
ApplicationName = "simpleGDM"
});
return service;
}

- - - - - - - - - - Beitrag nachträglich erweitert - - - - - - - - - -

Aber da das Problem anscheinend doch Google bedingt ist (z_o_o_m Vergleich), kann ich das Problem nun versuchen anzugehen.
Ich bin ja schon mal froh zu wissen, das dort das Problem liegt.

Die neue Frage lautet: Wie merkt Google, dass ich von der selben Instanz komme?
Also ob die obrige Funktion im thead 4 von instanz a oder im thead 22 von instanz b läuft?

Denn eben die 200Mbit sind ja pro Instanz.

Wenn ich nichts finde muss ich halt den Upload in eine eigene exe outsourcen, die als windowsdienst im Hintergrund läuft und den Uploadstatus an die main exe weitergibt. Ich wäre aber froh, wenn ich das in einer exe lösen könnte.

netbios2k3
24.08.2016, 16:39
Falls du auf Google Drive uppst, die haben ein Speedlimit.
Mehr wirst du nicht erreichen.

maz
24.08.2016, 16:42
Natürlich erreiche ich mehr ;-) bis zu 2.5Gbit (mehr konnte ich nicht testen). Dazu muss mein Tool nur paralell laufen. Und genau das verwundert mich so.

https://www.szenebox.org/images/_imported/2016/08/152.jpg (http://imgs.re/image/ieqB)

rot 1 instanz blau 5 instanzen

x21
24.08.2016, 17:36
Könnte jetzt falsch liegen da ich nur Grundkenntnisse in C# habe aber hast du versucht für jede Datei die du hochladen willst eine neue " newGDService(); " zu erstellen ?

// keine Garantie das das funktionieren wird - hab nur Grundkenntnisse

maz
24.08.2016, 17:47
Genau so wird das gemach :)
Ich hol mir für jeden Fileupload eine neue Zugrifsberechtigung, obwohl das nicht notwendig wäre.
Zuerst hab ich das nur beim Start einmalig gemacht, es dann aber geändert, da ich wie du annahm das würde helfen.

prometheus
25.08.2016, 18:32
Ich kenne mich mit VB nicht und mit .NET nur wenig aus. Was mir aber auffällt ist, dass hier bisher gar nicht richtig zwischen deinen beiden Testfällen unterschieden wurde. Mehrere Threads sind schließlich etwas anderes als mehrere vollkommen unabhängige Prozesse. Ich vermute, dass dir die .NET-Runtime einen Strich durch die Rechnung macht.

Hast du mal versucht, mit Wireshark o.Ä. zu untersuchen, ob dein Programm überhaupt alle Verbindungen "gleichzeitig" aufbaut? Ich vermute, dass zu einem Zeitpunkt immer nur ein Teil deiner Uploads läuft und der Rest warten muss.

Eine andere Frage: Benutzt du HTTP(S) für die Uploads?

maz
25.08.2016, 18:35
Das Problem hat sich geklärt. Google beschränkt hier bei 200Mbit.
Bei meinen Test lud ich leider die selbe Datei paralell hoch und dann greift die Speedbegrenzung nicht. Das ist zwar auch etwas seltsam, aber es hilft mir natürlich nichts, da man nichts davon hat, wenn man eine Datei mehrfach hochlädt ;)
Bei dem Test mit multithreads wurden hingegen verschiedene Dateien hochgeladen.

maz
25.08.2016, 18:42
Nein es ist ja genau anders rum beim Upload der selben Datei war der Speed unlimitiert, beim Upload verschiedener Daten ists limitiert.

EDIT: Ich bin heute noch verwirrter als gestern, es waren sehr wohl exakt die gleichen Dateien einfach mehrfach ausgelesen.

Unlimiter
25.08.2016, 18:43
Ha, in der Sekunde in der du antwortetest, hab ich meinen Beitrag gelöscht. :D

Ich hab ignoriert, dass es dir um den Uploadspeed ging, nicht um den generellen Speed vom Programm selbst.

prometheus
25.08.2016, 18:56
Etwas seltsam ist das schon. Kannst du die Quelle verraten, die das mit der Limitierung bestätigt?

Wie (und wieso) soll Google denn erkennen, wenn man dieselbe Datei hochlädt, um dann die Limitierung aufzuheben? Nur anhand des Dateinamens geht das wohl kaum, denn dann könntest du das System ja einfach aushebeln, indem du deinen Uploads denselben Namen gibst und sie dann wieder entsprechend umbenennst, sobald die Dateien oben sind.

netbios2k3
25.08.2016, 19:45
Google wird vermutlich nach der checksum gehen...
Dass es ein Speedlimit gibt ist bekannt...

prometheus
25.08.2016, 19:47
Aber die Checksums kann Google doch gar nicht kennen, solange der Upload noch nicht abgeschlossen ist. :)

maz
25.08.2016, 19:49
Ich arbeite daran und bin (ziemlich) zuversichtlich, dass ich eine Lösung finde, um die Limite zu umgehen.
Mehr Details will ich gerade nicht preisgeben ;-)
Ein Update folgt, die Tage.

flower
26.08.2016, 15:55
Versuch mal ServicePointManager.DefaultConnectionLimit zu erhöhen: https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionli mit.aspx

Mr.Movie
26.08.2016, 19:18
Wenn das Speedlimit nicht Accbezogen ist, könntest du versuchen es über verschiedene Proxis zu jagen .....