Как программно измерить пропускную способность веб-сайта (загрузка + загрузка) в МБ с помощью C#/VB.Net?

Надеюсь, что у всех здесь все хорошо.

Я пишу службу Windows на C#/VB.Net, целью которой является измерение потребления пропускной способности для всех веб-сайтов на localhost. > и хранить их статистику для загрузки, скачивания и т. д. в локальной/удаленной базе данных.

Целевые платформы включают только Windows Server 2003, 2003 R2, 2008 и 2008 R2.

Я немного искал эту вещь и нашел следующее:

  1. Использование SNMP mgmtapi.dll, которая есть в Windows 2003.
  2. Использование специального сетевого драйвера для сбора статистики.

Укажите наиболее подходящую , безопасную и эффективную методологию/технику или набор таких методик, которые можно использовать для измерения потребления полосы пропускания для каждого отдельного веб-сайта.

Также поделитесь любым кодом по этому поводу.

С Уважением

Стив


person Steve Johnson    schedule 01.06.2010    source источник


Ответы (1)


Я нашел сборку под названием snmpsharpnet, которая очень полезна для работы с SNMP поверх .NET.

Согласно объяснению, которое я написал в эта статья скорость использования входной полосы пропускания может быть рассчитана для данного интерфейса:

Использование пропускной способности "In" в % = (((ifInOctets(t2)-ifInOctets(t1)) * 8)*100) / (ifSpeed ​​* (t2-t1))

Вот пример кода.

using System;
using System.Collections.Generic;
using System.Text;

using SnmpSharpNet;

namespace Exemple2
{
  class Program
  {
    static void Main(string[] args)
    {
      /* Get an SNMP Object
       */
      SimpleSnmp snmpVerb = new SimpleSnmp("192.168.1.121", 161, "public");
      if (!snmpVerb.Valid)
      {
        Console.WriteLine("Seems that IP or comunauty is not cool");
        return;
      }


      /* Sample of simple Get usage on ifSpeed on interface 10
       * TODO : for sure you have to detect the right interface
       */
      Oid oidifSpeed = new Oid(".1.3.6.1.2.1.2.2.1.5.10");

      /* Getting ifSpeed
       */
      Dictionary<Oid, AsnType> snmpDataS = snmpVerb.Get(SnmpVersion.Ver2, new string[] { oidifSpeed.ToString() });
      if (snmpDataS != null)
        Console.WriteLine("Interface speed \"{0}\" : {1}", oidifSpeed.ToString(), snmpDataS[oidifSpeed].ToString());
      else
        Console.WriteLine("Not Glop!");

      /* Sample of simple Get usage on ifInOctets on interface 10
       * TODO : for sure you have to detect the right interface
       */
      Oid oidifInOctets = new Oid(".1.3.6.1.2.1.2.2.1.10.10");
      Dictionary<Oid, AsnType> snmpData1;

      /* Getting it for the first time
       */
      snmpData1 = snmpVerb.Get(SnmpVersion.Ver2, new string[] { oidifInOctets.ToString() });
      if (snmpData1 != null)
        Console.WriteLine("Number of In octets \"{0}\" : {1}", oidifInOctets.ToString(), snmpData1[oidifInOctets].ToString());
      else
        Console.WriteLine("Not Glop!");

      int missed = 0;
      while (true)
      {
        if (missed == 0)
        {
          /* When you detect a non refesh data, keep the last one
           */
          snmpData1 = snmpVerb.Get(SnmpVersion.Ver2, new string[] { oidifInOctets.ToString() });
          if (snmpData1 != null)
            Console.WriteLine("Number of In octets \"{0}\" : {1}", oidifInOctets.ToString(), snmpData1[oidifInOctets].ToString());
          else
            Console.WriteLine("Not Glop!");
        }

        /* Some Wait (less aproximative)
         */
        int duration = 5;
        System.Threading.Thread.Sleep(duration*1000); // duration seconds

        /* Getting it for the Second time
         */
        Dictionary<Oid, AsnType> snmpData2 = snmpVerb.Get(SnmpVersion.Ver2, new string[] { oidifInOctets.ToString() });
        if (snmpData2 != null)
          Console.WriteLine("Number of In octets \"{0}\" : {1}", oidifInOctets.ToString(), snmpData2[oidifInOctets].ToString());
        else
          Console.WriteLine("Not Glop!");

        Counter32 I1 = new Counter32();
        I1.Set(snmpData1[oidifInOctets]);
        Counter32 I2 = new Counter32();
        I2.Set(snmpData2[oidifInOctets]);
        Counter32 speed = new Counter32();
        speed.Set(snmpDataS[oidifSpeed]);

        if (I2.Value == I1.Value)
        {
          missed += 1;
          continue;
        }
        decimal bandWithUsage = (((decimal)(I2.Value - I1.Value) * 8) * 100) / (speed * duration * (1+missed));
        Console.WriteLine("BandWith usage : {0}%", bandWithUsage);
        missed = 0;
      }
    }
  }
}

Это просто доказательство концепции, теперь вам, вероятно, нужно объединить BackgroundWorker и таймер.


Если вы не уверены, можно ли подключиться к SNMP на сервере, и хотите проверить подключение к порту SNMP, вам потребуется Microsoft PortQry. Этот инструмент определяет, прослушивается ли порт. Этот инструмент также предоставляет дополнительные функции в зависимости от используемой команды.

person JPBlanc    schedule 17.03.2011
comment
ваш код выглядит многообещающе! Я попробую и отпишусь о результатах. :) - person Steve Johnson; 18.03.2011
comment
Я сделал то же самое с Perl несколько месяцев назад, и это работает как шарм, однако время сна должно быть больше, иначе вы всегда будете получать нулевые значения. Если вам нужны более точные значения, вы можете использовать WMI или, что еще лучше, NFDump. Поскольку вы работаете с клиентами Windows Server, я определенно выберу WMI. - person raz3r; 23.03.2012
comment
Это выглядит очень хорошо. Я попробую сейчас в 2020 году. Если да, то ты получишь свой заслуженный балл (у) - person RogerEdward; 07.05.2020
comment
@RogerEdward Это работало 9 лет назад, это был один из моих первых ответов на SO; o). Сайт не отвечает. Я редактирую свой ответ, добавляя ссылку на gitHub, вы можете использовать пакет Nuget. - person JPBlanc; 07.05.2020
comment
@JPBlanc Действительно, но ваш код может работать, не так ли? Я имею в виду с пакетом - person RogerEdward; 08.05.2020
comment
@JPBlanc, сэр, как я могу проверить, получаю ли я ответ snmp на моем компьютере с Windows. У меня есть код С#, но он не получает ответа. Пожалуйста помоги мне с этим. Спасибо - person theburningfire; 03.06.2020
comment
@theburningfire Чтобы проверить подключение порта SNMP, вам понадобится Microsoft PortQry. Этот инструмент определяет, прослушивается ли порт. Этот инструмент также предоставляет дополнительные функции в зависимости от используемой команды. - person JPBlanc; 03.06.2020
comment
@JPBlanc, пожалуйста, не обращайте внимания, мне нужно внедрить протокол SNMP, чтобы получить данные обо всех устройствах в моей локальной сети для моей программы на С#, пожалуйста, не могли бы вы указать мне, как я могу получить заявление с нуля, я пытался внедрить SNMP, но до сих пор хороший успех. Спасибо! - person theburningfire; 03.06.2020
comment
@JPBlanc Да, ... как шарм. Но, к сожалению, мне нужно получить ОТВЕТ на запросы. Я пока не могу (плачет как идиот). - person RogerEdward; 18.06.2020