Szybkie UDP

Odpowiedz Nowy wątek
2015-01-08 08:26
Milko
0

Mój problem polega na tym, że muszę napisać symulator urządzenia generującego pakiety UDP z możliwie dużą szybkością.
Pożądana byłoby uzyskanie szybkości porównywalnej z deklarowaną prędkością karty sieciowej (1Gbps).
Poniżej uproszczony kod napisany w Qt (podejrzewam, że w innych technologiach efekt będzie taki sam) :

void OnTimer()
{
while(idx < bufferSize)
{
std::copy(sourceBuffer.begin() + idx, sourceBuffer.begin() + end_idx, buffer.begin());
sendSocket->write(buffer);
}
}

Funkcja OnTimer jest wywoływana co 100 ms.
Dla bufora o długości 50 kB, co daje 35 datagramów (każdy datagram po 1452 B) i przepływność 500kBps wszystko jest ok.
Jeżeli długość bufora wzrośnie do 100 kB (co odpowiadałoby szybkości transferu 1MBps) funkcja wyraźnie się przytyka
i jej czas realizacji wynosi znacznie więcej niż 100ms (wg mnie jakieś 0,4 s).
Czy miałby może ktoś jakieś sugestie jak to przyspieszyć.
Pozdrawiam.

Pozostało 580 znaków

2015-01-08 11:49
0

Z tego co mi wiadomo, puszczenie funkcji w osobnym wątku przyśpieszy jej działanie...

Pozostało 580 znaków

2015-01-08 13:09
0
  1. A po co robisz to całe kopiowanie buforów właściwie? Chcesz testować tylko szybkość, więc czemu nie zrobisz ładnej statycznej tablicy bajtów którą wysyłasz?
  2. Przypuszczam że goły socket byłby szybszy.

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-01-08 14:35
Milko
0

Kopiuję z bufora źródłowego użyteczne dane, które są później wysyłane.
Przepakowuję je do pola danych datagramu

Pozostało 580 znaków

2015-01-08 21:45
0

Ale jaki właściwie transfer chcesz osiągnąć? Chcesz nasycić 1gbps?


Pozostało 580 znaków

2015-01-09 08:03
Milko
0

Chciałbym osiągnąć przynajmniej 20 MBps co będzie stanowiło jakieś 20% oferowanego pasma

Pozostało 580 znaków

2015-01-09 20:55
0

Po prostu pozbądź się timer-a i wysyłaj w pętli bez żadnych sleep-ów lub wywołuj timer tak często (np co 1ms) aż osiągniesz żądany throughput.


Pozostało 580 znaków

2015-01-09 21:07
0

imho najwięcej tracisz przez stosunkowo wolny mechanizm sygnałów i slotów qt + w dalszej kolejności kolejne warstwy abstrakcji nakładane przez qt. Tak, jak pisali poprzednicy spróbuj napisać kod na surowych gniazdach i porównaj wyniki.

Pozostało 580 znaków

2015-01-09 21:31
maly_ludek
0

Na większość rzeczy poprzednicy już zwrócili uwagę:

  • nie najwydajniejsza implementacja UDP w Qt,
  • nadmiarowe kopiowanie,
  • wysoki timer - wystarczy kilka mikrosekund żeby zwolnić procesor dla innych wątków.

Jeszcze jedna bardzo ważna rzecz - UDP ma to do siebie, że ma problemy przy przesyłaniu zbyt dużych paczek danych (rzędu kilkudziesięciu kilo). Lepiej dzielić dane do wysyłki na mniejsze paczki.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0