Myślisz, że zarabiasz tyle, na ile zasługujesz? Zapraszamy do wzięcia udziału w anonimowej ankiecie.
1

1

Cześć. Próbowałem ostatnio zliczyć całość pobranych przez mój PC danych. Doradzono mi skorzystać z perfmona. Po przeczytaniu kilku artykułów doszedłem do wniosku, że powinienem zbierać wartości z "Network Interface" -> "Bytes Received/sec" -> <mój NIC>

Zrobiłem coś w tym stylu (pseudokod):

timer1(interwal 1ms)
{
  suma_sekundowa += pobierz("Bytes Received/sec");
  ilosc_pobran++;
}
timer2(interwal 1000ms)
{
  suma_ogolna += (suma_sekundowa / ilosc_pobran);
  suma_sekundowa = 0;
  ilosc_pobran = 0;
}

Pierwsze pytanie - czy tak można to obliczać? Wydaje mi się, że dokładność powinna być "w miarę" dobra, chociaż wszelkiego rodzaju spowolnienia spowodują fluktuacje okresu próbkowania...

Drugie pytanie - ściąganie 8.6MB pliku dało wynik 9.2MB. W opisie tego PerformanceCountera stoi jasno, że zlicza wszystkie warstwy protokołu, ale żeby "opakowanie" tyle zajmowało??

Trzecie pytanie... zrobiłem prosty wykres kontrolujący prędkość przepływu danych - pobierał on tylko dane niezerowe i to z jak najmniejszym interwałem. Oto, co dostałem:

alt text

Czy widać prawidłowość? Podpowiem, że zielona pozioma linia to 0Bps, a niebieskie pionowe kreski to markery sekundowe. I wyszło na to, że przy aktywności zbliżonej do idle, wartość "Bytes Received/sec" oscyluje w granicach 2800! Dlaczego?

flag
Nie mam pojęcia, dlaczego system nie pozwolił mi na dodanie nowych tagów jako "nowemu użytkownikowi", ale cóż... – WRonX Feb 3 at 9:13
2 
devpytania.pl/faq <- aby dodawać nowe tagi musisz mieć 250 reputacji – matekm Feb 3 at 10:34

2 Answers

3

Jeśli chodzi o narzut: ramka Ethernet 38 bajtów na 1500 bajtów payload + ramka TCP (min. 20 bajtów) + ramka IPv4 (min. 20 bajtów), czyli 1538 bajtów na 1460 danych. To daje jakieś 95% wydajności. A więc 9.2MB * 0.95 = 8.74MB - w miarę się zgadza. Pewnie należy jeszcze doliczyć możliwe opcje TCP/IP i pakiety niezwiązane z aktualną transmisją.

Jeśli chodzi o to magicznę 2800b/sec, to musiałbym zobaczyć jak dokładnie symulujesz to idle.

link|flag
2

Zainstaluj sobie SNMP na maszynie i po snmp odpytuj maszynę. MIB-y które będą Cię interesowały to:

ifHCInOctets, ifHCOutOctets.

Za pomocą tego możesz pobrać ilość oktetów, które przeleciały przez Twój interface. Za pomocą snmp możesz też okroić sobie dane do multicastów, broadcastów, nonuncastów itp.

Jako bazę danych proponuję skorzystać z RDD (rrdtool - szukaj po googlach). Tam masz gotowe typy danych jak COUNTER, czy DERIVE. Na stronie rrdtoola masz też tutorial jak z tego korzystać. Nie musisz się martwić żadną synchronizacją, liczeniem delty itp. - to wszystko za Ciebie zrobi rrdtool.

Jako ciekawostkę dodam, że rrdtool ma bardzo fajne narzędzie do rysowania wykresów z plików rrd. Generalnie RRD jest standardem jako składowanie danych o ruchu sieciowym

link|flag
Dzięki za rozszerzenie horyzontów, ale niestety chodziło mi o utworzenie aplikacji nie wymagającej niczego innego (SNMP), niż .NET Framework. Niemniej jednak i tak się zainteresuję :) – WRonX Feb 3 at 13:15

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.