Skip to content

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

  1. Numero di Goroutine

    • Go Net: una Goroutine ha una sola connessione.
    • NetPoll: una Goroutine ha più connessioni.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. Scenari di Applicazione

    • Go Net: scenari semplici a bassa concorrenza.
    • NetPoll: scenari ad alta concorrenza e bassa latenza.

Idea di Progettazione di netpoll

  1. Architettura di Base La libreria di rete nativa è sviluppata basata sulla modalità epoll LT. L'architettura di base è mostrata nella figura seguente: Architettura di base netpoll

  2. 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.

  3. 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.
  4. 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.

Golang by www.golangdev.cn edit