Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so:cursuri:curs-11 [2013/04/30 09:01]
razvan.deaconescu
so:cursuri:curs-11 [2019/05/11 15:35] (current)
razvan.deaconescu
Line 1: Line 1:
-====== Curs 11 - Virtualizare ​======+====== Curs 11 - Networking în sistemul de operare ​====== 
 + 
 +  * [[http://​elf.cs.pub.ro/​so/​res/​cursuri/​SO_Curs-11.pdf|Curs 11 - Networking în sistemul de operare (PDF)]] 
 + 
 +  * [[https://​docs.google.com/​document/​d/​1GwmgdsvzI6og_uCFicirW1dvF3hVBBOZ1JEb1G85CvQ/​edit?​usp=sharing|Notițe de curs]] 
 + 
 +  * Suport curs 
 +    * The Illustrated Network (Walter Goralski) 
 +      * Capitolele 11 și 12 
 +    * The Linux Programming Interface 
 +      * Capitolele 58, 60 și 61
  
 <​html>​ <​html>​
-<iframe src="http://prezi.com/embed/​f5fvcn_yp63v/​?bgcolor=ffffff&amp;​lock_to_path=0&​amp;​autoplay=0&​amp;​autohide_ctrls=0&​amp;​features=undefined&​amp;​disabled_features=undefined" width="​550" height="​400" ​frameBorder="0"></​iframe>​+  <​center>​ 
 +    ​<iframe src="https://docs.google.com/viewer?url=http://​elf.cs.pub.ro/​so/​res/​cursuri/​SO_Curs-11.pdf&embedded=true" width="​600" height="​480" ​style="border: none;"> 
 +    ​</iframe
 +  </center>
 </​html>​ </​html>​
  
-  * [[http://​prezi.com/​f5fvcn_yp63v/​curs-11-so/?​kw=view-f5fvcn_yp63v&​rc=ref-31844697 | Curs 11 - Virtualizare (Vizualizare Prezi)]] +===== Demo-uri =====
-  * [[http://​elf.cs.pub.ro/​so/​res/​cursuri/​SO_Curs-11.pdf | Curs 11 - Virtualizare (PDF)]]+
  
-  * Suport ​curs +Pentru parcurgerea demo-urilor,​ folosim [[http://​elf.cs.pub.ro/​so/​res/​cursuri/​curs-11-demo.zip|arhiva aferentă]]. Demo-urile rulează pe Linux. Descărcăm arhiva folosind comanda<​code bash> 
-    Operating System Concepts +wget http://​elf.cs.pub.ro/​so/​res/​cursuri/​curs-11-demo.zip 
-      Capitolul ​– Operating-System Structures +</​code>​ și apoi decomprimăm arhiva<​code bash> 
-        Secțiunea ​2.8 – Virtual Machines+unzip curs-11-demo.zip 
 +</​code>​ și accesăm directorul rezultat în urma decomprimării<​code bash> 
 +cd curs-11-demo/​ 
 +</​code>​ 
 + 
 +Acum putem parcurge secțiunile cu demo-uri de mai jos. 
 + 
 +==== Pregătire infrastructură ==== 
 + 
 +Ne propunem să urmărim modul în care se comportă comunicația între un client și un server pentru un număr mare de conexiuni și diverse configurații ale serverului. Vom varia dimensiunea bufferului de transmitere folosit de server și tipurile de implementare pentru server: 
 +  server simplu 
 +  server cu suport [[http://​man7.org/​linux/​man-pages/​man2/​sendfile.2.html|sendfile]] (//zero copy//) 
 +  * server multithreaded 
 +  * server event-based (folosește [[http://​man7.org/​linux/​man-pages/​man7/​epoll.7.html|epoll]]) 
 + 
 +Pentru început vom genera 10.000 (zece mii) de fișiere a câte 100 KB. Vom rula scriptul<​code bash> 
 +./​create-files 
 +</​code>​ 
 + 
 +Scriptul va dura câteva minute și va genera fișierele în forma ''​fileXYZT''​ în subdirectorul ''​in-data/''​. Aceste fișiere vor fi prelucrate de server. 
 + 
 +Pentru a obține executabilele de tip server aferente, vom folosi fișierul ''​Makefile'':<​code bash> 
 +make 
 +</​code>​ 
 +În urma rulării comenzii ''​make''​ rezultă patru fișiere executabile de tip server: 
 +  ​''​server'':​ executabil de tip server simplu 
 +  * ''​sendfile-server'':​ executabil de tip server cu suport [[http://​man7.org/​linux/​man-pages/​man2/​sendfile.2.html|sendfile]] (//zero copy//) 
 +  * ''​threaded-server'':​ server multithreaded 
 +  * ''​epoll-server'':​ server event-based 
 + 
 +În continuare vom folosi fiecare dintre aceste servere pentru transferul celor 10.000 de fișiere create. Vom exemplifica în secțiunea ​de mai jos pentru serverul simplu (dat de executabilul ''​server''​) urmând ca aceeași pași să fie urmați și pentru celelalte trei servere. 
 + 
 +==== Folosire server ==== 
 + 
 +Vom exemplifica scenariul de folosire a unui server pe fișierul ''​server.c''​ și executabilul aferent ''​server''​. În cadrul acestui fișier se creează un socket TCP de tip listener care apoi așteaptă, secvențial,​ cereri de la clienți și le execută **secvențial**. 
 + 
 +Presupunem că avem cele 10.000 de fișiere create în subdirectorul ''​in-data/''​. Serverul va aștepta conexiuni în care i se va preciza numele fișierelor pe care trebuie să le servească (unul pe conexiune). 
 + 
 +Pentru început pornim serverul:<​code bash> 
 +./server 
 +</​code>​ 
 +Acum serverul este în starea de așteptare de conexiuni. 
 + 
 +Pentru a genera conexiuni care să citească toate fișierele din subdirectorul ''​in-data/'',​ rulăm, într-o altă consolă, scriptul aferent:<​code bash> 
 +/​usr/​bin/​time -v ./​download-serial 
 +</​code>​ 
 +Scriptul va dura de ordinul minutelor. Ca urmare a rulării acestui script fișierele vor fi transferate,​ prin sockeți locali (//​localhost//​) în subdirectorul ''​out-data/''​. Putem verifica transferul corect al acestora cu ajutorul comenzii:<​code bash> 
 +diff -r in-data/ out-data/ 
 +</​code>​ 
 + 
 +Pentru a eficientiza transferul în partea clientului putem porni mai multe procese cu ajutorul scriptului<​code bash> 
 +/​usr/​bin/​time -v ./​download-parallel 
 +</​code>​ 
 +Scriptul va dura semnificativ mai puțin. 
 + 
 +Motivul este că serverul livrează foarte rapid fișierele (sunt mici și multe) și este mai eficient să vină mai multe cereri simultane pentru a le servi. Nu la fel ar fi stat lucrurile dacă erau fișiere mai mari și mai puține. 
 + 
 +Durata mare a rulării scriptului este datorată dimensiunii foarte mici a bufferului folosit în userspace pentru transfer. Observați în output-ul scripturile de mai sus numărul mare de schimbări de context realizate. Pentru a eficientiza acest lucru, vom altera dimensiunea bufferului, adică macro-ul ''​BUFFERSIZE''​ de la valoarea ''​10''​ la valoarea ''​8192''​. Vom recompila:<​code bash> 
 +make 
 +</​code>​ 
 +și apoi vom rula din nou cele două scripturi de download<​code bash> 
 +/​usr/​bin/​time -v ./​download-serial 
 +/​usr/​bin/​time -v ./​download-parallel 
 +</​code>​ 
 +Observăm că timpii au scăzut considerabil,​ la fel ca numărul de schimbări de context. 
 + 
 +==== Folosire alte servere ==== 
 + 
 +Aceeași pași ca mai sus pot fi realizați pentru celelalte trei servere: 
 +  * ''​sendfile-server''​ 
 +  * ''​threaded-server''​ 
 +  * ''​epoll-server''​ 
 + 
 +În cazul ''​sendfile-server'',​ fiind vorba de un transfer tip zero-copy, nu avem o dimensiune de buffer aferentă; acesta nu va putea fi variată. 
 +==== Concluzii ==== 
 + 
 +În mod obișnuit serverul simplu (''​server''​) ar trebui să aibă un comportament mai slab decât celelalte, lucru greu sesizabil în secțiunile de mai sus din câteva motive: 
 +  * Testele se desfășoară pe sistemul local, adică nu se resimte impactul rețelei. 
 +  * Testele se desfășoară pe sistemul local, adică toate procesele client și server rulează pe același procesor și cu același disc. 
 +  * Testele nu permit cu adevărat concurența mai multor conexiuni venite de la diverse stații pe Internet. Un server încărcat poate primi cvasi-simultan mii de conexiuni, moment în care varianta threaded sau event-based își dovedesc superioritatea. 
 +  * Pentru teste am folosit fișiere mici și multe. Asta înseamnă că un fișier este transmis instant și chiar un server cu funcționarea paralelă nu va dobândi un avantaj față de unul cu funcționare serială. 
 + 
 +Abordările de îmbunătățire a serverului nu se exclud. Putem avea un server multithreaded sau multiproces în care fiecare thread se ocupă de un număr dat de conexiuni pe care le gestionează folosind ''​epoll''​ sau un API echivalent. De obicei numărul de thread-uri sau procese va fi egal cu numărul de core-uri/​hyperthread-uri disponibile la nivelul sistemului pentru a folosi eficient resursele acestuia. De asemenea, pentru servire de conținut static, cu dimensiune precizată, se poate folosi ''​sendfile''​ pentru a delega transferul complet către nucleul sistemului de operare și a eficientiza și mai mult transferul. 
 + 
 +Un server care se dorește performant va fi supus benchmark-urilor și analizei atente a traficului pe care îl susține. Funcții de cazurile uzuale de folosire, serverul poate fi ajustat (//tuned//) pentru a servi cât mai eficient conținutul dorit.
so/cursuri/curs-11.1367301692.txt.gz · Last modified: 2013/04/30 09:01 by razvan.deaconescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0