09/03/2009

Monitorare la velocità di download ed upload

A cura di Efran Cobisi


Capita a tutti, prima o poi, di trovare la propria rete aziendale estremamente lenta, nonostante le bande estremamente capienti che oggi sono a disposizione di chiunque. L'unico attore che in questi casi potrebbe e dovrebbe prendere in mano la situazione è l'amministratore di rete, a cui è affidato il compito di gestire, amministrare e monitorare la rete aziendale. Tra gli strumenti che questa figura conserva nel proprio arsenale spicca Windows PowerShell, con la sua fantastica integrazione con il framework Microsoft.NET ed il sistema operativo Windows in generale; in questo snippet vediamo come mettere a frutto le potenzialità di PowerShell e farne un sistema di monitoraggio del traffico di rete.

Supponiamo, a titolo di esempio, di voler verificare la velocità a cui la nostra macchina sta impegnando la rete; siamo interessati ad un dato medio, ovviamente, in grado di fornirci una rappresentazione sufficientemente realistica di tale valore. Fortunatamente, Windows ci mette a disposizione un performance counter per ciascuna interfaccia di rete supportata dal sistema all'interno della categoria Network Interface, in grado di fornirci il numero di byte in download ed upload in transito per tali apparati. Trovare la velocità di download ed upload, quindi, necessiterà di una media dei valori letti dai performance counter di riferimento all'interno di un intervallo temporale prefissato, ad esempio un secondo.

Poichè gli apparati di rete potrebbero essere più di uno, sarà necessario iterare all'interno delle istanze di performance counter messe a disposizione all'interno della categoria Network Interface, utilizzando uno script simile a questo, che ne visualizza l'elenco:

$perfCategory = New-Object System.Diagnostics.PerformanceCounterCategory('Network Interface') $perfCategory.GetInstanceNames() | % { $_ }

E dato che andremo a calcolare le velocità medie di download ed upload per ciascun apparto, sarà necessario mantenere una sorta di registro delle informazioni per ciascuna interfaccia. Utilizzeremo un ArrayList, classe simile all'array ma molto più maneggevole:

$perfData = New-Object System.Collections.ArrayList

Non resta che leggere i valori dai performance counter relativi agli apparati di rete recuperati con il primo script ed archiviarli all'interno dell'ArrayList appena creato. Poichè stiamo memorizzando valori complessi, dove utilizziamo una sorta di dizionario che associa i nomi dei valori ai rispettivi valori, utilizzeremo un Hashtable per aggiungere gli elementi all'ArrayList:

$perfCategory.GetInstanceNames() | ForEach-Object { $perfReceived = New-Object System.Diagnostics.PerformanceCounter('Network Interface', 'Bytes Received/sec', $_, '.') $perfSent = New-Object System.Diagnostics.PerformanceCounter('Network Interface', 'Bytes Sent/sec', $_, '.') $perfData.Add(@{ 'Interface' = $_; 'PerfReceived' = $perfReceived; 'PerfSent' = $perfSent; 'Received' = $perfReceived.RawValue; 'Sent' = $perfSent.RawValue }) }

È interessante notare come i performance counter siano qui recuperati dalla macchina locale ('.'), come anticipato, ma come fosse possibile recuperarli da qualsiasi macchina Windows remota (permessi permettendo).
Si noti, inoltre, come lo script memorizzi anche il performance counter in sè, oltre che il valore (RawValue), all'interno dell'Hashtable: questi riferimenti verranno infatti riutilizzati successivamente per calcolare le medie delle velocità.

Poichè il valore di velocità media si calcola su di un arco temporale prefissato, in questo caso un secondo, sarà necessario attendere il passare di questo periodo, utilizzando l'utile cmdlet Start-Sleep:

Start-Sleep 1

Trascorso questo tempo sarà ovviamente necessario rileggere i valori dal performance counter, sottraendovi i valori letti in precedenza:

$perfData | ForEach-Object { 'Interfaccia: ' + $_.Interface 'Spediti: ' + ($_.PerfSent.RawValue - $_.Sent) / 1KB 'Ricevuti: ' + ($_.PerfReceived.RawValue - $_.Received) / 1KB }

Se accompagnato opportunamente da un sistema di recupero ed elenco delle macchine presenti all'interno della propria rete aziendale, uno script di questo tipo può essere un valido e veloce strumento di supporto nel determinare quali PC occupano eccessivamente la banda disponibile, rallentandola e causando disservizi.


Commenti

Nessun commento disponibile.