Wie kann ich möglichst genau die Übertragungsrate einer Datei nachverfolgen und protokollieren?
Hallo,
wir haben leider eine inkompetente IT (das Problem besteht seit nun 2 Jahren und ist ungelöst). Seitdem die IT irgendwas umgestellt hat, bestehen massive Probleme hinsichtlich Up- aber auch Downloadprozessen auf unserem Server. Das beste wäre eigentlich sich kompetente Leute ins Boot zu holen, aber ich gehe mal davon aus, dass das ne Kostenfrage ist.
Wie dem auch sei. Kann ich irgendwie ein Protokoll über die Übertragung einer Datei erstellen, z.B. ich schicke eine .zip auf unseren Server. Windows zeigt dann ja so ein Zeitdiagramm an. Genau so eines würde ich gerne gespeichert haben bzw. dazu halt sämtliche Infos, die auch noch interessant sein könnten. Da unsere IT selbst untätig ist wollen wir ggf. eine externe Firma beauftragen und denen direkt schonmal ein paar Infos liefern können (für ne Ersteinschätzung).
Kennt ihr da ne Software o.a. ? Oder reichen evtx bzw. irgendwas in der Richtung Dateien aus (eher net wa?) ? Also ich bin Laie, unsere IT leider auch. Daher hoffe ich auf konstruktive Antworten.
2 Antworten
wir haben leider eine inkompetente IT
Ich kann die Kompetenzen euerer IT-Abteilung nicht beurteilen und weiß auch nichts über die Konfiguration eures Netzwerks. Irgendwelche Schuldzuweisungen von noch inkompetenteren Nutzern sind schnell in der Welt.
Leider ist das Thema komplexer, als es sich ein Laie vorstellt. Da spielen Hard- und Software eine Rolle und selbst gestandene Fachleute können im schlechtesten Fall das Handtuch werfen.
Da es mir nicht bekannt ist, mit welchen Protokollen/Programmen die Dateiübertragung abläuft ist es nur schwer möglich festzustellen mit welcher Geschwindigkeit eine einzelne Datei übertragen wird.
Innerhalb eines Programms lässt sich unter bestimmten Bedingungen der Kopier-/Übertragungsfortschritt messen.
Für eine Dateiübertragung per Webclient kann man der Fortschritt über eine Delegat abrufen und diesen in Relation zur abgelaufenen Zeit setzen:
- https://learn.microsoft.com/en-us/dotnet/api/system.net.webclient.uploadprogresschanged?view=net-8.0&redirectedfrom=MSDN
- https://learn.microsoft.com/en-us/dotnet/api/system.net.webclient.downloadprogresschanged?view=net-8.0
Ähnliches auch für die Übertragung per BITS-Transfer
Für einen normalen Kopiervorgang auf ein Netzlaufwerk, wird die sache extrem schwierig, da sich nicht feststellen lässt ob und wie die Datenübertragung zum Server gecached wird. Da kann man bestenfalls messen nach welcher Zeit sich ein Zeiger an welcher Position innerhalb eine Filestreams befindet.
Von "Außen", also ohne Programminternen Zugriff auf den Übertragungsprozess, bliebe bestenfalls in festgelegten Zeitabständen die geschriebene Dateigröße abzufragen. Was beim Download vielleicht (abhängig davon, wie die Datei geöffnet wurde) eher unproblematisch ist, dürfte beim Upload zusätzlichen Traffic im Netzwerk verursachen, was den Upload wiederum verlangsamt.
Das einzige Akzeptable wäre die Geschwindigkeit an der Netzwerkkarte Abzufragen und die Daten in eine Datei zu loggen. Dann kannst Du feststellen, welche (Transfer)Geschwindigkeiten während der Zeitspanne des Dateitransfers herrschten.
Das hinkt natürlich, da am Adapter nur die Gesamtgeschwindigkeiten gemessen werden und nicht die einer einzelnen Datei.
Powershell:
LogNetworkSpeed.ps1
'Netzwerkadapter gefunden:'
$Previews=gcim -class Win32_PerfRawData_Tcpip_NetworkInterface | Select BytesSentPersec,BytesReceivedPersec,CurrentBandwidth,Name,Timestamp_Sys100NS
$Previews|%{
"{0} {1} MBit/s" -f $_.Name, $([math]::round($_.CurrentBandwidth/1000000))
}
""
[System.Console]::CursorVisible=$False
"Aktuelle Geschwindigkeit:"
$CurTop=[System.Console]::CursorTop
for (;;){
[System.Console]::SetCursorPosition(0,$CurTop)
$Network_PerfData = gcim -class Win32_PerfRawData_Tcpip_NetworkInterface | Select BytesSentPersec,BytesReceivedPersec,CurrentBandwidth,Name,Timestamp_Sys100NS
#aktuelle NetzwerkAdapter-Datenrate im Fenster anzeigen
$Network_PerfData|%{
$_.Name+':'
$RealTimeString = [datetime]::FromFileTimeUTC($_.Timestamp_Sys100NS).ToLocalTime().ToString("yyyyMMdd HH:mm:ss,ffff") #Lesbare Zeitangabe erstellen
$Timediff = ($_.Timestamp_Sys100NS - $Previews.Timestamp_Sys100NS)/10000000
$BytesReceivedDiff = ($_.BytesReceivedPersec - $Previews.BytesReceivedPersec)
$BytesReceivedPS = [math]::round($BytesReceivedDiff/$Timediff)
'RealZeit {0}' -f $RealTimeString
'Download {0,12:f6} MByte/Sekunde' -f $( $BytesReceivedPS/1MB)
'Download {0,12:f6} MBit/Sekunde' -f $($BytesReceivedPS*8/1MB)
$BytesSendDiff = ($_.BytesSentPersec - $Previews.BytesSentPersec)
$BytesSendPS = [math]::round($BytesSendDiff/$Timediff)
'Upload {0,12:f6} MByte/Sekunde' -f $($BytesSendPS /1MB)
'Upload {0,12:f6} MBit/Sekunde' -f $($BytesSendPS *8/1MB)
$Previews=$_
}
#dito in Datei loggen...
$Network_PerfData|
Select-Object -Property @{
Name = 'RealTime';
Expression = {$RealTimeString}
},@{
Name = 'UpSpeedBpS';
Expression = {$BytesSendPS}
},@{
Name = 'DownSpeedBpS';
Expression = {$BytesReceivedPS}
}, *|
Export-Csv -Path .\NWPerfData.csv -Append -NoTypeInformation
sleep 1
}
...das ist natürlich nur eine Spielerei, welcher jeder NetzwerkAdmin drauf haben sollte...
Wenn Ihr euch einen Fachmann ins Haus holt, wird der schon sein eigenes Werkzeug mitbringen und wissen wie er es am effizientesten einsetzt
Netzwerkmonitoringsoftware gibts übrigens wie Sand am Meer.
Irgendwelche Schuldzuweisungen von noch inkompetenteren Nutzern sind schnell in der Welt.
Wie war. Das Problem liegt oft eh auf Layer 8
Vor dem Netzwerk nen Reverse Proxy schalten, der alle Requests von außen annimmt. Darauf ein Monitoring Tool wie PM2 laufen lassen, der die Netzwerkaktivität protokolliert (sollte wohl möglich sein sich die Log Daten entsprechend zu filtern). Der Proxy schickt dann den Upload / Request weiter an den jeweiligen Host im Netzwerk.
stefan-fritzsche.de/blog/monitoring-von-node-js-applikationen-mit-pm2