Szybkie UDP

Odpowiedz Nowy wątek
Milko
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

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

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
Moderator

Rejestracja: 16 lat temu

Ostatnio: 45 minut temu

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

Milko
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

Rejestracja: 12 lat temu

Ostatnio: 1 rok temu

0

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


Pozostało 580 znaków

Milko
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

Rejestracja: 12 lat temu

Ostatnio: 1 rok temu

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

Rejestracja: 9 lat temu

Ostatnio: 2 miesiące temu

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

maly_ludek
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

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