1 / 17

Optimizarea algoritmilor de alocat porturi TCP/UDP î n Linux

Optimizarea algoritmilor de alocat porturi TCP/UDP î n Linux. Alexandru Copo ţ alex.mihai.c @gmail.com. As. Dr. Ing. Răzvan Deaconescu Ing. Daniel B ăluţă. Sesiunea de l icen ţe- Iulie 2012. Cuprins. Porturi în stiva de reţea Alocare de porturi la TCP Alocare de porturi la UDP

ulfah
Download Presentation

Optimizarea algoritmilor de alocat porturi TCP/UDP î n Linux

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Optimizarea algoritmilor de alocat porturi TCP/UDP în Linux Alexandru Copoţ alex.mihai.c@gmail.com As. Dr. Ing. Răzvan Deaconescu Ing. Daniel Băluţă • Sesiunea de licenţe- Iulie 2012

  2. Cuprins • Porturi în stiva de reţea • Alocare de porturi la TCP • Alocare de porturi la UDP • Adăugare hashtable la TCP • Concluzii • Întrebări Sesiunea de licenţe - Iulie 2012

  3. Porturi în stiva de reţea • Porturi pentru comunicaţii • 0-1023: porturi cunoscute • 1024-49151: porturi înregistrate pentru servicii • 49152–65535: porturi private, alocate dinamic • Ce este alocarea de porturi • bind() • connect() Sesiunea de licenţe - Iulie 2012

  4. Alocare porturi la TCP-Algoritm • Obţinerea unui port liber • Începe cu valoare aleatoare • Căutare în hashtable după număr port • Un port se poate reutiliza de mai mulţi sockeţi • Restricţie de reutilizare • Opţiunea SO_REUSEADDR Sesiunea de licenţe - Iulie 2012

  5. Alocare porturi la TCP-Neajunsuri • Se alocă duplicate (IP, Port) • Dar sunt destule porturi libere • La connect nu se vor putea folosi acele porturi Sesiunea de licenţe - Iulie 2012

  6. Alocare porturi la TCP-Idei • Soluţie încercată de Eric Dumazet • Adaugă flagul TCP_CLOSE în plus la o restricţie • Noua restricţie nu mai permite duplicate • Problemă rezolvată ! • Nu chiar • Regresii la alte aplicaţii: haproxy, amavisd • Folosire facilităţi nedocumentate • Idee bună, căutam altă soluţie Sesiunea de licenţe - Iulie 2012

  7. Alocare porturi la TCP-Soluţie • Permite controlarea restricţiei de reutilizare • Încearcă întâi să aloci porturi distincte • La final decide dacă poţi reutiliza un port Sesiunea de licenţe - Iulie 2012

  8. Alocare porturi la TCP-Rezultate • Performanţa ramâne aceeaşi: ~ 0.5 % • Fără duplicate (IP, Port): • Numărate folosind getsockname() • Apelurile connect() nu mai eşuează • Haproxy, amavisd funcţionează corect • Patchul e excelent, dar... lipseşte un spaţiu • A fost inclus cu succes în net-next Sesiunea de licenţe - Iulie 2012

  9. Alocare de porturi la UDP-Algoritm • UDP foloseşte 2 tabele hash: • Cheie de căutare port • Cheie de căutare port şi adresa • Căutare mereu în tabelul cel mai mic • Tabele hash folosite şi la recepţie pachet • Căutare socket destinaţie Sesiunea de licenţe - Iulie 2012

  10. Alocare de porturi la UDP-Problema • Performanţă scăzută: • Mulţi sockeţi bound pe INADDR_ANY • Recepţie pachet • Căutare socket destinaţie de 2 ori: • 1. Folosind cheia (port, adresa) => socket negăsit • 2. Folosind cheia (port, INADDR_ANY) => socket găsit Sesiunea de licenţe - Iulie 2012

  11. Alocare de porturi la UDP-Soluţie • Numără câţi sockeţi pe INADDR_ANY sunt • Dacă sunt mulţi, caută direct în primul hash • Sigur găsim socketul • Dar defavorizează alte cazuri Sesiunea de licenţe - Iulie 2012

  12. Alocare de porturi la UDP-Rezultate • RFC pe lista netdev • Caz foarte particular • Cel mai simplu e să mărim tabelele de hash • uhash_entries=65000 în kernel cmdline Sesiunea de licenţe - Iulie 2012

  13. Adăugare Hashtable la TCP-Problema • Performanţă scăzută: • Mulţi sockeţi bound pe acelaşi port • Hash după port devine aproape inutil • Găsirea unui port liber: O(n2) Sesiunea de licenţe - Iulie 2012

  14. Adăugare Hashtable la TCP-Încercări • Soluţie anterioară: • Implementare mai veche a lui Lucian Grijincu • N-a fost trimis patch pentru upstream • Asemănător cu ce se face la UDP • Căutare mereu în tabelul cel mai mic Sesiunea de licenţe - Iulie 2012

  15. Adăugare Hashtable la TCP-Soluţie • Adaptatla ultimaversiune de kernel • Corectatalgoritmul • Performanţe: bind() + listen() time Sesiunea de licenţe - Iulie 2012

  16. Adăugare Hashtable la TCP-Rezultate • Trimis patch pe lista netdev • Feedback puţin • Doar două companii interesate • Aduce multe schimbări în cod • Puţini utilizatori pentru a fi inclus upstream Sesiunea de licenţe - Iulie 2012

  17. Concluzii • Am dobândit cunoştinţe despre network internals • Am interacţionat cu o parte din comunitate • Functionalităţi corectate • Îmbunătăţiri de performanţă • Contribuţie upstream • Întrebări ? Sesiunea de licenţe - Iulie 2012

More Related