Linux IP yönlendirme parametrelerini ayarlama - secret_interval ve tcp_mem


30

Bugün HAProxy VM'lerimizden birinde küçük bir yük devretme sorunumuz vardı. İçine girdiğimizde şunu bulduk:

26 Ocak 07:41:45 haproxy2 çekirdeği: [226818.070059] __ratelimit: 10 geri çağırma bastırıldı
26 Ocak 07:41:45 haproxy2 çekirdeği: [226818.070064] Yuva dışı bellek
26 Ocak 07:41:47 haproxy2 çekirdeği: [226819.560048] Yuva dışında bellek
Jan 26 07:41:49 haproxy2 çekirdeği: [226822.030044] Yuva dışında bellek

Hangi başına bu bağlantı , görünüşe göre düşük varsayılan ayarlarla ilgisi var net.ipv4.tcp_mem. Bu yüzden onları varsayılan değerlerinden 4 kat arttırdık (bu, Ubuntu Sunucusudur, Linux'un lezzetinin önemli olup olmadığından emin değiliz):

güncel değerler: 45984 61312 91968
yeni değerler: 183936 245248 367872

Ondan sonra tuhaf bir hata mesajı görmeye başladık:

26 Ocak 08:18:49 haproxy1 çekirdeği: [2291.579726] Güzergâh karma zinciri çok uzun!
26 Ocak 08:18:49 haproxy1 çekirdek: [2291.579732] Secret_interval değerinizi ayarlayın!

Şşş .. bu bir sır!

Bunun görünüşe göre /proc/sys/net/ipv4/route/secret_intervalvarsayılan olarak 600 olan ve rota önbelleğinin düzenli aralıklarla temizlenmesini kontrol etmesi gerekenler

secret_intervalBakılmaksızın ne kadar yeni / eski TÜM rota karma girdileri uçurmak için hangi sıklıkta çekirdeği talimatını verir. Çevremizde bu genellikle kötüdür. CPU, önbellek her temizlendiğinde saniyede binlerce girişi yeniden oluşturmakla meşgul olacak. Ancak bunu bellek sızıntılarını uzak tutmak için günde bir kez çalıştırmaya ayarladık (hiç olmadığımız halde).

Bunu azaltmaktan mutluluk duysak da , eski değerleri rota önbelleğinden daha hızlı bir şekilde itmek yerine tüm rota önbelleğini düzenli aralıklarla bırakmanızı tavsiye etmek garip görünüyor .

Bazı araştırmalardan sonra /proc/sys/net/ipv4/route/gc_elasticity, rota tablosu boyutunu kontrol altında tutmak için hangisinin daha iyi bir seçenek olduğunu gördük :

gc_elasticityen iyi şekilde, çekirdeğin rota giriş kayıtlarının süresi dolmadan başlamadan önce kabul edeceği ortalama kova derinliği olarak tanımlanabilir. Bu, aktif rotaların üst sınırının korunmasına yardımcı olacaktır.

Rota önbelleğinin kendisini daha agresif bir şekilde budattığını umarak esnekliği 8'den 4'e ayarladık. Bu secret_intervalbize doğru gelmiyor. Ama bir sürü ayar var ve bu gerçekten de buraya gitmek için doğru olan yol değil.

  • / proc / sys / net / ipv4 / rota / gc_elastisite (8)
  • / proc / sys / net / ipv4 / rota / gc_interval (60)
  • / proc / sys / net / ipv4 / rota / gc_min_interval (0)
  • / proc / sys / net / ipv4 / rota / gc_timeout (300)
  • / proc / sys / net / ipv4 / rota / secret_interval (600)
  • / proc / sys / net / ipv4 / yol / gc_thresh (?)
  • rhash_entries (çekirdek parametresi, varsayılan bilinmeyen?)

Linux yönlendirmesini daha da kötüleştirmek istemiyoruz , bu yüzden bu ayarlardan bazılarını karıştırmaktan korkuyoruz.

Yüksek trafikli bir HAProxy örneği için hangi yönlendirme parametrelerinin ayarlanması en iyi olduğunu bilen var mı?

Yanıtlar:


28

Bu sorunla hiç karşılaşmadım. Ancak, derinliğini azaltmak için büyük olasılıkla karma tablo genişliğini arttırmalısın. "Dmesg" kullanarak, şu anda kaç girişiniz olduğunu göreceksiniz:

$ dmesg | grep '^IP route'
IP route cache hash table entries: 32768 (order: 5, 131072 bytes)

Bu değeri çekirdek boot komut satırı parametresi ile değiştirebilirsiniz rhash_entries. Önce elle deneyin, sonra lilo.confya da bilgisayarınıza ekleyin grub.conf.

Örneğin: kernel vmlinux rhash_entries=131072

HAProxy VM'nize çok az bellek atadığınız için çok sınırlı bir karma tablonuz olması mümkündür (rota karma büyüklüğü toplam RAM'e göre ayarlanır).

Endişeli tcp_mem, dikkatli ol. İlk ayarlarınız, 1/3'ü TCP soketlerine tahsis edilebilecek 1 GB RAM ile çalıştığınızı düşündürüyor. Şimdi, 367872 * 4096 bayt = TCP soketlerine 1,5 GB RAM ayırdınız. Hafızanın tükenmemesi için çok dikkatli olmalısınız. Genel kural, belleğin 1 / 3'ünü HAProxy'ye ve bir de 1/3'ü TCP yığınına ve son 1 / 3'ünü sistemin geri kalanına tahsis etmektir.

Ben mesajın senin "soket bellek yetersiz" varsayılan ayarlara geldiğini şüpheli tcp_rmemve tcp_wmem. Varsayılan olarak her soket için çıkışta 64 kB ve girişte 87 kB bulunur. Bu, yalnızca soket tamponları için proxy bağlantı için toplam 300 kB anlamına gelir. HAProxy için buna 16 veya 32 kB ekleyin ve 1 GB RAM ile yalnızca 3000 bağlantıyı destekleyeceğinizi göreceksiniz.

tcp_rmemVe tcp_wmem(orta param) varsayılan ayarlarını değiştirerek, bellekte daha düşük bir değer elde edebilirsiniz. Yazma arabelleği için 4096 ve 7300 veya 16060 inç tcp_rmem(5 veya 11 TCP segmentleri) gibi düşük değerlerle iyi sonuçlar alıyorum . Bu ayarları yeniden başlatmadan değiştirebilirsiniz, ancak yalnızca yeni bağlantılar için geçerli olacaktır.

Eğer dokunmak tercih etmezseniz sysctl çok fazla, en son HAProxy, 1.4-dev8, genel yapılandırmasından bu parametreleri çimdik sağlar ve yan başına (istemci veya sunucu).

Bunun yardımcı olacağını umuyorum!


8

Out of socket memory errorGenellikle yanıltıcıdır. Çoğu zaman, Internet'e bakan sunucularda, yetersiz bellekle ilgili herhangi bir sorun olduğunu göstermez. Bir blog yazısında çok daha ayrıntılı olarak açıkladığım gibi , en yaygın neden yetim yuva sayısıdır. Bir yetim soketi, bir dosya tanımlayıcısı ile ilişkilendirilmemiş bir sokettir. Bazı durumlarda, ( Out of socket memory error2) veya 4x sınırından uzakta olsanız bile çekirdek geçerli olur /proc/sys/net/ipv4/tcp_max_orphans. Bu, internete bakan servislerde sık sık meydana gelir ve tamamen normaldir. Bu durumda doğru eylem şekli, tcp_max_orphansnormalde en yoğun trafiğinizle gördüğünüz yetimlerin en az 4 katı olacak şekilde ayarlamaktır .

Akort önerir herhangi bir tavsiye dinlemeyin tcp_memya tcp_rmemya tcp_wmemsen sürece gerçekten ne yaptığını biliyorum. Bu önerileri verenler genellikle yapmazlar. Voodoo'ları çevreniz için sıklıkla yanlış veya uygunsuzdur ve probleminizi çözmez. Daha da kötüleştirebilir.


1
Bu olduğunda, mesaj dmesg'de farklıdır, "çok fazla yetim soket" görüyorsunuz. Bununla birlikte, yetimlerin büyük miktarda bellek tüketebileceği konusunda hemfikirim.
Willy Tarreau

Sayınızı aştığınızda /proc/sys/net/ipv4/tcp_max_orphansfarklı bir hatayla karşılaşacaksınız. Örneğin tüm Stack Exchange yığını /proc/sys/net/ipv4/tcp_max_orphans65536'dadır ve /proc/net/sockstatTCP ile sonuçlanır: inuse 2996 yetim 171 tw 15972 2998 mem 1621 tahsis eder - göz ardı edilemeyecek bir fark.
Geoff Dalgas

-4

Bu parametrelerin bazılarını düzenli olarak ayarlıyoruz. Yüksek verimli, düşük gecikmeli işlem platformları için standartlarımız:

net.ipv4.tcp_rmem = 4096 16777216 33554432
net.ipv4.tcp_wmem = 4096 16777216 33554432
net.ipv4.tcp_mem = 4096 16777216 33554432
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 30000
net.core.netdev_max_backlog = 30000

1
Willy'nin başına düşen, yani standart bellek baskınız # (orta sayı) 68 GB ?! Üç kere (rmem, wmem, mem) ??
Jeff Atwood

10
Bu ayarlar yanlıştır ve tezgah ortamlarında çok sık rastlanır ve sonra kör kopya ile yapıştırılır. Sadece birkaç eşzamanlı oturumda herhangi bir problem yaşamazlar, ancak 100 TCP soketi ile bile, 3.2 GB RAM tahsis edersiniz. Gecikme süresi düşük olduğu sürece, şüpheli bir şey fark etmeyeceksiniz. Çıktı arabelleklerinin dolgusunu görmek veya bir yerel görevi dondurmak ve giriş arabellek dolgusunu görmek için aktarım sırasında uzaktaki bir makinenin fişini çekmeniz yeterlidir. Bu delilik ...
Willy Tarreau

6
Jeff, bu üç katı değil. tcp_mem sayfalardadır ve genel boyutu tanımlar. tcp_rmem ve tcp_wmem bayt cinsindendir ve yuva başına boyutu tanımlar.
Willy Tarreau

Bu tuneables yanlış görünüyor, aynı zamanda küçük veri içeren sunucular için çok fazla yuva tamponu ayırmak istemiyorsunuz ve tcp_mem r / wmem'den tamamen farklı, aynı numaraları kullanmak gerçekten mantıklı değil (biri diğerine göre bayt, sistem başına sayfa)
eckes
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.