Soru SMP sistemi üzerinde çok kuyruklu NIC ile çoklu okuma [kapalı]


Ağ arabiriminden programlanan paketler nasıl işlemciye, sonra işlemek için iş parçacıklarına nasıl iletilir? Paketlerin sıraya göre nasıl sıraya konulduğu, ne tür paketler, işlemci / bellek / uygulama / iş parçacığı ve çoklu iş parçacıklarına göre donanım kesintileri, olabildiğince çok yeniden paketleme / kopyalama işleminden kaçınmak için neler düşünülmelidir?

Linux 2.6.32 (evet, eski) ile Debian amd64 üzerinde 16 yerel iş parçacığı ile çalışan çok iş parçacıklı bir ağ daemon'um var (evet, eski), böylece uygulama yükü 16 CPU'ya yayılıyor. Ağ kartı, 8 MSI-X rx / tx kuyruğu desteği ile bir bnx2 (BCM5709S) 'dir. Her kuyruğun IRQ'su, / proc / irq / n / smp_affinity'de kesinti yakınlığını statik olarak eşleştirerek ayrı bir CPU'ya atanır (irqbalance hiçbir zaman iyi bir iş yapmadı) ve sıra karma türü (RSS tipi) varsayılan olan (IP src + dst) , TCP sport + dport), varsayılan sağlama anahtarı ile.

Tüm bunlar yükün yayılmasına yardımcı olur, fakat eşit olarak değil: Tipik olarak, diğer iş parçacıklarının iki katını (= saniye başına istek) yapan bir uygulama iş parçacığı ve bir işlemcinin (muhtemelen bu iş parçacığını kullanan kişi) softirq oranının iki katı olduğu bir uygulama iş parçacığı vardır. CPU'lar.

CPU'lar hiper-iş parçacığı etkinleştirildi, ancak yükü 'gerçek' çekirdeklere (gerçekten yapmam gereken) yaymak için henüz bir şey yapmadım.

Linux oldukça kapsamlı bir şekilde geliyor ağ ölçekleme belgesiama bazı boşlukları kaçırıyorum:

Doc, RSS yapılandırması hakkında şunları söylüyor:

Tipik bir RSS yapılandırması, aygıt yeterli sıraları destekliyorsa veya her bellek alanı için en az bir tane destekliyorsa, her bir CPU için bir sıra alır, burada bir bellek etki alanı belirli bir bellek düzeyini paylaşan bir CPU kümesidir (L1, L2). NUMA düğümü, vb.

S: Sunucum için CPU / önbellek / bellek etki alanı yapılandırmasını nasıl belirlerim?

Alma akışı yönlendirmesi (RFS) hakkında bilgi, paketi doğru CPU / iş parçacığına alma hakkındaki bazı sorularıma yanıt veriyor gibi görünüyor:

RFS'nin hedefi, paketleri tüketen uygulama iş parçacığının çalıştığı CPU'lara paketlerin çekirdek işlemlerini yönlendirerek datacache isabeti artırmaktır.

S: DNS çözümlemesi durumunda, genellikle bir sorgu paketi ve bir yanıt paketi vardır. Çok iş parçacıklı bir artalan ile, yalnızca tek bir iş parçacığı () + recvfrom () işlevini çalıştırır ve bu nedenle çalışmayı diğer iş parçacıklarına zamanlamadan önce tüm yeni gelen paketleri işlemek zorunda kalır mı? Bu özel durum, çatallı işlemden (CPU başına bir işlem) faydalanmak ister mi?

S: Akış yönlendirmesi alır mıyım, o zaman genellikle çok iş parçacıklı bir TCP daemon'una en uygunu uygulanır mı?

S: Çoklu iş parçacığına mı yoksa çok işlemli çalışmaya mı gidileceğini nasıl belirlersiniz? Açıkçası, paylaşılan bellek ve veri yapıları, kaynak çekişmesi, vb. Ama paket akışı ve uygulama dinleyicisi (ler) ile ilgili olarak düşünüyorum.

S: Akış yönlendirmesi yapılmadan veya basit UDP hizmetleri olmadan, bir paket 'yanlış' CPU'ya ulaşabilir ve bu nedenle bir şekilde 'doğru' CPU'ya yeniden planlanabilir mi? Bu bir NET_RX softırını tetikleyecek mi?

S: NIC kuyruğu ile CPU arasında bir NET_RX sofrası var mı? CPU ve dinleme parçacığı / süreci arasında da bir tane var mı? Alma ipi paketi bir çalışan iş parçacığına göre programlıyorsa, bu bir olasılık olabilir mi?

Ben Hutchings'in videosu veya ek detayları yok. netconf 2011 konuşmasıBu şeylerin çoğunu nerede kapsadığı. Slaytlar biraz kısa.

Kullanılabilir bir perf versiyonu ile daha yeni bir çekirdeğe yükseltmeye çalışacağım ve daha sonra CPU'ların neye bağlı olduğunu kontrol edeceğim, belki de bu daha yüksek yüklü CPU'nun diğerleriyle karşılaştırıldığında ne olduğunu bulmaya çalışacağım.

Not: Burada belirli bir sorunu çözmeye çalışmıyorum, bunun yerine Linux çekirdeğinde bu şeylerin nasıl çalıştığını anlamaya çalışıyorum. Ayrıca interrupt birleştirme için çeşitli seçeneklerin farkındayım.


8
2017-07-27 15:01


Menşei


Dikkat çekmek için bir şey: Yükün eşit olarak yayılması kötüdür. Yükün mümkün olduğunca az çekirdek üzerinde yoğunlaşmasını istiyorsunuz. Bu, rölanti / çalışma geçişlerinin sayısını azaltır ve CPU önbelleklerinin daha etkili kullanımını sağlar. Çekirdeklerin eşit olmayan kullanımı, çekirdeklerin bir kısmı azalıyor ve gecikme artmaktadır. - David Schwartz


Cevaplar: