Wie kann ich möglichst genau die Übertragungsrate einer Datei nachverfolgen und protokollieren?

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:

Ä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.


Sparrow75  16.11.2023, 19:42
Irgendwelche Schuldzuweisungen von noch inkompetenteren Nutzern sind schnell in der Welt.

Wie war. Das Problem liegt oft eh auf Layer 8

1

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