Thread View: pl.comp.lang.c
24 messages
24 total messages
Started by Borneq
Tue, 05 Sep 2017 19:31
Pewna komunikacja UDP?
Author: Borneq
Date: Tue, 05 Sep 2017 19:31
Date: Tue, 05 Sep 2017 19:31
5 lines
1123 bytes
1123 bytes
Chcę zrobić komunikację między dwoma procesami na localhoscie przy użyciu boost.asio. Po TCP na Windows szybko idzie ale na linuksie są przestoje. Chcę zrobić UDP, ale tak, by nie czekać na odpowiedź w nieskończoność ale gdy nie otrzymam odpowiedzi wysłać ponowienie. Czy możliwe jest to przy użyciu boost.asio?
Re: Pewna komunikacja UDP?
Author: Adam Wysocki
Date: Wed, 06 Sep 2017 11:31
Date: Wed, 06 Sep 2017 11:31
11 lines
1235 bytes
1235 bytes
Borneq <borneq@antyspam.hidden.pl> wrote: > Chcę zrobić komunikację między dwoma procesami na localhoscie przy > użyciu boost.asio. Po TCP na Windows szybko idzie ale na linuksie są > przestoje. Zastanowiłbym się dlaczego. Wiesz co to algorytm Nagle'a i TCP_NODELAY? -- [ Email: a@b a=grp b=chmurka.net ] [ Web: http://www.chmurka.net/ ]
Re: Pewna komunikacja UDP?
Author: Borneq
Date: Wed, 06 Sep 2017 16:48
Date: Wed, 06 Sep 2017 16:48
23 lines
2148 bytes
2148 bytes
W dniu 06.09.2017 o 13:31, Adam Wysocki pisze: > Borneq <borneq@antyspam.hidden.pl> wrote: > >> Chcę zrobić komunikację między dwoma procesami na localhoscie przy >> użyciu boost.asio. Po TCP na Windows szybko idzie ale na linuksie są >> przestoje. > > Zastanowiłbym się dlaczego. Wiesz co to algorytm Nagle'a i TCP_NODELAY? > Problemem wydaje się wymiana danych każdorazowo przy przesyłaniu pakietu. To ma działać na localhost więc może jest 100% skuteczność doręczenia? Choć miło by było aby zadziałało również na komputerze zdalnym. Działa tak, że w wątku głównym program komunikuje się w obie strony przez UDP. Dodatkowo jest wątek poganiający: gdy przez dłuższy czas wątek główny czeka przed pobraniem bajtów, wątek wysyła "heartbeat" który też może nie dotrzeć, albo jego odpowiedź może nie dotrzeć. Serwer wysyła odpowiedź i różne możliwości: - wysłany bo komunikat nie doszedł do serwera - wymagana ponowna akcja - wysłany bo komunikat powrotny nie doszedł do klienta - zwraca starą odpowiedź. - ale jeszcze komplikuje - wysłany komunikat, ale było bez błędów w komunikacji, tylko po prostu serwer wykonywał długą procedurę i odeśle jak tylko się zakończy.
Re: Pewna komunikacja UDP?
Author: Borneq
Date: Wed, 06 Sep 2017 16:49
Date: Wed, 06 Sep 2017 16:49
4 lines
1073 bytes
1073 bytes
W dniu 06.09.2017 o 13:31, Adam Wysocki pisze: > Zastanowiłbym się dlaczego. Wiesz co to algorytm Nagle'a i TCP_NODELAY? A może zająć się tym lepiej? Tylko jak w boost.asio to ustawić?
Re: Pewna komunikacja UDP?
Author: Borneq
Date: Wed, 06 Sep 2017 17:02
Date: Wed, 06 Sep 2017 17:02
4 lines
1057 bytes
1057 bytes
W dniu 06.09.2017 o 13:31, Adam Wysocki pisze: > Zastanowiłbym się dlaczego. Wiesz co to algorytm Nagle'a i TCP_NODELAY? TCP_NODELAY nie pomógł tcp::no_delay option(true);
Re: Pewna komunikacja UDP?
Author: PawelS cbrbob(at)wbcd(dot)pl
Date: Wed, 06 Sep 2017 17:29
Date: Wed, 06 Sep 2017 17:29
18 lines
1782 bytes
1782 bytes
Borneq pisze: > Chcę zrobić komunikację między dwoma procesami na localhoscie przy > użyciu boost.asio. Po TCP na Windows szybko idzie ale na linuksie są > przestoje. Chcę zrobić UDP, ale tak, by nie czekać na odpowiedź w > nieskończoność ale gdy nie otrzymam odpowiedzi wysłać ponowienie. Czy Gdyby problemy występowały pod Windows niewiele bym mógł pomóc, ale pod Linux/UNIX istnieje bogactwo narzędzi w postaci: netstat, tcpdump, ba nawet strace (sys call trace) (z opcją wyświetlania czasu przed każdym syscall) tcpdump również wyświetla znacznik czasu przy każdym pakiecie, więc problem można zdiagnozować bardzo dokładnie. Co prawda za mało danych, by ustalić dokładnie problem, być może dane wysyłane są bajt po bajcie. Proszę sprawdzić: SO_SNDBUF oraz SO_RCVBUF i podzielić się rezultatem, być może dane są buforowane przed wysłaniem. > możliwe jest to przy użyciu boost.asio?
Re: Pewna komunikacja UDP?
Author: Borneq
Date: Wed, 06 Sep 2017 21:22
Date: Wed, 06 Sep 2017 21:22
7 lines
1206 bytes
1206 bytes
W dniu 06.09.2017 o 19:29, PawelS cbrbob(at)wbcd(dot)pl pisze: > Proszę sprawdzić: SO_SNDBUF oraz SO_RCVBUF > i podzielić się rezultatem, być może dane > są buforowane przed wysłaniem. Udało się zrobić na UDP. Ma ograniczenia 1 KB na pakiet, ale ja będę dostawał się jeszcze do mniejszych kawałków danych
Re: Pewna komunikacja UDP?
Author: Wojciech Muła
Date: Thu, 07 Sep 2017 10:18
Date: Thu, 07 Sep 2017 10:18
9 lines
1778 bytes
1778 bytes
On Wednesday, September 6, 2017 at 6:48:30 PM UTC+2, Borneq wrote: > Problemem wydaje się wymiana danych każdorazowo przy przesyłaniu > pakietu. To ma działać na localhost więc może jest 100% skuteczność > doręczenia? Jak ma działać na lokalnej maszynie, to czemu nie użyjesz np. pamięci dzielonej albo kolejek nazwanych (named pipes)? w.
Re: Pewna komunikacja UDP?
Author: Borneq
Date: Thu, 07 Sep 2017 20:25
Date: Thu, 07 Sep 2017 20:25
8 lines
1445 bytes
1445 bytes
W dniu 07.09.2017 o 12:18, Wojciech Muła pisze: > Jak ma działać na lokalnej maszynie, to czemu nie użyjesz np. pamięci > dzielonej albo kolejek nazwanych (named pipes)? Chciałem użyć boost.asio, tam były przykłady na echo. Pamięć dzielona może dobre rozwiązanie, ale jak po władowaniu do niej uruchomić drugą stronę. Może się przydać do UDP, wtedy wysyłał bym mały komunikat i w pamięci dzielonej miałbym więcej danych.
Re: Pewna komunikacja UDP?
Author: M.M.
Date: Fri, 08 Sep 2017 09:17
Date: Fri, 08 Sep 2017 09:17
11 lines
2038 bytes
2038 bytes
On Thursday, September 7, 2017 at 10:25:02 PM UTC+2, Borneq wrote: > W dniu 07.09.2017 o 12:18, Wojciech Muła pisze: > > Jak ma działać na lokalnej maszynie, to czemu nie użyjesz np. pamięci > > dzielonej albo kolejek nazwanych (named pipes)? > > Chciałem użyć boost.asio, tam były przykłady na echo. Pamięć dzielona > może dobre rozwiązanie, ale jak po władowaniu do niej uruchomić drugą > stronę. Rozumiem drugi program. Do tego celu służą semafory, generalnie synchronizacja. Pozdrawiam
Re: Pewna komunikacja UDP?
Author: Matt D.
Date: Fri, 08 Sep 2017 13:41
Date: Fri, 08 Sep 2017 13:41
30 lines
2249 bytes
2249 bytes
On 9/7/2017 22:25, Borneq wrote: > W dniu 07.09.2017 o 12:18, Wojciech Muła pisze: >> Jak ma działać na lokalnej maszynie, to czemu nie użyjesz np. pamięci >> dzielonej albo kolejek nazwanych (named pipes)? > > Chciałem użyć boost.asio, tam były przykłady na echo. Pamięć dzielona > może dobre rozwiązanie, ale jak po władowaniu do niej uruchomić drugą > stronę. Boost.Interprocess do tego sluzy -- patrz ponizszy prosty przyklad (kod sluzy zarowno jako proces-serwer i proces-klient, ale trywialnie prosty do rozdzielenia): http://www.boost.org/doc/libs/release/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.sharedmemory.shared_memory_a_simple_example Dokumentacja: https://theboostcpplibraries.com/boost.interprocess http://www.boost.org/doc/libs/release/doc/html/interprocess.html Jak chcesz komunikacje przez siec, to przyjrzabylm sie tez ZeroMQ. "Hello World in C++" client: http://zguide.zeromq.org/cpp:hwclient server: http://zguide.zeromq.org/cpp:hwserver Jest wybor C++ Bindings: http://zeromq.org/bindings:cpp N.p., AZMQ Boost Asio + ZeroMQ: https://github.com/zeromq/azmq Pozdrawiam, Matt
Re: Pewna komunikacja UDP?
Author: PawelS cbrbob(at)wbcd(dot)pl
Date: Mon, 11 Sep 2017 17:56
Date: Mon, 11 Sep 2017 17:56
19 lines
1806 bytes
1806 bytes
Borneq pisze: > W dniu 06.09.2017 o 19:29, PawelS cbrbob(at)wbcd(dot)pl pisze: >> Proszę sprawdzić: SO_SNDBUF oraz SO_RCVBUF >> i podzielić się rezultatem, być może dane >> są buforowane przed wysłaniem. > > Udało się zrobić na UDP. Ma ograniczenia 1 KB na pakiet, ale ja będę > dostawał się jeszcze do mniejszych kawałków danych Czy mógłbyś nieco bardziej rozwinąć zdanie: "Ma ograniczenia 1 KB na pakiet" ? To chyba nie odnosi się do wielkości pakietu, czy ilości danych, które można przesłać w UDP (tak mam tu na myśli size_t len z deklaracji sendto()). Z moich przeprowadzonych testów w praktyce można wysłać i odebrać prawie 64kB (65536 Bajtów). Oczywiście zależy to też od środowiska, na FreeBSD napotkałem błąd przy wywoływaniu sendto() przy ustawionej wielkości bufora bliskiej 65536 Bajtów (nie pamiętam w tej chwili kodu błędu).
Re: Pewna komunikacja UDP?
Author: Borneq
Date: Mon, 11 Sep 2017 18:34
Date: Mon, 11 Sep 2017 18:34
8 lines
1292 bytes
1292 bytes
W dniu 11.09.2017 o 19:56, PawelS cbrbob(at)wbcd(dot)pl pisze: > Czy mógłbyś nieco bardziej rozwinąć zdanie: > można wysłać i odebrać prawie 64kB (65536 Bajtów). > Oczywiście zależy to też od środowiska, Może ma 64 kilobajty w linuxie bo testowałem najpierw rozwiązanie pod Windows i tam zawieszał się ponad 1 kB.
Re: Pewna komunikacja UDP?
Author: M.M.
Date: Tue, 12 Sep 2017 12:47
Date: Tue, 12 Sep 2017 12:47
12 lines
1974 bytes
1974 bytes
On Monday, September 11, 2017 at 8:34:40 PM UTC+2, Borneq wrote: > W dniu 11.09.2017 o 19:56, PawelS cbrbob(at)wbcd(dot)pl pisze: > > Czy mógłbyś nieco bardziej rozwinąć zdanie: > > > można wysłać i odebrać prawie 64kB (65536 Bajtów). > > Oczywiście zależy to też od środowiska, > > Może ma 64 kilobajty w linuxie bo testowałem najpierw rozwiązanie pod > Windows i tam zawieszał się ponad 1 kB. Ile czasu zyskujecie gdy przejdziecie z TCP na UDP? Pozdrawiam
Re: Pewna komunikacja UDP?
Author: Borneq
Date: Tue, 12 Sep 2017 14:47
Date: Tue, 12 Sep 2017 14:47
7 lines
1389 bytes
1389 bytes
W dniu 12.09.2017 o 14:47, M.M. pisze: > Ile czasu zyskujecie gdy przejdziecie z TCP na UDP? > Pozdrawiam Bardzo dużo, przynajmniej rząd wielkości. Baza HBase zapisuje bardzo szybko, natomiast najdłużej trwało nawiązywanie połączenia tcp, tak że przez TCP prawie cały czas zużyty byłby na te połączenia.
Re: Pewna komunikacja UDP?
Author: dawid.bautsch
Date: Fri, 15 Sep 2017 12:28
Date: Fri, 15 Sep 2017 12:28
10 lines
2125 bytes
2125 bytes
W dniu wtorek, 5 września 2017 21:31:52 UTC+2 użytkownik Borneq napisał: > Chcę zrobić komunikację między dwoma procesami na localhoscie przy > użyciu boost.asio. Po TCP na Windows szybko idzie ale na linuksie są > przestoje. Chcę zrobić UDP, ale tak, by nie czekać na odpowiedź w > nieskończoność ale gdy nie otrzymam odpowiedzi wysłać ponowienie. Czy > możliwe jest to przy użyciu boost.asio? Gdzieś pod skórą czuję, że próbujesz się do czegoś zabrać od złej strony. Z czego wynika wymóg niskich latencji? Generalnie w przypadku zaawansowanych aplikacji serwerowych w grę wchodzą modyfikacje kernela systemu (mówię o BSD & Linux) - można na tym sporo ugrać (rzędy kilkukrotnego zmniejszenia latencji). Jednak w tym wypadku uważam, że IPC rozwiąże Twój problem.
Re: Pewna komunikacja UDP?
Author: Borneq
Date: Fri, 15 Sep 2017 16:58
Date: Fri, 15 Sep 2017 16:58
6 lines
1240 bytes
1240 bytes
W dniu 15.09.2017 o 14:28, dawid.bautsch@gmail.com pisze: > Jednak w tym wypadku uważam, że IPC rozwiąże Twój problem. Jakie funkcje można wykorzystać? Obawiam się że UDP tez może być niezbyt szybkie, bo odczyt może być dopiero gdy system przerzuci się na inny proces, a nie od razu.
Re: Pewna komunikacja UDP?
Author: PawelS cbrbob(at)wbcd(dot)pl
Date: Sat, 16 Sep 2017 08:17
Date: Sat, 16 Sep 2017 08:17
14 lines
1686 bytes
1686 bytes
Borneq pisze: > W dniu 12.09.2017 o 14:47, M.M. pisze: >> Ile czasu zyskujecie gdy przejdziecie z TCP na UDP? >> Pozdrawiam > > Bardzo dużo, przynajmniej rząd wielkości. Baza HBase zapisuje bardzo > szybko, natomiast najdłużej trwało nawiązywanie połączenia tcp, tak że > przez TCP prawie cały czas zużyty byłby na te połączenia. Nie znam szczegółów działania komunikacji, ale skoro nawiązywanie połączenia tcp było czasowo kosztowne to takim razie zapytam: w jakim celu połączenie po nawiązaniu było zamykane ? Może wystarczy nawiązać połączenie i utrzymywać je (keep-alive).
Re: Pewna komunikacja UDP?
Author: Borneq
Date: Sat, 16 Sep 2017 13:15
Date: Sat, 16 Sep 2017 13:15
9 lines
1571 bytes
1571 bytes
W dniu 16.09.2017 o 10:17, PawelS cbrbob(at)wbcd(dot)pl pisze: > Nie znam szczegółów działania komunikacji, ale skoro > nawiązywanie połączenia tcp było > czasowo kosztowne to takim razie zapytam: > w jakim celu połączenie po nawiązaniu było zamykane ? > Może wystarczy nawiązać połączenie i utrzymywać je (keep-alive). Nie zamykałem, używałem komunikacji synchronicznej z biblioteki boost.asio, z przykładu na echo.
Re: Pewna komunikacja UDP?
Author: M.M.
Date: Sun, 17 Sep 2017 22:13
Date: Sun, 17 Sep 2017 22:13
21 lines
2668 bytes
2668 bytes
On Friday, September 15, 2017 at 2:28:53 PM UTC+2, dawid....@gmail.com wrote: > W dniu wtorek, 5 września 2017 21:31:52 UTC+2 użytkownik Borneq napisał: > > Chcę zrobić komunikację między dwoma procesami na localhoscie przy > > użyciu boost.asio. Po TCP na Windows szybko idzie ale na linuksie są > > przestoje. Chcę zrobić UDP, ale tak, by nie czekać na odpowiedź w > > nieskończoność ale gdy nie otrzymam odpowiedzi wysłać ponowienie. Czy > > możliwe jest to przy użyciu boost.asio? > > Generalnie w przypadku zaawansowanych aplikacji serwerowych w grę > wchodzą modyfikacje kernela systemu (mówię o BSD & Linux) - można na > tym sporo ugrać (rzędy kilkukrotnego zmniejszenia latencji). A jeśli tak, to prawdopodobnie można taniej zakupić gotową łatkę na jądro systemu. Nie znam tematu, ale na chłopski rozum oszczędności mogą wynikać chociażby na zmniejszeniu bezpieczeństwa systemu, bo w konkretnej sytuacji system może być zabezpieczony w inny sposób; albo dana cecha systemu w ogóle może nie być potrzebna. Kilka razy spotkałem się z sytuacją, w której poszukiwano programistów do pracy nad dostosowywaniem jądra systemu. Pozdrawiam
Re: Pewna komunikacja UDP?
Author: PawelS cbrbob(at)wbcd(dot)pl
Date: Mon, 18 Sep 2017 16:52
Date: Mon, 18 Sep 2017 16:52
19 lines
2060 bytes
2060 bytes
Borneq pisze: > W dniu 16.09.2017 o 10:17, PawelS cbrbob(at)wbcd(dot)pl pisze: >> Nie znam szczegółów działania komunikacji, ale skoro >> nawiązywanie połączenia tcp było >> czasowo kosztowne to takim razie zapytam: >> w jakim celu połączenie po nawiązaniu było zamykane ? >> Może wystarczy nawiązać połączenie i utrzymywać je (keep-alive). > > Nie zamykałem, używałem komunikacji synchronicznej z biblioteki > boost.asio, z przykładu na echo. W takim razie prawdopodobnie został użyty przykład, bez dokładniejszego zrozumienia co przykład pokazuje oraz jak działa biblioteka. Gdyby faktycznie nastąpiło nawiązanie połączenia tcp, które potem byłoby utrzymywane (keep-alive), to nawet nie pojawiłaby się w ogóle myśl, że nawiązywanie połączenia TCP jest bardzo kosztowne, że o wiele szybciej dane można przesłać przy UDP. Proszę mnie poprawić jeśli się mylę.
Re: Pewna komunikacja UDP?
Author: M.M.
Date: Tue, 19 Sep 2017 07:40
Date: Tue, 19 Sep 2017 07:40
27 lines
3082 bytes
3082 bytes
On Monday, September 18, 2017 at 6:52:32 PM UTC+2, PawelS cbrbob(at)wbcd(dot)pl wrote: > Borneq pisze: > > W dniu 16.09.2017 o 10:17, PawelS cbrbob(at)wbcd(dot)pl pisze: > >> Nie znam szczegółów działania komunikacji, ale skoro > >> nawiązywanie połączenia tcp było > >> czasowo kosztowne to takim razie zapytam: > >> w jakim celu połączenie po nawiązaniu było zamykane ? > >> Może wystarczy nawiązać połączenie i utrzymywać je (keep-alive). > > > > Nie zamykałem, używałem komunikacji synchronicznej z biblioteki > > boost.asio, z przykładu na echo. > W takim razie prawdopodobnie został użyty przykład, > bez dokładniejszego zrozumienia co przykład pokazuje > oraz jak działa biblioteka. > Gdyby faktycznie nastąpiło nawiązanie połączenia tcp, > które potem byłoby utrzymywane (keep-alive), > to nawet nie pojawiłaby się w ogóle myśl, > że nawiązywanie połączenia TCP jest bardzo kosztowne, > że o wiele szybciej dane można przesłać przy UDP. > Proszę mnie poprawić jeśli się mylę. Ja od początku uważam to samo, ale aplikacje komunikujące się po gniazdkach piszę raz na kilka lat, nie jestem ekspertem. Po nawiązaniu połączenia (chyba) nie ma dużego narzutu na transmisję w porównaniu do udp. Pozdrawiam
Re: Pewna komunikacja UDP?
Author: Borneq
Date: Mon, 02 Oct 2017 15:35
Date: Mon, 02 Oct 2017 15:35
20 lines
2059 bytes
2059 bytes
W dniu 08.09.2017 o 15:41, Matt D. pisze: > Boost.Interprocess do tego sluzy -- patrz ponizszy prosty przyklad (kod > sluzy zarowno jako proces-serwer i proces-klient, ale trywialnie prosty > do rozdzielenia): > > http://www.boost.org/doc/libs/release/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.sharedmemory.shared_memory_a_simple_example > Czy wystarczająco szybki? Okazuje się że nie tylko TCP, ale i UDP jest za wolne na moje potrzeby, nie działa szybciej lokalnie niż jest ograniczone przez zmianę kontekstu procesu: - klient pyta - system przechodzi do serwera, który wykonuje - system przechodzi do klienta z odpowiedzią Co prawda na nowych Linuksach jest zegar nie 100 a 1000 MHz, ale i tak dłużej znacznie trwa operacja wymiany komunikatów UDP niż sama operacja zapisu. Czy interprocess nie jest ograniczany takimi sprawami jak zmiana kontekstu? A jak działać na innej maszynie niż lokalny?
Szybkie zdalne wywołanie procedur
Author: Borneq
Date: Mon, 02 Oct 2017 15:52
Date: Mon, 02 Oct 2017 15:52
18 lines
2146 bytes
2146 bytes
W dniu 08.09.2017 o 15:41, Matt D. pisze: > http://www.boost.org/doc/libs/release/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.sharedmemory.shared_memory_a_simple_example > Czy działając na jednym komputerze nie ma szans na szybszą odpowiedź aż systemowy sheduler przełączy najpierw z klienta na serwer a potem znowu na klienta? Tak jest chyba z UDO a jak z boost.interprocess? też czekamy aż proces zwolni muteksa? A jak gdy mamy nie na jednym komputerze a w sieci lokalnej? W sieci lokalnej przesłanie całego megabajta trwa bardzo krótko. podczas gdy przełączanie się po każdym kawałku kilkuset bajtów trwało by długo. Więc może serwer gromadziłby wiele pakietów klienta, nie odpowiadając po każdym? Sytuacja jest taka: serwer zarządza bazą danych, zapis czy wyszukanie rekordu trwa błyskawicznie, zwłaszcza gdy nie trzeba się odwoływać do dysku a pobierać dane z cache pamięci. Teraz klient steruje serwerem wydając polecenie pobrania danych.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads