netpoll
Go'nun netpoll'ü Go runtime tarafından uygulanan temel bir I/O çoğullama mekanizmasıdır. Go'nun özdeş senkron programlama modeli (bağlantı başına bir Goroutine) ile yüksek performanslı ağ hizmetleri uygulamasını sağlar. Özü, işletim sistemi seviyesindeki I/O çoğullama sistem çağrılarının (Linux'un epoll'u gibi) Go Goroutine zamanlayıcısı ile derin entegrasyonudur.
Netpoll ve Yerel Go Net Arasındaki Karşılaştırma
1. Goroutine Sayısı
- Go Net: Bağlantı başına bir Goroutine.
- NetPoll: Bir Goroutine altında birden fazla bağlantı.
2. Goroutine Bağlam Değiştirme/Zamanlama Basıncı
- Go Net: Yüksek eşzamanlılık altında yüksek değiştirme basıncı. Go Net'in goroutine başına bir bağlantısı olduğu için, çok sayıda goroutine olduğunda sık değiştirme olur.
- NetPoll: Yüksek eşzamanlılık altında düşük değiştirme basıncı. NetPoll birden fazla bağlantı arasında bir goroutine paylaştığı için, daha az değiştirme olur.
3. Bellek Tüketimi
- Go Net: Bellek tüketimi bağlantı sayısı ile pozitif korelasyonludur. Yüksek eşzamanlılık Goroutine patlaması nedeniyle bellek basıncına neden olabilir.
- NetPoll: Önceden tamponlar tahsis eder ve bir tampon havuzu oluşturur.
4. Tetikleme Modu
- Go Net: Kenar Tetikli (ET) kullanır. Tüm veriyi bir seferde okur, uygulama basittir.
- NetPoll: Seviye Tetikli (LT) kullanır. Büyük belleği veri tamponları olarak önceden tahsis etmeye gerek yoktur.
5. Çekirdek ve Kullanıcı Katmanı Paylaşım Tampon Havuzu Desteği (Bir Kopya Daha Az)
- Go Net: Desteklenmez.
- NetPoll: Desteklenir. Doğrudan kullanıcılara verilen bir Tampon havuzunu yönetir, bir kopya daha az gerektirir.
6. Uygulanabilir Senaryolar
- Go Net: Düşük eşzamanlılık, basit senaryolar.
- NetPoll: Yüksek eşzamanlılık, düşük gecikmeli senaryolar.
Netpoll Tasarım Kavramları
1. Temel Mimari
Yerel ağ kütüphanesi epoll LT moduna göre geliştirilmiştir. Temel mimari aşağıdaki şekilde gösterilmektedir:

2. Goroutine'lerin Kullanımı
Bir poll nesne havuzu vardır. Her poll nesnesinin bir epoll'u vardır ve ayrı bir goroutine ile ilişkilendirilmiştir. Goroutine sayısı poll nesnelerinin sayısı ile tutarlıdır ve her poll nesnesi birden fazla dosya tanımlayıcısını (fd) dinleyebilir.
3. I/O Okuma/Yazma Mantığı
- Her poll nesnesi mevcut epoll'daki okunabilir/yazılabilir olayları sürekli olarak poll etmek için bir goroutine başlatır.
- Her epoll birden fazla fd ile ilişkilendirilmiştir ve her fd bir Buffer ile ilişkilendirilmiştir.
- Bir fd'den okunabilir olay duyulduğunda, veri Buffer'a okunur.
- Buffer'daki verileri sürekli olarak poll eder ve işler. Veri okuma tamamlandığında, sonraki işleme mantığının goroutine havuzu GoPoll'u yürütmesi için bildirir.
- Sistem çağrıları aracılığıyla çekirdek ile etkileşim tamamen netpoll tarafından kontrol edilir. Conn'a kullanıcı seviyesi okumalar ve yazmalar sadece paylaşılan Buffer üzerinde çalışır.
4. Avantajlar ve Dezavantajlar
Avantajlar: Yüksek eşzamanlılık yetenekleri için daha güçlü destek.
- Polling Buffer'daki verileri işler, bu yüzden verinin işlenmemesi durumu yoktur.
- Bir goroutine birden fazla bağlantıya karşılık gelir. Çok sayıda bağlantı olsa bile, kaynak zamanlama ve değiştirmenin genel gideri önemli değildir.
- Kullanıcı ve çekirdek tampon paylaşımını destekler, bir veri kopyalama işlemini azaltır ve verimliliği artırır.
Dezavantajlar: Daha fazla bellek gerektirir.
