Skip to content

netpoll

Netpoll Go adalah mekanisme I/O multiplexing inti yang diimplementasikan oleh runtime bahasa Go, yang memungkinkan Go untuk mengimplementasikan layanan jaringan berkinerja tinggi dengan model pemrograman sinkron yang ringkas (satu Goroutine per koneksi). Esensinya adalah menggabungkan secara mendalam system call I/O multiplexing底层 sistem operasi (seperti epoll di Linux) dengan scheduler Goroutine Go.

Perbandingan Netpoll dengan GoNet Asli

  1. Jumlah Goroutine

    • Go Net: Satu koneksi di bawah satu Goroutine.
    • NetPoll: Banyak koneksi di bawah satu Goroutine.
  2. Tekanan Pergantian Konteks Penjadwalan Goroutine

    • Go Net: Tekanan pergantian tinggi saat konkurensi tinggi. Karena GoNet memiliki satu koneksi untuk setiap goroutine, pergantian sering terjadi ketika jumlah goroutine banyak.
    • NetPoll: Tekanan pergantian kecil saat konkurensi tinggi. Karena NetPoll banyak koneksi berbagi satu goroutine, jumlah pergantian lebih sedikit.
  3. Konsumsi Memori:

    • Go Net: Konsumsi memori berkorelasi positif dengan jumlah koneksi, dapat menyebabkan tekanan memori karena ledakan jumlah Goroutine saat konkurensi tinggi.
    • NetPoll: Buffer dialokasikan sebelumnya, pool buffer dibuat.
  4. Metode Trigger

    • Go Net: Menggunakan Edge Triggered (ET). Membaca semua data sekaligus, implementasi sederhana.
    • NetPoll: Menggunakan Level Triggered (LT). Tidak perlu mengalokasikan memori yang cukup besar sebelumnya sebagai buffer data.
  5. Apakah Mendukung Berbagi Pool Buffer antara Kernel dan User Layer, Mengurangi Satu Kali Copy Data.

    • Go Net: Tidak mendukung.
    • NetPoll: Mendukung. Mengelola pool Buffer yang langsung diserahkan ke user, mengurangi satu kali copy.
  6. Skenario yang Cocok

    • Go Net: Skenario sederhana dengan konkurensi rendah
    • NetPoll: Skenario konkurensi tinggi dengan latensi rendah

Ide Desain Netpoll

  1. Arsitektur Dasar Pustaka jaringan asli dikembangkan berdasarkan mode epoll lt, arsitektur dasar seperti yang ditunjukkan pada gambar berikut: Arsitektur Dasar netpoll

  2. Penggunaan Goroutine Ada pool objek poll, setiap objek poll memiliki epoll, dan berkorespondensi satu-satu dengan goroutine. Jumlah goroutine konsisten dengan jumlah objek poll, setiap objek poll dapat mendengarkan banyak file descriptor fd.

  3. Logika Baca/Tulis IO

    • Setiap objek poll membuka goroutine untuk terus-menerus mem-polling event yang dapat dibaca/ditulis pada epoll saat ini.
    • Setiap epoll akan mengasosiasikan banyak fd, setiap fd mengasosiasikan satu Buffer.
    • Ketika event yang dapat dibaca terdengar dari fd, data akan dibaca ke Buffer.
    • Terus-menerus mem-polling dan memproses data di Buffer, ketika menemukan data telah dibaca sepenuhnya, akan memberi tahu goroutine pool GoPoll di belakang untuk mengeksekusi logika pemrosesan selanjutnya.
    • Interaksi dengan system call kernel sepenuhnya dikendalikan oleh netpoll, baca/tulis Conn di user layer hanya mengoperasikan Buffer yang digunakan bersama.
  4. Kelebihan dan Kekurangan Kelebihan: Kemampuan mendukung konkurensi tinggi lebih kuat.

    • (1) Mem-polling dan memproses data di Buffer, tidak ada situasi data tidak mendapat pemrosesan.
    • (2) Satu goroutine berkorespondensi dengan banyak koneksi, bahkan jika koneksi sangat banyak, overhead pergantian penjadwalan sumber daya tidak besar.
    • (3) Mendukung berbagi buffer antara user dan kernel, mengurangi satu operasi copy data, meningkatkan efisiensi.

    Kekurangan: Memerlukan lebih banyak memori.

Golang by www.golangdev.cn edit