Windows ile saniyede milyonlarca datagramı işlemek mümkün müdür?


11

Küçük bir UDP çok noktaya yayın datagramı (çoğunlukla 100-400 Bayt) alan bir HPC uygulamasını bir düzine veya 200'e kadar çok noktaya yayın grubu (örneğin MSI-X ve RSS kullanarak ) yüksek oranda alıp alamayacağımı araştırıyorum. birden çok çekirdeğe ölçeklendirilir), paket başına biraz işlem yapar ve sonra gönderir. TCP ile gönderme Bir duvara çarpmadan ihtiyaç duyduğum kadar (6.4Gb / sn) çıkmayı başardım, ancak yüksek pps hızlarında datagram almak bir sorun haline geldi.

Windows 2012 R2'de 2 bağlantı noktalı 10 Gb ethernet NIC'li yüksek özellikli bir NUMA makinesinde yapılan son testte , saniyede yalnızca yüz binlerce UDP datagramı alabildim (erken düşüş, yani verileri gerçekten işlemeden, 2x12 çekirdek kullanarak uygulamanızın işlem yükünü denklemden çıkarın) ve test edilen 12 çok noktaya yayın grubunun çekirdek kısmı bir NUMA düğümünün 8 veya 10 çekirdeğine dağılmış görünüyordu ( Maks RSS kuyrukları ayarlandı - 16) - bir .net uygulamasıyla da olsa, yerel uygulamalar daha hızlı gidebilmelidir.

Ama Len Holgate sadece 500kpps de UDP paketlerini almak için yönetilen içinde onun yüksek performanslı Windows RIO testlerinin 1024 bayt UDP yükü kullanarak.

Gelen Qlogic en teknik inceleme (değil bahsedilen test edilen OS) için sınırlar ayarlanır (bu alma ve gönderme sonraki? İçerir, böylece) "süper küçük bir paket yönlendirme çok evreli" 5.7Mpps . Olarak eşya ile Linux ağ , sınırları ayarlanır 2Mpps için 1Mpps çekirdek başına (bildirildi daha fazla veya daha az doğrusal ölçeklendirme) ya da 15Mpps Bypass çekirdek özel çözümlerle.

Örn. Netmap

900Mhz'de çalışan tek bir çekirdek ile 10GigE bağlantısında hat hızında ( 14.88Mpps ) trafik üretebilir. Bu, paket başına yaklaşık 60-65 saat döngüsüne eşittir ve çekirdekler ve saat frekansı ile iyi ölçeklendirilir (4 çekirdekli, hat hızı 450 MHz'den daha düşük bir hızda elde edilir). Alım tarafında da benzer oranlara ulaşılmaktadır .

Peki, özellikle önde gelen paragrafta açıklandığı gibi UDP çok noktaya yayın alan Windows / Windows Server'ın (en son sürümlerini) ne kadar alabilirim?

Düzenle Linux'ta nasıl yapılacağı hakkında bir bulut yayınlama blog yazısı ve ilginç bir yorum bölümü var: Saniyede milyon paket nasıl alınır ve ilgili hacker haber yorumları sayfası vardır .


@Ramhound Teoride, muhtemelen Windows'da mümkündür. Fakat pratikte nasıl mümkün olabilir? Şimdiye kadar standart donanımda Linux'ta bu seviyelere ulaşan insanlardan birkaç raporla karşılaştım, ancak Windows'da herhangi bir yere yaklaşan tek bir rapor değil. Ve sence sorunun kapsamını nasıl azaltabilirim? Bu sadece: "Windows'taki en yüksek UDP çok noktaya yayın alma oranları nelerdir?". Sorumdaki metnin büyük kısmı, linux ile mümkün olduğunu göstermesi gereken ve ödevimi yaptığım örnekler.
Eugene Beresovsky

@Ramhound 'Linux'ta mümkünse Windows'ta mümkündür'. Ben sırasıyla katılmıyorum .. anında akla gelen bir sistem iptables olduğunu .. evet iyi şanslar o sistemi taklit pencerelerde. ^ _ ^
NiCk Newman

Aslında çok çalışmıyordum, bu yüzden her zaman yaptığım RIO testi için mevcut olan tüm kodları alabilir ve itmeye devam edebilirsiniz.
Len Holgate

Yanıtlar:


5

Microsoft'a göre, kendi laboratuarında deneyler gösterdi bunun "erken test belirli bir sunucu üzerinde" RIO , bunlar sap başardık

  • Kaybı olmadan 2Mpps RIO olmadan yani Windows Server 2008R2 içinde,
  • RIO kullanan Windows Server 8 üzerinde 4Mpps (ön sürüm)

Bu videodan ekran görüntüsü (44:33):

resim açıklamasını buraya girin

Yani sorumun cevabı şu Is it possible to process millions of datagrams per second with Windows?olurdu: Evet ve görünüşe göre Windows Server 2008R2'de RIO'dan bile önceydi.

Ancak, resmi rakamlara ek olarak, özellikle yayınlanmamış yazılımlarda, bir tutam tuzla alınması gereken, sadece bu sunumda verilen seyrek bilgiler, test hakkında birçok soru ve sonuçların nasıl doğru bir şekilde yorumlanacağı devam ediyor. En alakalı olanlar:

  1. Rakamlar Gönderme için mi? Alma? Veya Yönlendirme için (örneğin, Alma + Gönderme)?
  2. Hangi paket boyutu? -> Muhtemelen mümkün olan en düşük, genellikle pps rakamları hakkında övünmek için çalışırken yapılır
  3. Kaç bağlantı (TCP ise) / paket akışı (UDP ise) ? -> Muhtemelen iş yükünü dağıtmak için gerektiği kadar çok mevcut tüm çekirdekler kullanılabilir
  4. Hangi test kurulumu? Makine ve NIC özellikleri ve kabloları

İlki çok önemlidir, çünkü Gönderme ve Alma işlemleri farklı adımlar gerektirir ve performansta önemli farklılıklar gösterebilir. Diğer rakamlar için, olası en yüksek Mpps rakamlarını elde etmek için yüksek özellikli bir makinede çekirdek başına en az bir bağlantı / paket akışı olan en düşük paket boyutunun kullanıldığını varsayabiliriz.


Düzenleme Linux'ta Yüksek Performanslı Paket İşleme ile ilgili bir Intel belgesine rastladım ve buna göre (Linux)

platform saniyede yaklaşık 2 milyon işlem gerçekleştirebilir

standart Linux ağ yığınını kullanarak (2x8 çekirdekli fiziksel bir ana bilgisayarda). Bu istek / cevap testindeki bir işlem her ikisini de içerir

  1. bir UDP paketinin alınması
  2. bu paketin daha sonra iletilmesi

(netperf ağ sunucusunu kullanarak). Test paralel olarak 100 işlem yürütüyordu. Makalede, ilgilenenler için çok daha fazla ayrıntı var. Keşke Windows'un karşılaştırması için böyle bir şeyimiz olsaydı ... Neyse, işte bu istek / cevap testi için en alakalı grafik:

resim açıklamasını buraya girin


2

tl; Dr.

Kesin bir cevap vermek için daha fazla test gerekli görünüyor. Ancak durumdaki kanıtlar Linux'un Mpps iş yüklerini rutin olarak işleyen ultra düşük gecikme topluluğunda pratik olarak kullanılan işletim sistemi olduğunu gösteriyor. Bu, Windows ile imkansız olduğu anlamına gelmez, ancak Mpps sayılarına ulaşmak mümkün olsa da, Windows muhtemelen biraz geride kalacaktır. Ancak bunun test edilmesi gerekir ve örneğin bu sayıların ne (CPU) maliyetinin elde edilebileceğini bulmak için.

Not: Bu, kabul etmeyi düşündüğüm bir cevap değil. Bu soruya bir cevapla ilgilenen herkese nerede durduğumuz ve nerede daha fazla araştırma yapacağımızla ilgili bazı ipuçları vermek amaçlanmıştır.


Google'a göre, Windows ağından daha fazla performans elde etmek için RIO'yu test eden (ve sonuçları yayınlayan) tek kişi gibi görünen Len Holgate, blogunda yaptığı tek açıklamada tek bir IP / Port kombo kullandığını açıkladı UDP paketlerini göndermek için.

Başka bir deyişle, sonuçları Linux'taki testlerdeki tek çekirdekli rakamlarla biraz karşılaştırılabilir olmalıdır (8 iş parçacığını kullanıyor olmasına rağmen - kodunu henüz kontrol etmeden, sadece tek bir UDP paket akışını işlerken performans için zararlı görünüyor ve değil paketlerin ağır bir şekilde işlenmesini sağlar ve aslında sadece birkaç ipliğin kullanıldığından bahseder, bu da mantıklı olacaktır). Buna rağmen:

Sadece eski ve yeni API'lar arasındaki göreceli performansı karşılaştırmak için maksimum performans elde etmek için çok uğraşmıyordum ve bu yüzden testlerimde o kadar da iyi değildim.

Peki "daha fazla uğraşmak" dışında , daha kaba RIO dünyası için standart IOCP'nin (göreceli) konfor bölgesinden vazgeçen şey nedir ? En azından tek bir UDP paket akışı söz konusu olduğunda.

Ne anlama geldiğini tahmin ediyorum - RIO'nun çeşitli testlerinde çeşitli tasarım yaklaşımlarını denediği için - performansın son bitini sıkıştırmak için NIC ayarlarına ince ayar yapmamış olması. Bu, örneğin Alma Arabellek Boyutu durumunda , UDP alma performansı ve paket kaybı rakamları üzerinde büyük bir pozitif etkiye sahip olabilir.

Bununla birlikte, sonuçlarını doğrudan diğer Linux / Unix / BSD testleriyle karşılaştırmaya çalışırken sorun şudur: Çoğu test, "saniyedeki paketleri" sınırını zorlamaya çalışırken, mümkün olan en küçük paket / çerçeve boyutunu, yani Ethernet'i kullanır. 64 baytlık çerçeve. Len, 1024 baytlık paketleri (-> 1070 baytlık bir çerçeve) test etti (özellikle No-Nagle UDP için) size daha yüksek "saniye başına bit" rakamları verebilir, ancak daha küçük paketlerle pps sınırını zorlayamayabilir . Bu yüzden bu rakamları olduğu gibi karşılaştırmak adil olmaz.

Windows UDP'ye yönelik görevimin sonuçlarını özetlemek şu ana kadar performans alıyor:

  • Kimse ultra düşük gecikme ve / veya yüksek verim uygulamaları geliştirmeye çalışırken Windows'u gerçekten kullanmıyor, bu günlerde Linux kullanıyor
  • Hemen hemen tüm performans testleri ve gerçek sonuçlarla (yani sadece ürün reklamı değil) raporlar Linux veya BSD'de (öncü olduğunuz ve bize en az bir referans noktası verdiği için Len'e teşekkürler!)
  • Windows'taki UDP (standart soketler) Linux'tan daha hızlı / daha yavaş mı? Henüz söyleyemem, kendi testimi yapmak zorunda kalırdım
  • Windows'daki yüksek performanslı UDP (RIO vs netmap) Linux'tan daha hızlı / daha yavaş mı? Linux 900MHz, Windows'da tek bir çekirdek ile tam 10Gb hat hızını kolayca işler, yayınlanan en iyi durumda 1024 büyük UDP paket boyutu için% 43 veya 492kpps'ye kadar çıkabilir, yani daha küçük boyutlar için bps rakamları büyük olasılıkla önemli olacaktır. pps rakamları muhtemelen artacaktır (kesme işlemi veya başka bir çekirdek boşluk yükü sınırlayıcı faktör değilse).

Neden linux kullandıklarına gelince, bunun nedeni, netmap veya RIO gibi çekirdek değişikliklerini içeren (performans sınırlara zorlanırken gerekli) çözüm geliştirmenin, maaş çekleriniz Redmond'dan çıkmadığı sürece Windows gibi kapalı bir sistemle imkansız olduğu için olmalı, veya Microsoft ile özel bir sözleşmeniz var. Bu yüzden RIO bir MS ürünüdür.

Son olarak, Linux ülkesinde keşfettiğim ve olup bitenlere dair birkaç aşırı örnek vermek için:

Zaten 15 yıl önce, bazıları 1GbE NIC'de 800 mHz Pentium III CPU, 133 mHz ön veri yolu kullanarak 680kpps alıyordu . Düzenleme : Bunlar kullanıyorlardı tıklayın , çok standart ağ yığını atlar bir çekirdek modu yönlendirici, yani onlar "hile".

2013 yılında, Argon Tasarım yönetilen almak

35ns [nano saniye] kadar düşük ticaret gecikmelerini işaretleyin

Btw ayrıca iddia

Bugün ticaret için mevcut bilgi işlem kodunun büyük çoğunluğu Linux için x86 işlemci mimarileri üzerinde yazılmıştır.

ve Argon, Arista 7124FX anahtarını kullanıyor ( FPGA'ya ek olarak) bir işletim sistemine sahip

standart bir Linux çekirdeği üzerine inşa edilmiştir.


0

Farklı konfigürasyonları ve senaryoları mutlaka "ölçmeniz" gerekecektir. Bu AFAIK iki şirket tarafından sağlanan iki dişli ile yapılabilir. IXIA ve Spirent . Trafiği hat hızında pompalayabilen donanım tabanlı trafik jeneratörleri sunar. Sisteminizin çökebileceği hızı tespit edebileceğiniz rampa testi sunarlar. Cihazlar pahalıdır, ancak kiralayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.