Ubuntu'da düşük gecikmeli TCP ayarları


10

Laboratuvarımda Ubuntu üzerinde çalışan ölçümler için bir sunucu var. Ve TCP bağlantısı üzerinden veri alan ve mümkün olan en kısa zamanda bir cevap göndermesi gereken C programı var.

Yapılandırma

  • İşlemciler: 2 işlemci x 4 çekirdek - Intel (R) Xeon (R) CPU E5345 @ 2.33GHz
  • Rastgele erişimli hafıza: 12 GB
  • NIC: Intel Corporation 80003ES2LAN Gigabit Ethernet Denetleyicisi / 82546EB Gigabit Ethernet Denetleyicisi
  • Ağ anahtarı: Cisco Catalyst 2960
  • Veri bilgisi: Veri blokları yakl. her 10 milisaniyede bir. Veri bloğu boyutu yakl. 1000 bayt.

Paket alırken ağ gecikmesi çok kritiktir (onlarca mikrosaniye önemlidir). Programı en üst düzeye çıkardım, ancak Ubuntu ile ilgili hiçbir deneyimim yok.

Ubuntu'da paketleri işleme / gönderme yerel gecikmesini azaltmak için ne yapılandırılabilir?


Evet, sunucunun markasını / modelini bilmek istiyorum.
ewwhite

çok daha derine inmelisin. yüksek frekans ticareti için çekirdek optimizasyonu hakkında bazı şeyler okuyun. Fe satış Cisco Paper: cisco.com/c/dam/en/us/products/collateral/switches/… böylece her iki tarafta da iyi bir PCI-E Kart almak biraz tasarruf sağlayacaktır. Büyük olasılıkla (bunun için ne kadar zaman harcamak istediğinize bağlı olarak) en azından farklı ayarlarla çekirdeği yeniden oluşturacaksınız, ubuntu'nun ihtiyaç duyduğu bir çok şeyi kaldırabilirsiniz, ancak ihtiyacınız yoktur. Yani yorumlarda ewwhite yazdığı gibi, ubuntu en düşük ayarlar için mükemmel olmayabilir.
Dennis Nolte

Listelenen donanımla birlikte, 2008 dönemi ekipmanı (Intel 5300 serisi CPU'lar). O zamanlar, çok fazla özel düşük gecikmeli donanım değişikliği mümkün değildi. Sistem BIOS'unu yüksek performanslı modda çalışacak ve CPU C-Durumlarını devre dışı bırakacak şekilde ayarlamıştım.
ewwhite

@whwhite Evet, 2008 dönemi ekipmanları konusunda haklısınız. Ben önerilerinizi deneyeceğim. Teşekkür ederim!
Alex V

TCP_NODELAY için bu yazılımı değiştirebilir misiniz?
Matt

Yanıtlar:


10

Dürüst olmak gerekirse, bunun için Ubuntu kullanmazdım ... ama herhangi bir Linux varyantına uygulanabilecek seçenekler var.

Ağ yığını tamponlarınızı arttırmak isteyeceksiniz:

net.core.rmem_default = 10000000
net.core.wmem_default = 10000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

Uygulama diske yazıyorsa, bir zamanlayıcı / asansör değişikliği gerekebilir (örn. deadlineAsansör).

Sunucu düzeyinde, CPU düzenleyicisini, güç ve CPU frekans yönetimini (P-Durumları, C-Durumları) değiştirebilirsiniz.

İşletim sistemi düzeyinde, uygulamanızın gerçek zamanlı önceliğini değiştirebilir ( chrt), kesintileri azaltmak için optimize edebilir, bir CPU veya CPU grubuna sabitleyebilir ( taskset) ve gereksiz hizmetleri veya artalanları durdurabilirsiniz.

Ayrıca bazı önerileri de görebilirsiniz: 2 Linux ana bilgisayarı arasındaki gecikme sorunlarını giderme

İlgili donanımı veya ağ ekipmanını bilmeden daha spesifik olmak zordur.


3
Burası gerçekten dini tartışmalar için uygun bir yer değil. Sohbet gibi başka bir yere götürün.
Michael Hampton

1
@MichaelHampton Soru ile ilgili tartışmada ilginç bağlantılar vardı: Red Hat Realtime Tuning Guide .
Alex V

6

Yüksek performans rotasına gidiyorsanız, genellikle uygulamanıza müdahale edecekleri kadar mümkün olduğunca az sayıda (planlanmış) süreç çalıştırmak istersiniz.

Klasik UNIX işletim sistemleri gibi Linux da aynı anda birden çok uygulamayı adil bir şekilde çalıştırmak üzere tasarlanmıştır ve kaynak açlığını önlemeye çalışır ve bunun tersini hedeflersiniz, uygulamanız dışındaki diğer her şeyi aç bırakırsınız. İşletim sistemi düzeyindeki basit adımlar, uygulamanızın güzel düzeyini ve gerçek zamanlı önceliğini değiştirmek, zamanlayıcıyı değiştirmek veya gerçek zamanlı bir çekirdeğe gitmektir.

TCP / IP genellikle bağlantı düşüşlerini önlemek ve mevcut bant genişliğini verimli kullanmak için ayarlanır. Bazı ara bağlantıların daha kısıtlı olduğu bir bağlantıdan mümkün olan en yüksek bant genişliğini elde etmek yerine çok hızlı bir bağlantıdan mümkün olan en düşük gecikmeyi elde etmek için, ağ yığınının ayarını ayarlayacaksınız.

 sysctl -a 

size ayarlayabileceğiniz bir dizi çekirdek ayarı gösterir. Ayarlar, IPv4 veya IPv6 kullanıp kullanmadığınıza ve uygulamanızda zaten tam olarak ne yaptığınıza, ancak ilginizi çekebileceğine bağlıdır:

  • net.ipv4.tcp_window_scaling=1 RFC 1323 - 64K'dan büyük IPV4 TCP pencere boyutları desteği - genellikle yüksek bant genişliği ağlarında gerekir
  • net.ipv4.tcp_reordering=3 IPV4 paketinin TCP paket akışında TCP kaybı olmadan ve yavaş başlangıca geçilmeden yeniden sıralanabilir.
  • net.ipv4.tcp_low_latency=1yüksek verim yerine düşük gecikmeyi tercih etmeyi amaçlayan; setting = 1, IPV4 tcp önkolu işlemini devre dışı bırakır
  • net.ipv4.tcp_sack=0 1 olarak ayarlandığında, tcp_timestamps'ın etkinleştirilmesini gerektiren ve paket yükü yaşamıyorsanız ihtiyacınız olmayan bazı paket ek yükleri ekleyen IPV4 için seçici onaylama etkinleştirilir
  • net.ipv4.tcp_timestamps=0 Sadece çuvalın gerekli olduğu durumlarda tavsiye edilir.
  • net.ipv4.tcp_fastopen=1 Açılış SYN paketinde veri göndermeyi etkinleştirin.

Çoğu olmasa bile çekirdek kaynağında daha iyi belgelenir .

Elbette ham TCP soketlerini kodlayabilir ve çekirdek TCP / IP yığınını büyük ölçüde baypas edebilirsiniz.

Genellikle yüksek ayarlı sistemler güvenilir bir ağda çalışır ve yerel (iptables) güvenlik duvarlarını devre dışı bırakır.

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.