Szybkie UDP

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.

0

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

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.
0

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

0

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

0

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

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.

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.

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.

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