Skip to content

netpoll

Le netpoll de Go est le mécanisme central de multiplexage I/O implémenté dans le runtime Go. Il permet à Go de réaliser des services réseau haute performance avec un modèle de programmation synchrone simple (une goroutine par connexion). Son essence réside dans l'intégration profonde des appels système de multiplexage I/O du système d'exploitation (comme epoll sous Linux) avec le planificateur de goroutines de Go.

Comparaison entre Netpoll et Go Net natif

  1. Nombre de goroutines Go Net : Une seule connexion par goroutine.

Netpoll : Plusieurs connexions par goroutine.

  1. Pression de changement de contexte des goroutines Go Net : Pression élevée en cas de forte concurrence. Comme Go Net associe une connexion à une goroutine, le nombre de goroutines est élevé et les changements de contexte sont fréquents.

Netpoll : Pression faible en cas de forte concurrence. Comme Netpoll partage une goroutine entre plusieurs connexions, les changements de contexte sont moins fréquents.

  1. Consommation mémoire Go Net : La consommation mémoire est corrélée au nombre de connexions. En cas de forte concurrence, l'explosion du nombre de goroutines peut entraîner une pression mémoire importante.

Netpoll : Pré-allocation des tampons, création d'un pool de tampons.

  1. Mode de déclenchement Go Net : Utilise le déclenchement par front (ET - Edge Triggered). Les données sont lues en une seule fois, l'implémentation est simple.

Netpoll : Utilise le déclenchement par niveau (LT - Level Triggered). Pas besoin de pré-allouer des tampons de données de grande taille.

  1. Support du partage de pool de tampons entre noyau et espace utilisateur (une copie de données en moins) Go Net : Non supporté.

Netpoll : Supporté. Gère un pool de tampons directement accessible à l'utilisateur, évitant une copie.

  1. Scénarios d'utilisation Go Net : Scénarios simples avec faible concurrence.

Netpoll : Scénarios avec forte concurrence et faible latence.

Approche de conception de netpoll

  1. Architecture de base La bibliothèque réseau native est développée sur la base du mode epoll LT, l'architecture de base est illustrée ci-dessous : Architecture de base netpoll

  2. Utilisation des goroutines Il existe un pool d'objets poll, chaque objet poll possède un epoll et une goroutine dédiée. Le nombre de goroutines correspond au nombre d'objets poll, chaque objet poll peut surveiller plusieurs descripteurs de fichiers (fd).

  3. Logique de lecture/écriture I/O

    • Chaque objet poll lance une goroutine qui sonde continuellement les événements de lecture/écriture sur l'epoll courant.
    • Chaque epoll est associé à plusieurs fd, chaque fd est associé à un tampon (Buffer).
    • Quand un événement de lecture est détecté sur un fd, les données sont lues dans le Buffer.
    • On sonde continuellement les données du Buffer, et quand les données sont complètes, on notifie le pool de goroutines GoPoll pour exécuter la logique de traitement suivante.
    • L'interaction avec les appels système du noyau est entièrement contrôlée par netpoll, les opérations de lecture/écriture sur Conn par l'utilisateur se font uniquement sur le Buffer partagé.
  4. Avantages et inconvénients

Avantages : Meilleure capacité à supporter la forte concurrence. - (1) Sonde continuellement les données du Buffer, aucun risque que les données ne soient pas traitées. - (2) Une goroutine pour plusieurs connexions, même avec un très grand nombre de connexions, la surcharge de changement de contexte reste faible. - (3) Supporte le partage de tampons entre utilisateur et noyau, réduit une opération de copie de données, améliore l'efficacité.

Inconvénients : Nécessite plus de mémoire.

Golang by www.golangdev.cn edit