Linux ağ performansı parametreleri
(github.com/leandromoreira)- Linux ağ akışı içinde sık kullanılan sysctl/ağ parametrelerinin nerede konumlandığını gösteren kısa bir eğitim
- Her durumda aynı anda yüksek throughput ve düşük gecikme sağlayan cargo cult değerleri gerçekçi değildir; modern çekirdek sürümlerinde varsayılanlar zaten iyi ayarlanmıştır ve varsayılanları değiştirmenin performansa zarar verme ihtimali vardır
- Alım yolu; NIC'in MAC/FCS doğrulaması, DMA, receive ring buffer, hard IRQ, NAPI, soft IRQ, ingress qdisc, netfilter, TCP durum makinesi,
tcp_rmemtabanlı alım tamponu ve uygulamanın okumasına kadar uzanan akış olarak özetlenir - Gönderim yolu; uygulamanın
sendmsgçağrısı,skb_buffayrılması,tcp_wmemtabanlı soket yazma tamponu, TCP/IP başlık işlemleri, netfilter,txqueuelentabanlı output qdisc, transmit ring buffer, DMA ve NIC gönderim tamamlama IRQ'suna kadar olan akış olarak özetlenir - Temel ayar kalemleri burst işleme, CPU kullanımı, gecikme ve drop gözlemiyle ilişkilidir
rx,txring buffer'ları, bağlantı burst'lerini drop olmadan karşılamak için kullanılan kuyruklardır; artırılmaları durumunda gecikme artabilirrx-usecs,tx-usecs,rx-frames,tx-frames, hard IRQ oluşmadan önceki bekleme süresi ve frame sayısını belirler; CPU kullanımı ve hard IRQ sayısı azaltılarak gecikme maliyeti karşılığında throughput artırılabilirnetdev_budget_usecs,netdev_budget,dev_weight,netdev_max_backlog, NAPI polling cycle ve ingress qdisc throughput'u ile ilgilidirtxqueuelenvedefault_qdisc, OUTPUT tarafındaki kuyruk ve varsayılan queuing discipline ile ilgilidir
- İnceleme, değiştirme ve izleme; ağırlıklı olarak
ethtool,sysctl,ip,tcve/procdosyaları etrafında şekillenir- Örnek: ring buffer görüntüleme
ethtool -g ethX, değiştirmeethtool -G ethX rx value tx value - Örnek:
net.core.netdev_budget_usecsgörüntülemesysctl net.core.netdev_budget_usecs, değiştirmesysctl -w net.core.netdev_budget_usecs value - Örnek:
default_qdiscgörüntülemesysctl net.core.default_qdisc, izlemetc -s qdisc ls dev ethX
- Örnek: ring buffer görüntüleme
- TCP tamponu kalemleri olarak
tcp_rmem,tcp_wmem,tcp_moderate_rcvbufele alınır;tcp_moderate_rcvbufayarlıysa TCP, alım tamponu boyutunu otomatik olarak ayarlamaya çalışır - TCP durumu ve tıkanıklık kontrolüyle ilgili kalemler arasında
net.core.somaxconn,tcp_fin_timeout,tcp_available_congestion_control,tcp_congestion_control,tcp_max_syn_backlog,tcp_syncookies,tcp_slow_start_after_idlebirlikte özetlenir - Linux iç ağ izleme, perf ile incelenebilir; örnek komut biçimi
perf trace --no-syscalls --event 'net:*' ping globo.com -c1 > /dev/nullşeklindedir - Test ve izleme araçları olarak iperf3, vegeta, netdata, prometheus + grafana + node exporter full dashboard kombinasyonu önerilir
1 yorum
Hacker News yorumları
Ubuntu Linux varsayılanlarında net.ipv4.tcp_rmem yaklaşık 6 MB, net.core.rmem_max ise yaklaşık 1 MB olduğundan tuhaf bir durum ortaya çıkıyor.
Varsayılan TCP soketi gerekirse TCP alma penceresini 6 MB’a kadar çıkarabiliyor; ancak kullanıcı alanındaki bir uygulama
setsockopt SO_RCVBUFçağırdığında, zaten 6 MB yapabilen soket bile en fazla 1 MB ile sınırlanıyor.6 MB’tan 4 MB’a düşürmeye çalışsanız bile sonucun 1 MB olması gibi çok garip görünüyor; aynı şey
SO_SNDBUF/wmemiçin de geçerli.Linux bu seçeneklerin önceliklerini karıştırıyor gibi görünüyor; neden
core.rmem_maxdaha büyük tutulup yetkili yönerge değeri olarak alınmıyor, bunun tarihsel bir nedeni var mı merak ediyorum.SO_SNDBUF/wmemyerine TCP_NOTSENT_LOWAT düşürülebilir.Bu değer, bant genişliği-gecikme çarpımı (BDP) için gereken miktarın ötesinde ek olarak tamponlanacak miktarı sınırlar.
SO_RCVBUFayarlandığı anda o sokette otomatik ayarlama devreden çıkar venet.core.rmem_maxmaksimum değer olur.Bu,
Documentation/networking/ip-sysctl.rstiçinde oldukça açık şekilde belgelenmiş.Paketin NIC’e girdikten sonra kullanıcı alanına ulaşmasına kadar olan tüm adımları göstermesi dahil, harika.
Ağ performansıyla ilgili bir şey daha eklemek gerekirse, birden fazla CPU bulunan sistemlerde büyük sunucularda yaygın olan NUMA tahsisini kontrol etmek gerekir.
Ağ kartı bir CPU tarafındaysa ve uygulama başka bir CPU’da çalışıyorsa bu performansı da etkileyebilir.
Ağda veri alma/göndermeyi gerçekten öğrenmek istiyorsanız okunmaya değer yazılar.
https://blog.packagecloud.io/monitoring-tuning-linux-network...
https://blog.packagecloud.io/monitoring-tuning-linux-network...
https://packagecloud.io/blog/illustrated-guide-monitoring-tu...
Linux’un varsayılan tıkanıklık denetimi olan
net.ipv4.tcp_congestion_controldeğerini yalnızca bbr olarak değiştirmek bile bazı durumlarda muazzam fark yaratıyor.Muhtemelen özellikle mesafe, aralıklı paket kaybı ve jitter ile kapsülleme olduğunda böyle.
Geçen 1 yıl boyunca
client host <-- HTTP --> reverse proxy host <-- HTTP over Wireguard --> service hostakışındaki bir sorunu hata ayıkladım; ortalamada teorik maksimum verimin %20’sini aşmak zordu ve bağlantı da zaman geçtikçe neredeyse duracak kadar yavaşlıyordu.Bağlantıyı sık sık zorla kapatma gibi geçici çözümler kullanıyorduk; tıkanıklık denetimini
bbrolarak değiştirince teorik maksimuma yakın verim ve kararlı bağlantı elde ettik. Bu değişiklik Wireguard’ın iki tarafında da gerekliydi.Çoğu TCP yığını ilk kaybı gördüğünde gönderim penceresini yarıya indirir veya ciddi ölçüde düşürür; bu yüzden kayıplı bir VPN’de ya da 10 Mb/s VPN uplink’ine 1 Gb/s ile büyük burst gönderdiğinizde TCP kaybı görüp büyük ölçüde geri çekilir.
BBR, darboğaz bant genişliğini bulmaya çalışır; gidiş-dönüş süresini ölçer ve RTT artana kadar aktarım hızını yükseltir.
RTT artınca yolun en dar bölümünde kuyruk oluştuğunu varsayar; kuyruk boşalıp RTT normale dönene kadar aktarım hızını düşürür, sonra bir süre o hızda gönderip tekrar biraz yükseltmeyi dener.
Birkaç yıl önce 10 Mb/s kablo uplink’inden 1 Gb/s simetrik fiber hatta geçmeme rağmen şirket VPN yüklemelerinin yaklaşık 5 Mb/s’de kalması sinir bozucuydu; FreeBSD’de RACK TCP veya BBR’a geçince VPN sınırı olan yaklaşık 40 Mb/s’ye, yani yaklaşık 8 katına çıktı.
Tek bir sihirli değeri ayarlayınca her şey iyileşir tarzındaki kopyala-yapıştır kargo kültü performans ayarı, özgün metnin anlatmak istediğinin tam tersidir.
Neyse ki Google BBRv3’ü upstream ediyor; yakında durum daha iyi olacak.
Yalnızca tek yöndeki performansı iyileştirmek istiyorsanız Wireguard’ın iki tarafını da değiştirmeniz gerekmez.
BBRv1 konusunda diğer yorumlara katılıyorum; Linux çekirdeğindeki cubic uygulaması çoğu uygulama için oldukça iyi çalışır.
Wi‑Fi adaptörlerinde de performans ayarlamasının anlamlı olup olmadığını merak ediyorum
Masaüstünde işlevleri kapatmak dışında i210 ve i225 Ethernet sorunlarını düzeltmenin bir yolu olup olmadığını da merak ediyorum
Günümüzde en yaygın NIC’lerin bu ikisi gibi görünüyor; yaygın ağ donanımı ve sürücülerinin neden bu kadar kusurlu olduğunu pek anlayamıyorum
RISC-V’ye çok ilgim var; tamamen açık ve doğru çalışan bir NIC ile başlamaya ne dersiniz diye düşünüyorum
i210’dan ucuz olursa eninde sonunda sisteme koyarlar, ama belki de bu imkânsız bir iştir
Ancak Wi‑Fi’de rastgele ping sıçramaları yine de meydana gelir
https://forum.openwrt.org/t/aql-and-the-ath10k-is-lovely/590... adresinde AQM’yi etkinleştirme ve ayarlama ile aktarım hızı ve gecikme arasındaki ödünleşimi ele alan büyük bir başlık var
Aynı dönemin CPU’ları için 1Gb zaten pek zorlayıcı bir seviye değil ve i210 4 kuyruk sunuyor
i210’dan ne konuda memnun olmadığını merak ediyorum
Görselleştirilmiş Linux ağ kuyrukları özeti o kadar iyi ki bir yere, duvara asmak istiyorum
Brendan’ın Systems Performance kitabı da Linux ağ performansı vb. konuları iyi ele alıyor ve şimdiden 2. baskısına ulaştı
İki baskı da harika; ancak 2. baskı ağırlıklı olarak Linux’a odaklanıyor, 1. baskı ise Solaris’i de içeriyor
Daha yakın zamanda aynı yazarın BPF Performance Tools kitabı da çıktı
[1] Systems Performance: Enterprise and the Cloud, 2nd Edition (2020)
https://www.brendangregg.com/systems-performance-2nd-edition...
[2] BPF Performance Tools:
https://www.brendangregg.com/bpf-performance-tools-book.html
Yazıya sadece göz atmak bile keyifliydi; araştırma ve yapılandırma çok iyiydi
Ancak Linux ağ parametrelerini düzenli olarak ayarlayanların gerçekte kimler olduğunu merak ediyorum
Bu belgede bir yerde açıkça TCP yazması gerekiyor gibi
İçerik TCP ile ilgili kaygılara oldukça yoğunlaşmış ve insanlar çoğunlukla TCP kullandığı için faydalı da
Ama varsayılan UDP ayar değerleri feci derecede düşük; bu kısmın belirgin biçimde eksik olduğu görülüyor
Benzer konuları ele alan video veya seri önerileri almak isterim
Genel ağ konulu kaynak çok, ancak Linux’un somut implementasyonunu ele alan kaynak bulmak zordu
Mikrodenetleyiciler için basit bir TCP echo sunucusu yapmayı denemek istiyorum, ama örneklerin çoğu yalnızca üreticinin kendi TCP kütüphanesini kullanıyor ve yönlendiriciye doğrudan bağlantı ayarlayıp kurma sürecini neredeyse hiç açıklamıyor