netpoll
Il netpoll di Go è il meccanismo fondamentale di I/O multiplexing implementato dal runtime di Go. Permette a Go di implementare servizi di rete ad alte prestazioni con un modello di programmazione sincrono e conciso (una Goroutine per connessione). La sua essenza è la combinazione profonda tra le system call di I/O multiplexing del sistema operativo sottostante (come epoll di Linux) e lo scheduler delle Goroutine di Go.
Confronto tra Netpoll e GoNet Nativo
Numero di Goroutine
- Go Net: una Goroutine ha una sola connessione.
- NetPoll: una Goroutine ha più connessioni.
Pressione di Switch del Contesto di Scheduling delle Goroutine
- Go Net: alta pressione di switch in alta concorrenza. Poiché GoNet ha una connessione per goroutine, quando il numero di goroutine è elevato, lo switch è frequente.
- NetPoll: bassa pressione di switch in alta concorrenza. Poiché NetPoll condivide una goroutine tra più connessioni, il numero di switch è ridotto.
Consumo di Memoria
- Go Net: il consumo di memoria è proporzionale al numero di connessioni. In alta concorrenza, l'esplosione del numero di Goroutine può causare pressione sulla memoria.
- NetPoll: alloca preventivamente buffer e crea un pool di buffer.
Modalità di Trigger
- Go Net: usa trigger Edge-Triggered (ET). Legge tutti i dati in una volta, implementazione semplice.
- NetPoll: usa trigger Level-Triggered (LT). Non è necessario allocare preventivamente memoria sufficientemente grande come buffer dati.
Supporto per la Condivisione del Pool di Buffer tra Kernel e User Space con Una Copia Dati in Meno
- Go Net: non supportato.
- NetPoll: supportato. Gestisce un pool di Buffer direttamente consegnato all'utente, riducendo una copia dati.
Scenari di Applicazione
- Go Net: scenari semplici a bassa concorrenza.
- NetPoll: scenari ad alta concorrenza e bassa latenza.
Idea di Progettazione di netpoll
Architettura di Base La libreria di rete nativa è sviluppata basata sulla modalità epoll LT. L'architettura di base è mostrata nella figura seguente:

Uso delle Goroutine Esiste un pool di oggetti poll. Ogni oggetto poll ha un epoll e una goroutine dedicata corrispondente. Il numero di goroutine è coerente con il numero di oggetti poll. Ogni oggetto poll può ascoltare più descrittori di file fd.
Logica di Lettura/Scrittura I/O
- Ogni oggetto poll avvia una goroutine per monitorare continuamente eventi leggibili/scrivibili sull'epoll corrente.
- Ogni epoll è associato a più fd, e ogni fd è associato a un Buffer.
- Quando viene rilevato un evento leggibile da fd, i dati vengono letti nel Buffer.
- Monitora e elabora continuamente i dati nel Buffer. Quando si rileva che i dati sono stati letti completamente, notifica il pool di goroutine GoPoll della logica di elaborazione successiva per l'esecuzione.
- L'interazione con le system call del kernel è completamente controllata da netpoll. La lettura/scrittura dell'utente su Conn opera solo sul Buffer condiviso.
Vantaggi e Svantaggi
- Vantaggi: capacità di supportare alta concorrenza più forte.
- (1) Elaborazione rotatoria dei dati nel Buffer, senza situazioni in cui i dati non vengono elaborati.
- (2) Una goroutine corrisponde a più connessioni. Anche se ci sono molte connessioni, l'overhead di switch e scheduling delle risorse non è elevato.
- (3) Supporta la condivisione del buffer tra utente e kernel, riducendo un'operazione di copia dati e migliorando l'efficienza.
- Svantaggi: richiede più memoria.
- Vantaggi: capacità di supportare alta concorrenza più forte.
