Upload
mikolaj-olszewski
View
55
Download
0
Embed Size (px)
DESCRIPTION
O czym warto wiedzieć tworząc serwer sieciowy
Citation preview
#4: Architektura serweraMikoaj Olszewski
Jakie pytania po lekturze?
Dotychczasowy styl
Aplikacja w terminalu (konsola/screen)Komunikaty na standardowym wyjciuJeden proces, jeden wtekObsuga pojedynczego klienta
rodowisko uruchomieniowe
Logowanie
In [1]: import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)log = logging.getLogger(__name__)log.error('the system is down')
Poziomy logowania
DEBUGINFOWARNINGERRORCRITICAL
DemonizacjaDemon proces dziaajcy w tle, niezaleny od terminala i uytkownika
pena lista funkcjonalnociBiblioteka python-daemon$$ pip install python-daemon
Prosty przykad
ERROR:__main__:the system is down
import daemon
with daemon.DaemonContext(): do_main_program()
Peny przykad
rda$$ python demon.py start|stop|restart
Obsuga klientw
Przykadowy problemKlient: pytanie (?)Serwer: odpowied (. lub !)Katechizm polskiego dzieckaCz wsplna
Klient1. Poczenie z serwerem2. Wysanie pytania3. Oczekiwanie na pen odpowied4. Wypisanie odpowiedzi5. Zamknicie poczenia
rda
Prosty serwer1. Akceptacja poczenia2. Oczekiwanie na zakoczenie pytania3. Znalezienie odpowiedzi4. Wysanie odpowiedzi5. Po zakoczeniu danego poczenia obsuenie nowego
rda
Porwnanie
ledzenie
my_trace.py$python my_trace.py handle_client simple_server.py$ python my_trace.py client client.py host
localhost
34.229911 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)34.229963 sock.connect((hostname, port))34.230056 answers = []34.230059 for row in katechizm.qa:34.230062 sock.sendall(row[0])34.230092 answer = katechizm.recv_until(sock, ['.', '!']) 34.230201 question = katechizm.recv_until(client_sock, ['?']) 34.230243 answer = katechizm.qadict[question] 34.230246 client_sock.sendall(answer)34.230381 answers.append(answer)
tunel
ssh -N -R 4445:localhost:4444 ja@zdalnyssh -N -L 4445:localhost:4445 ja@zdalny
21.760634 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)21.760674 sock.connect((hostname, port))21.761172 answers = []21.761175 for row in katechizm.qa:21.761178 sock.sendall(row[0])21.761205 answer = katechizm.recv_until(sock, ['.', '!']) 21.762027 question = katechizm.recv_until(client_sock, ['?']) 21.762964 answer = katechizm.qadict[question] 21.762967 client_sock.sendall(answer)21.763361 answers.append(answer)
Benchmark
(venv)$ pip install funkloadTest(venv)$ fl-run-bench tests.py TestKatechizm.test_dialogKonfiguracja benchmarku
(venv)$$ KATECHIZM_SERVER=host fl-run-bench tests.py TestKatechizm.test_dialog(venv)$$ fl-build-report --html -o output bench.xml
Prosty serwer wyniki
Sewer zorientowany zdarzeniowo1. Akceptacja poczenia2. Nasuchiwanie informacji od wszystkich przyaczonych klientw w sposb nieblokujcy3. Obsuga aktualnego zdarzenia
przychodzce dane odczyt a do zakoczenia, nastpnie wysykawychodzce dane wysyka a do zakoczenia, nastpnie odbirzamknicie poczenia usunicie z listy
rda
Serwer zdarzeniowy wyniki
Zakrcony serwerTwistedSerwer zdarzeniowyPodobny do node.jsDua liczba dodatkw / protokow
rda
Zakrcony serwer wyniki
Sewer na zielonych wtkachgeventmonkey patching gniazd sieciowychzdarzeniawspprogramy
rda
Serwer zielonowtkowy wyniki
Serwer wielo- (-wtkowy)/(-procesowy)Wykorzystanie podejcia jednowtkowegoWielokrotne kopie wtkw / procesw
po jednym dla kadego klientaew. ograniczona pula zasobw
Moliwo wykorzystania operacji blokujcychWspdzielone gniazdo nasuchujceSposoby tworzenia wtkw / procesw
na starcie serweraprzy podczeniu klienta
rda
Serwer wielo... wyniki
SocketServerModu SocketServerTCPServer / UDPServerForkingMixIn / ThreadingMixInAutomatyczna kreacja wtkw / procesw przy akceptacji poczenia
rda
SocketServer wyniki
PodsumowanieProfesjonalny serwer
zdemonizowanyz logowaniemobsugujcy wielu klientw na raz
Zwikszenie wydajnoci serweramechanizm zdarzewtki / procesyload balancing
#4: Architektura serweraMikoaj OlszewskiJakie pytania po lekturze?Dotychczasowy styl
rodowisko uruchomienioweLogowaniePoziomy logowania
DemonizacjaProsty przykadPeny przykad
Obsuga klientwPrzykadowy problemKlientProsty serwerPorwnanieledzenielocalhosttunelBenchmarkProsty serwer wyniki
Sewer zorientowany zdarzeniowoSerwer zdarzeniowy wyniki
Zakrcony serwerZakrcony serwer wyniki
Sewer na zielonych wtkachSerwer zielonowtkowy wyniki
Serwer wielo- (-wtkowy)/(-procesowy)Serwer wielo... wyniki
SocketServerSocketServer wyniki
Podsumowanie