2013-05-16 13 views
5

W celu opracowania wysoce obciążonej sieci aplikacji serwerowej na Linuksie, jaka architektura jest preferowana? Chodzi o to, że ta aplikacja zazwyczaj działa na maszynach z wieloma rdzeniami (wirtualnymi lub fizycznymi). Biorąc pod uwagę, że wydajność jest kluczowym kryterium, czy lepiej jest wybrać aplikację wielowątkową lub wersję wieloprocesową? Wiem, że dzielenie zasobów i synchronizacja w celu uzyskania dostępu do takich zasobów z wielu procesów wiąże się z dużym nakładem pracy związanym z programowaniem, ale jak wspomniano wcześniej, najważniejsza jest ogólna wydajność, więc możemy zignorować te rzeczy. A językiem programowania będzie C/C++.wydajność - aplikacje wielowątkowe lub wieloprocesowe

Słyszałem, że nawet aplikacje wielowątkowe (pojedynczy proces) mogą korzystać z wielu rdzeni i uruchamiać każdy wątek w innym rdzeniu niezależnie (o ile nie ma problemów z synchronizacją). A to planowanie odbywa się przez jądro. Jeśli tak, czy nie ma dużej różnicy w wydajności między aplikacjami wielowątkowymi a aplikacjami wieloprocesowymi? Nginx używa architektury wieloprocesowej i jest naprawdę szybki, ale czy można uzyskać taką samą wydajność w aplikacjach wielowątkowych?

Dzięki.

Odpowiedz

3

Procesy i wątki na linuksie są do siebie bardzo podobne - główną różnicą jest to, że cała pamięć wirtualna jest udostępniana, a także pewne rzeczy, takie jak obsługa sygnałów różnią się.

Powoduje to tańsze przełączanie kontekstu między wątkami (nie ma potrzeby kosztownych przeładowań MMU itp.), Ale niekoniecznie powoduje dużą różnicę w szybkości (szczególnie poza tworzeniem wątku).

Aby zaprojektować aplikację wymagającą dużych nakładów pracy, wystarczy zastosować architekturę z założoną architekturą (w przeciwnym razie system utworzy ogromną liczbę procesów/wątków i poświęci więcej czasu na ich zarządzanie niż faktycznie działa kod pracy), w którym reagujesz na wejścia/wyjścia na gniazdach i na podstawie tego, na których gniazdach działa dana operacja.

Słynny writeup temat problemów w takich sytuacjach jest „Problem C10K”, dostępny z http://www.kegel.com/c10k.html - opisuje różne podejścia I/O, tak, mimo że nieco przestarzały, jest to bardzo dobry wstęp.

Bądź ostrożny, zanim skoczysz głęboko w projekty przypominające reaktor, ale mogą one stać się nieporęczne i skomplikowane, więc sprawdź, czy nie możesz użyć biblioteki/języka, która zapewnia ładniejszą abstrakcję (Erlang jest moim osobistym faworytem w tym równie przydatne mogą być języki z programami typu Go.

+0

@ p-l: Dziękuję za odpowiedź. Tak, plan zakłada wykorzystanie architektury opartej na równomierności i działanie w oparciu o zdarzenia sieciowe. W czasie wykonywania nie są tworzone dodatkowe wątki i procesy. Biorąc to pod uwagę, nie widzisz różnicy w wydajności między aplikacjami wielowątkowymi i wieloprocesowymi? Na przykład: jeśli istnieje system z czterema rdzeniami, nie będzie zauważalnej różnicy w wydajności pomiędzy obydwoma architekturami? – sthustfo

+0

Największymi różnicami byłyby harmonogramy, które można modyfikować za pomocą powinowactwa jednostki cpu, przypinając każde zadanie (wątek/proces) do konkretnego procesora. Większe różnice mogą wynikać z rzeczywistej pracy wykonywanej przez proces serwera i interakcji z częścią sieciową. Mogą występować różnice w sposobie uzyskiwania dostępu do pamięci, ale mniej związane z różnicą wątków/procesów, co do dzielenia się pamięcią ogólnie w systemie NUMA - chociaż możliwe jest, że obecne jądra obsługują wykonywanie kopii segmentów kodu w różnych NUMA strefy (w przeszłości posiadały to samo dla jądra). –

1

Jeśli twoje wątki wykonują zadanie niezależnie od siebie, pod linuxem, po prostu nie ma powodu, aby nie używać wielu procesów. Wiele procesów zwiększyłoby zużycie pamięci, ponieważ każdy proces ma swoją prywatną przestrzeń pamięci, ale z drugiej strony dzielenie przestrzeni pamięci między niezależnymi wątkami jest najgorszą decyzją. Przełączanie kontekstowe między wątkami a procesami zwykle odbywa się lepiej dla procesów niż wątków, chociaż jest to trochę architektura i kod zależny. Procesy są bezpieczne, aby nie można ich było serializować za pomocą blokad i muteksów. Procesy są łatwiejsze w zarządzaniu i współdziałaniu z Linuksem. oto dobry dokument, który może Cię zainteresować (http://elinux.org/images/1/1c/Ben-Yossef-GoodBadUgly.pdf).

+0

Dzięki za odniesienie do dokumentu, bardzo pomocne. Wierzę, że percepcja, że ​​wątki są znacznie szybsze, pochodzi z wczesnych środowisk Windows, które tworzyły od zera kompletne procesy, w przeciwieństwie do widelca Linuksa, który jedynie duplikuje stos i początkowo zarówno proces potomny, jak i macierzysty dzielą te same segmenty pamięci. Myślę, że ten kod, chyba że wykonano wywołanie exec, nadal jest dzielony pomiędzy wszystkie procesy potomne i rodzica. – CyberFonic

Powiązane problemy