2012-06-03 10 views
29

Pracuję nad serwerem proxy TCP, który zostanie umieszczony przed usługą TCP, która powinna obsłużyć od 500 do 1000 aktywnych połączeń z dzikiego Internetu.Jak wolne są gniazda TCP w porównaniu do nazwanych potoków w systemie Windows dla lokalnego hosta IPC?

Serwer proxy działa na tym samym komputerze co usługa i jest przeważnie przezroczysty. Usługa jest w większości nieświadoma istnienia serwera proxy, a jedynym wyjątkiem jest powiadomienie o rzeczywistym zdalnym adresie IP klientów.

Oznacza to, że dla każdego przychodzącego otwartego gniazda TCP są jeszcze dwa gniazda na serwerze: druga para w proxy, a druga w prawdziwej usłudze za serwerem proxy.

Rozmiary okien wysyłania i odzyskiwania dla dwóch gniazd proxy są ustawione na 1024 bajty.

Jakie są konsekwencje dla wydajności? Jak powolna jest ta konfiguracja? Czy powinienem starać się zmienić usługę, aby używała nazwanych potoków (lub innego mechanizmu IPC), czy gniazdo TCP lokalnego hosta jest w większości wydajnym IPC?

Połączenie dwóch aplikacji nie jest opcją. W tej chwili utknęliśmy w dwóch konfiguracjach procesu.

EDYCJA: Powodem posiadania dwóch oddzielnych procesów na tym samym sprzęcie jest ekonomia w 100%. Mamy tylko jeden serwer i nie planujemy więcej (bez pieniędzy).

Usługa TCP jest starszym oprogramowaniem w języku Visual Basic 6, które wykroczyło poza nasze oczekiwania. Proxy to C++. Nie mamy czasu, pieniędzy ani siły roboczej, aby przepisać i przenieść kod VB6 do nowoczesnego środowiska programistycznego.

Pośrednik to nasza próba złagodzenia konkretnego problemu z wydajnością usługi, którą otrzymujemy od czasu do czasu.

Pełnomocnikiem jest open source, and here is the project source code.

+3

Wewnę trzne połĘ ... czenie TCP bę dzie wdrażane tak wydajnie, jak to tylko możliwe (czytaj: jako dwukierunkowa rura lokalna lub czymś podobnym) na dowolnym nowoczesnym stosie sieci wartym jego soli, wię c byłbym zaskoczony (i trochę rozczarowany Microsoft), jeśli zauważalna jest różnica w wydajności między TCP i Named Pipes dla tego przypadku użycia. –

+1

@JeremyFriesner Zgadzam się z Tobą, chciałbym założyć, że tak jest w przypadku "Windows Server 2008". – vz0

Odpowiedz

1

http://msdn.microsoft.com/en-us/library/aa178138(v=sql.80).aspx

Pozwól Podsumowując dla ciebie. Jeśli martwisz się wydajnością, użyj protokołu TCP/IP. Ale jeśli masz naprawdę szybką sieć i nie martwisz się o wydajność, to Named Pipes będzie "schludny", ponieważ może zaoszczędzić ci trochę kodu.

Nie wspominając, jeśli pozostaniesz przy TCP, będziesz mieć coś, co można skalować, a nawet załadować zbalansowane, gdy nadejdzie czas.

Cheers,

+1

Dzięki. Jednak ten artykuł mówi o Sockets vs. Named Pipes w sieci dla IPC na różnych komputerach. Moje programy nigdy nie będą działać ani rozmawiać na osobnym sprzęcie. – vz0

+0

Bardziej trafne podsumowanie połączonego artykułu MSDN wyróżniłoby tę sekcję: "Jeśli aplikacja serwera działa lokalnie na komputerze z uruchomioną instancją Microsoft® SQL Server ™ 2000, opcjonalny jest lokalny protokół Named Pipes. Rury działają w trybie jądra i są niezwykle szybkie ". Nazwane potoki są szybsze niż TCP/IP dla IPC na tym samym komputerze. –

+1

Edytowane pytanie. – vz0

0

Jaki jest powód, aby mieć pełnomocnictwa na tej samej maszynie, po prostu ciekawy?

Zresztą:

Istnieje kilka metod IPC, TCP/IP, nazwanych potoków są porównywalne pod względem szybkości i złożoności. Jeśli naprawdę chcesz czegoś, co dobrze się skaluje i prawie nie ma narzutów: korzystaj z pamięci współdzielonej. Najlepiej stosować w połączeniu z algorytmem blokującym dostęp do wskaźników (lub użyć jednego bufora dla każdego czytnika (proxy/usługa) i programu piszącego (usługa/proxy)).

+1

Mamy tylko jeden serwer, nie możemy uruchamiać programów na różnych komputerach. – vz0

+1

@ vz0: To liczby ... cóż.Co mówi Dan: jeśli używasz protokołu TCP/IP dla IPC, możesz także przekraczać granice maszyny w razie potrzeby; w przeciwnym razie pamięć współdzielona jest najszybsza. –

+1

Edytowane pytanie. – vz0

1

W opisywanym scenariuszu lokalne połączenia TCP najprawdopodobniej nie będą wąskim gardłem. Oczywiście spowoduje to pewne obciążenie, ale powinno to być pomijalne, chyba że procesor jest już gorący.

Zakładając, że wykorzystanie procesora na serwerze zwykle wynosi mniej niż 50% (przy obecności proxy), nie warto martwić się o zminimalizowanie narzutu związanego z lokalnymi połączeniami TCP.

Jeśli użycie procesora jest regularnie wyższe niż 80%, prawdopodobnie powinieneś wykonać pewne profilowanie. Zacznę od porównania obciążenia procesora (lub, jeszcze lepiej, wydajności, jeśli można to zmierzyć w sposób znaczący), gdy serwer proxy jest na miejscu, kiedy nie jest. O ile serwer proxy nie wykonuje skomplikowanego przetwarzania, obciążenie związane z dodatkowymi połączeniami TCP jest prawdopodobnie znaczną częścią całkowitego obciążenia wprowadzonego przez serwer proxy, więc powinno to dać co najmniej oszacowanie rzędu wielkości, o ile " zyskać dzięki zastosowaniu bardziej wydajnej formy IPC.

29

Będzie to to samo (lub co najmniej nie mierzalnie różne). Winsock jest na tyle sprytny, aby wiedzieć, czy rozmawia z gniazdem na tym samym hoście, iw takim przypadku spowoduje zwarcie niemal wszystkiego poniżej IP i skopiuje dane bezpośrednio z bufora do bufora. Pod względem nazwanych potoków vs. gniazd, jeśli chcesz potencjalnie móc komunikować się z różnymi maszynami w przyszłości, wybierz gniazda. Jeśli wiesz, że nigdy nie będziesz tego potrzebował, wybierz tę, którą Twoi programiści znają najbardziej lub najwygodniej.

+3

Jasne o tym? Czy masz jakieś referencje? Wyobrażam sobie, że połączenia zwrotne powinny przepływać przez interfejs sieciowy i przechodzić przez stos sieciowy. W ten sposób mogą podlegać regułom filtrowania firewall. Tj. "Jeśli pakiet SYN pochodzi z locahost do localhost na port XYZ, upuść pakiet". Windows ma pewną (ukrytą) zaporę. – vz0

+2

@ vz0: Z mojego doświadczenia wynika, że ​​Zapora systemu Windows nigdy nie filtruje pakietów przesyłanych do hosta lokalnego. Na przykład można uruchomić serwer WWW i używać go na komputerze lokalnym bez konieczności zmiany reguł zapory sieciowej. –

+13

Moje odniesienia do tego są takie, że kiedyś pracowałem dla Microsoft w sieci Windows. Mimo to zapora działa na warstwie IP i wyższej, a to, o czym mówię, polega na tym, że system winsock powoduje zwarcie wszystkiego poniżej. Nie ma powodu, dla którego nie można zastosować reguł zapory ogniowej do pętli zwrotnej (poza oczywistymi "dlaczego miałbyś się tym przejmować?"). Rzeczy w pętli zwrotnej nadal przechodzą przez stos sieci, ale nie cały stos sieci, a pozostały narzut jest tak nieznaczny, że jest nieznaczny, chyba że robisz to dziesiątki tysięcy razy jednocześnie. –

24

Dla każdego, kto przyjdzie, aby przeczytać to później, chcę dodać pewne ustalenia, które odpowiadają na oryginalne pytanie.

Dla rozwijającego się narzędzia mamy klasę sieci, która może używać nazwanych potoków lub TCP z tymi samymi połączeniami.

Oto typowy pętla z powrotem transfer plików w naszym systemie testowym: Czas transferu

TCP/IP: 2,5 sekundy
Named Pipes transferowe czasowe: 3.1 Sekund

Teraz, gdy idziesz na zewnątrz maszyny i połączyć się ze zdalnym komputerem w sieci wydajność dla nazwanych potoków jest znacznie gorzej:

TCP/IP czas transferu: 12 sekund
Named Pipes transferowe czas: 2,5 minuty (yes minut)

Zdaję sobie sprawę, że jest to tylko jeden system (Windows 7). Uważam jednak, że jest to dobry wskaźnik tego, jak wolno można używać nazwanych potoków ... i wygląda na to, że TCP jest drogą do zrobienia.

+14

Komentarze na temat zdalnych nazwanych potoków są czerwonym śledziem dla pytania, które dotyczyło tego samego scenariusza. Nazwane potoki są naprawdę obiektami tego samego komputera, zaimplementowanymi przez jądro za pośrednictwem pamięci współużytkowanej. Zdalne nazwane potoki są naprawdę "prawdziwymi nazwanymi potokami" + SMB + zastrzeżony protokół do mapowania komunikacji z punktami końcowymi nazw potoku za pośrednictwem SMB. Istnieje wiele rzeczy, które mogą się zdarzyć w tych dodatkowych częściach, aby wpłynąć na wydajność, które nie mają nic wspólnego z "prawdziwą" nazwaną wydajnością potoku. –

+1

Gdzie znajduje się napisać: "Nazwane potoki są naprawdę obiektami tego samego komputera, zaimplementowanymi przez jądro za pośrednictwem pamięci współużytkowanej."? –

+0

jaki był rozmiar pliku? jak duże są pakiety? jakiego rodzaju rury/gniazda? IOCP? – paulm

Powiązane problemy