170 likes | 277 Views
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
E N D
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Adăugare Hashtable la TCP-Soluţie • Adaptatla ultimaversiune de kernel • Corectatalgoritmul • Performanţe: bind() + listen() time Sesiunea de licenţe - Iulie 2012
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
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