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.

K1
  • Rejestracja:około 11 lat
  • Ostatnio:około 9 lat
  • Postów:20
0

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

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
0

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

YU
  • Rejestracja:prawie 17 lat
  • Ostatnio:ponad 6 lat
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

YU
  • Rejestracja:prawie 17 lat
  • Ostatnio:ponad 6 lat
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.


satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.