Wydaje się, że wszyscy mówią, że nazwane potoki są szybsze niż gniazda IPC. O ile są szybsze? Wolałbym używać gniazd, ponieważ mogą one komunikować się w dwie strony i są bardzo elastyczne, ale wybiorą prędkość zamiast elastyczności, jeśli jest to znaczna ilość.
linux
performance
sockets
ipc
named-pipes
user19745
źródło
źródło
pipe(2)
(hm,?mkfifo(3)
) może być zwycięzcą, ale nie dowiesz się, dopóki nie spróbujesz.Odpowiedzi:
Sugerowałbym, abyś najpierw wybrał łatwą ścieżkę, ostrożnie izolując mechanizm IPC, abyś mógł zmienić gniazdo na rurę, ale zdecydowanie najpierw wybrałbym gniazdo. Powinieneś być pewien, że wydajność IPC jest problemem przed prewencyjną optymalizacją.
A jeśli wpadniesz w kłopoty z powodu szybkości IPC, myślę, że powinieneś rozważyć przejście na pamięć współdzieloną zamiast używania potoku.
Jeśli chcesz przetestować szybkość transferu, powinieneś wypróbować socat , który jest bardzo wszechstronnym programem, który pozwala stworzyć prawie każdy rodzaj tunelu.
źródło
Najlepsze wyniki, jakie uzyskasz dzięki rozwiązaniu Shared Memory .
Nazwane potoki są tylko o 16% lepsze niż gniazda TCP .
Wyniki uzyskano dzięki benchmarkingowi IPC :
Wzorzec dla rur:
Test porównawczy FIFO (nazwanych potoków):
Test porównawczy kolejki wiadomości:
Test porównawczy pamięci współdzielonej:
Test gniazd TCP:
Test porównawczy gniazd domeny Unix:
Benchmark ZeroMQ:
źródło
Zgodzę się z shodanex, wygląda na to, że przedwcześnie próbujesz zoptymalizować coś, co nie jest jeszcze problematyczne. Jeśli nie wiesz , że gniazdka będą wąskim gardłem, po prostu ich użyję.
Wiele osób, które przysięgają na nazwane potoki, znajduje niewielkie oszczędności (w zależności od tego, jak dobrze wszystko inne zostało napisane), ale kończy z kodem, który spędza więcej czasu na blokowaniu odpowiedzi IPC niż na wykonywaniu pożytecznej pracy. Oczywiście, pomagają w tym schematy nieblokujące, ale mogą być trudne. Spędzając lata na wprowadzaniu starego kodu do współczesności, mogę powiedzieć, że w większości przypadków przyspieszenie jest prawie zerowe.
Jeśli naprawdę myślisz, że gniazda spowalniają cię, wyjdź z bramki, korzystając z pamięci współdzielonej, zwracając szczególną uwagę na to, jak używasz zamków. Ponownie, w rzeczywistości możesz znaleźć małe przyspieszenie, ale zauważ, że marnujesz jego część, czekając na blokady wzajemnego wykluczania. Nie zamierzam popierać podróży do piekła futexu (cóż, już nie całkiem piekło w 2015 roku, w zależności od twojego doświadczenia).
Funt za funt, gniazda są (prawie) zawsze najlepszym sposobem na IPC w przestrzeni użytkownika w ramach monolitycznego jądra .. i (zwykle) najłatwiejszym do debugowania i utrzymania.
źródło
Należy pamiętać, że gniazda niekoniecznie oznaczają IP (i TCP lub UDP). Możesz także użyć gniazd UNIX (PF_UNIX), które oferują zauważalną poprawę wydajności w porównaniu z połączeniem z 127.0.0.1
źródło
Jak często liczby mówią więcej niż uczucie, oto kilka danych: Potok a wydajność gniazd Unix (opendmx.net) .
Ten wzorzec pokazuje różnicę około 12 do 15% większej prędkości dla rur.
źródło
Jeśli nie potrzebujesz szybkości, najprostszym rozwiązaniem są gniazda!
Jeśli patrzysz na szybkość, najszybszym rozwiązaniem jest pamięć współdzielona, a nie nazwane potoki.
źródło
W przypadku komunikacji dwukierunkowej z nazwanymi potokami:
Nazwane potoki są dość łatwe do zaimplementowania.
Np. Zaimplementowałem projekt w C z nazwanymi potokami, dzięki standardowej komunikacji opartej na plikach wejściowych i wyjściowych (fopen, fprintf, fscanf ...) był tak łatwy i czysty (jeśli to również się zastanawia).
Zakodowałem je nawet w Javie (serializowałem i wysyłałem przez nie obiekty!)
Nazwane potoki mają jedną wadę:
źródło
Jeden problem z gniazdami polega na tym, że nie mają one sposobu na opróżnienie bufora. Jest coś, co nazywa się algorytmem Nagle, który zbiera wszystkie dane i opróżnia je po 40 ms. Więc jeśli jest to responsywność, a nie przepustowość, może być lepiej z potokiem.
Możesz wyłączyć Nagle za pomocą opcji gniazda TCP_NODELAY, ale wtedy koniec odczytu nigdy nie otrzyma dwóch krótkich wiadomości w jednym wywołaniu odczytu.
Więc przetestuj to, skończyłem bez tego i zaimplementowałem kolejki oparte na mapowaniu pamięci z muteksem pthread i semaforem w pamięci współdzielonej, unikając wielu wywołań systemowych jądra (ale dziś nie są już one zbyt wolne).
źródło
Nazwane rury i gniazda nie są funkcjonalnie równoważne; gniazda zapewniają więcej funkcji (na początek są dwukierunkowe).
Nie możemy powiedzieć, która będzie działać lepiej, ale podejrzewam, że to nie ma znaczenia.
Gniazda domeny uniksowej będą robić prawie to samo, co gniazda tcp, ale tylko na komputerze lokalnym iz (być może trochę) mniejszym narzutem.
Jeśli gniazdo Unix nie jest wystarczająco szybkie i przesyłasz dużo danych, rozważ użycie pamięci współdzielonej między klientem a serwerem (co jest DUŻO bardziej skomplikowane w konfiguracji).
Unix i NT mają „nazwane potoki”, ale mają zupełnie inny zestaw funkcji.
źródło
Możesz użyć lekkiego rozwiązania, takiego jak ZeroMQ [ zmq / 0mq ]. Jest bardzo łatwy w użyciu i znacznie szybszy niż gniazda.
źródło
nanomsg
. W każdym razie witaj i ciesz się tym wspaniałym miejscem i zostań jego aktywnym członkiem.