Migliorare le funzioni di rete per una performance migliore
Un tool trasforma le funzioni di rete a thread singolo in versioni multi-threaded efficienti.
― 6 leggere min
Indice
Nel mondo digitale di oggi, le funzioni di rete software (NF) giocano un ruolo fondamentale nel modo in cui i dati vengono gestiti e processati. Queste funzioni sono essenziali per gestire il traffico di rete, garantire la sicurezza e facilitare la comunicazione tra i diversi sistemi. Tuttavia, con l'evoluzione della tecnologia, la sfida di rendere queste funzioni più veloci ed efficienti è diventata sempre più importante.
Tradizionalmente, le NF sono progettate per essere flessibili e facili da implementare, ma questo ha un costo in termini di prestazioni. Per migliorare la velocità, il traffico viene spesso distribuito su più core CPU. Questo metodo solleva una sfida significativa: come possiamo assicurarci che le NF possano funzionare in parallelo senza perdere la loro funzione originaria?
Questo articolo discute una soluzione proposta che converte automaticamente una versione a thread singolo di una NF software in una versione multi-thread senza alterare le sue operazioni di base. Usando una tecnica particolare, possiamo rilevare come la NF gestisce i suoi dati e distribuire i compiti tra i core CPU in modo efficiente.
Parallelizzazione
La Sfida dellaLa parallelizzazione significa distribuire i compiti tra diversi processori o core per accelerare il processo. Idealmente, quando si parallelizza una NF, ogni core opera in modo indipendente su carichi di lavoro distinti senza interferenze. Questo richiede di gestire con attenzione i dati condivisi per evitare conflitti, che possono rallentare il processo o portare a errori.
Le NF spesso mantengono dati che vengono accessibili da più thread, rendendo difficile l'operazione efficiente in parallelo. Se più core cercano di accedere o modificare gli stessi dati simultaneamente, possono sorgere problemi, come condizioni di gara o corruzione dei dati. Pertanto, ridurre al minimo la quantità di dati condivisi e implementare un accesso ai dati efficiente è cruciale.
Metodi Tradizionali
Tradizionalmente, gli sviluppatori creano versioni multiistanza delle NF. Questo implica la creazione di più processi separati che gestiscono ciascuno il proprio traffico. Sebbene questo possa funzionare, richiede che gli sviluppatori abbiano una profonda conoscenza di come opera la NF e di come distribuire al meglio il traffico utilizzando le funzionalità hardware.
Ad esempio, per bilanciare il traffico usando una tecnica chiamata Receive Side Scaling (RSS), gli sviluppatori devono definire come fare l'hashing dei dati in arrivo per distribuirli correttamente tra i diversi core. Tuttavia, questo processo è complesso e può portare a inefficienze se fatto in modo errato.
Una Nuova Soluzione
La soluzione proposta introduce uno strumento progettato per analizzare le NF sequenziali esistenti e convertirle automaticamente in versioni parallele. Questo strumento esamina come opera una NF e come mantiene il suo stato. Poi configura le impostazioni RSS per garantire che dati simili siano elaborati dallo stesso core, eliminando effettivamente la necessità di condivisione e coordinamento complessi dei dati.
Idee Chiave
Due idee chiave supportano questa soluzione. Prima di tutto, lo strumento analizza la NF per comprendere la sua gestione dello stato in modo efficiente. In secondo luogo, configura l'RSS per inviare pacchetti che modificano gli stessi dati allo stesso core, riducendo il coordinamento e consentendo prestazioni migliori.
Utilizzare l'Esecuzione Simbolica
Lo strumento utilizza un metodo chiamato esecuzione simbolica per creare un modello dettagliato di come la NF gestisce i dati. Questo modello aiuta a identificare le connessioni tra diversi pacchetti e come si relazionano ai dati che la NF gestisce. Comprendendo queste relazioni, lo strumento può determinare il modo migliore per suddividere il traffico tra i core disponibili.
Esempi di Funzioni di Rete
Le funzioni di rete possono assumere varie forme, tra cui Firewall, bilanciatori di carico e monitor di traffico. Ognuna di queste funzioni ha uno scopo unico ma condivide sfide comuni riguardo alla parallelizzazione.
Firewall
Un firewall esamina il traffico in entrata e in uscita e determina se i pacchetti debbano essere autorizzati. Di solito tiene traccia delle connessioni in corso usando un metodo chiamato tracciamento a stato. Comprendendo quali pacchetti appartengono alla stessa connessione, il firewall può elaborarli in modo efficiente, assicurandosi che pacchetti correlati raggiungano lo stesso core senza sovraccarichi inutili.
Bilanciatore di carico
I bilanciatori di carico distribuiscono il traffico in entrata tra più server. Mantengono informazioni su quale server gestisce quali connessioni per garantire che nessun singolo server venga sopraffatto. Quando implementato in modo parallelo, il bilanciatore di carico deve mantenere la stessa logica di gestione delle connessioni tra i vari core per mantenere un flusso di pacchetti senza soluzione di continuità.
Monitor di Traffico
I monitor di traffico analizzano i dati che fluiscono attraverso la rete per rilevare modelli o problemi. Possono tenere traccia delle diverse connessioni che avvengono in qualsiasi momento e riportare sui flussi di dati. Simile ai firewall, anche i monitor di traffico richiedono un modo per tenere traccia delle connessioni senza causare colli di bottiglia nelle prestazioni.
Generare un'Implementazione Parallela
Lo strumento genera automaticamente una versione parallela della NF seguendo una pipeline strutturata. Questa pipeline è composta da tre fasi principali:
Generazione di Vincoli: Lo strumento analizza prima il modello di NF per determinare come vengono accessi e mantenuti i dati. Identifica vincoli che dettano quali pacchetti devono essere elaborati insieme per mantenere la funzionalità della NF.
Configurazione RSS: Successivamente, lo strumento formula le impostazioni RSS basate sui vincoli identificati. Questo garantisce che i pacchetti che interagiscono con gli stessi dati siano inviati allo stesso core.
Generazione di Codice: Infine, lo strumento genera una nuova implementazione parallela della NF che segue le regole stabilite e ottimizza le prestazioni. Questo include la creazione di istanze di stato designate per ogni core, la configurazione dell'RSS e l'assicurazione che i modelli di accesso ai dati non interferiscano tra loro.
Valutazione delle Prestazioni
Una volta generate le NF parallele, le loro prestazioni possono essere valutate. Questo implica valutare quanto bene scalano con il numero di core CPU e capire come si comportano sotto diversi tipi di traffico.
Scalabilità
Valutare la scalabilità significa misurare quanto aumenta la prestazione man mano che più core vengono aggiunti al compito. Idealmente, un aumento nel numero di core dovrebbe portare a un incremento proporzionale delle prestazioni, ma questo è spesso limitato da fattori hardware come la larghezza di banda PCIe.
Impatto del Carico di Lavoro
Il tipo di traffico elaborato influisce anche sulle prestazioni. Alcuni modelli di traffico, come quelli visti in ambienti aziendali tipici, si distribuiscono uniformemente su più flussi, mentre altri possono mostrare flussi "elefante", in cui un numero ridotto di connessioni trasporta la maggior parte dei dati. Le prestazioni della NF possono variare significativamente a seconda di questi fattori.
Conclusione
Lo strumento proposto per generare automaticamente versioni parallelizzate delle funzioni di rete software può migliorare significativamente le prestazioni della rete. Gestendo in modo efficiente i compiti tra più core CPU mantenendo la semantica della funzione originale, questo strumento riduce il carico sugli sviluppatori e consente un miglior throughput in scenari di alto traffico.
Con la continua evoluzione della tecnologia, soluzioni come questa possono aiutare le organizzazioni a tenere il passo con le crescenti richieste di velocità ed efficienza nella gestione della rete. Il futuro delle funzioni di rete sembra promettente mentre gli strumenti automatizzati facilitano l'adattamento a ambienti e esigenze di prestazioni in cambiamento.
Titolo: Automatic Parallelization of Software Network Functions
Estratto: Software network functions (NFs) trade-off flexibility and ease of deployment for an increased challenge of performance. The traditional way to increase NF performance is by distributing traffic to multiple CPU cores, but this poses a significant challenge: how to parallelize an NF without breaking its semantics? We propose Maestro, a tool that analyzes a sequential implementation of an NF and automatically generates an enhanced parallel version that carefully configures the NIC's Receive Side Scaling mechanism to distribute traffic across cores, while preserving semantics. When possible, Maestro orchestrates a shared-nothing architecture, with each core operating independently without shared memory coordination, maximizing performance. Otherwise, Maestro choreographs a fine-grained read-write locking mechanism that optimizes operation for typical Internet traffic. We parallelized 8 software NFs and show that they generally scale-up linearly until bottlenecked by PCIe when using small packets or by 100Gbps line-rate with typical Internet traffic. Maestro further outperforms modern hardware-based transactional memory mechanisms, even for challenging parallel-unfriendly workloads.
Autori: Francisco Pereira, Fernando M. V. Ramos, Luis Pedrosa
Ultimo aggiornamento: 2023-10-13 00:00:00
Lingua: English
URL di origine: https://arxiv.org/abs/2307.14791
Fonte PDF: https://arxiv.org/pdf/2307.14791
Licenza: https://creativecommons.org/licenses/by/4.0/
Modifiche: Questa sintesi è stata creata con l'assistenza di AI e potrebbe presentare delle imprecisioni. Per informazioni accurate, consultare i documenti originali collegati qui.
Si ringrazia arxiv per l'utilizzo della sua interoperabilità ad accesso aperto.