2011-12-28 13 views
8

Estoy intentando construir un equilibrador de carga para un programa que se ejecuta en 2 servidores diferentes.¿Cómo saber el ancho de banda de red utilizado en un momento dado?

Hasta ahora mi balanceador de carga, solo verifica el uso de CPU de cada servidor usando una instancia de PerformanceCounter en cada programa de servidor.

También me gustaría comprobar el uso del ancho de banda de cada servidor, ¿cómo puedo verificarlo?

(que probablemente se realiza también mediante el PerformanceCounter pero estoy familiarizado con su uso)

+2

echar un vistazo a esta pregunta: http://stackoverflow.com/questions/442409/c-bandwidth – Moonlight

Respuesta

17

Gracias a luz de la luna He encontrado este http://www.keyvan.ms/how-to-calculate-network-utilization-in-net

public double getNetworkUtilization(string networkCard){ 

      const int numberOfIterations = 10; 

      PerformanceCounter bandwidthCounter = new PerformanceCounter("Network Interface", "Current Bandwidth", networkCard); 
      float bandwidth = bandwidthCounter.NextValue();//valor fixo 10Mb/100Mn/ 

      PerformanceCounter dataSentCounter = new PerformanceCounter("Network Interface", "Bytes Sent/sec", networkCard); 

      PerformanceCounter dataReceivedCounter = new PerformanceCounter("Network Interface", "Bytes Received/sec", networkCard); 

      float sendSum = 0; 
      float receiveSum = 0; 

      for (int index = 0; index < numberOfIterations; index++) 
      { 
       sendSum += dataSentCounter.NextValue(); 
       receiveSum += dataReceivedCounter.NextValue(); 
      } 
      float dataSent = sendSum; 
      float dataReceived = receiveSum; 


      double utilization = (8 * (dataSent + dataReceived))/(bandwidth * numberOfIterations) * 100; 
      return utilization; 
     } 

para encontrar las tarjetas de red disponibles este código me ayudó:

public void printNetworkCards() 
     { 
      PerformanceCounterCategory category = new PerformanceCounterCategory("Network Interface"); 
      String[] instancename = category.GetInstanceNames(); 

      foreach (string name in instancename) 
      { 
       Console.WriteLine(name); 
      } 
     } 
Cuestiones relacionadas