Soru Linux sunucusundaki maksimum bağlantı sayısını sınırlayan nedir?


Çekirdek parametresi veya diğer ayarlar, Linux sunucusunda açılabilen maksimum TCP soket sayısını kontrol eder? Daha fazla bağlantıya izin verme zorunluluğu nedir?

Bir Apache sunucusunu test ederken yüklendim. ab Sunucudaki açık bağlantıları maksimize etmek oldukça kolay. Ab'ın -k seçeneğini bırakırsanız, bağlantı yeniden kullanılmasına izin verir ve yaklaşık 10.000'den fazla istek gönderirse Apache ilk 11.000 veya daha fazla istekte bulunur ve sonra 60 saniye durur. Netstat çıkışına bir bakış TIME_WAIT durumunda 11.000 bağlantı gösteriyor. Görünüşe göre bu normal. Bağlantılar, istemciyle birlikte yapıldıktan sonra bile 60 saniyelik bir süreliğine açık tutulur. TCP güvenilirliği nedenleri.

Bu bir sunucu DoS için kolay bir yol gibi görünüyor ve bunun için ne zaman alıştırmalar ve önlemler olduğunu merak ediyorum.

İşte test çıktılarım:

# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed

İşte test sırasında çalıştırdığım netstat komutu:

 # netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c 
  11651 tcp 0 0 localhost:www TIME_WAIT -
      1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab

85
2018-05-21 16:18


Menşei




Cevaplar:


Sonunda bağlantı sayısını gerçekten sınırlandıran ayarı buldum: net.ipv4.netfilter.ip_conntrack_max. Bu 11,776'ya ayarlandı ve ne ayarlamam gerekiyorsa, beklemeden önce testimde sunabileceğim istek sayısıdır tcp_fin_timeout Daha fazla bağlantı için kullanılabilir saniye. conntrack tablo çekirdeğin bağlantı durumunu izlemek için kullandığı şeydir, bu yüzden dolu olduğunda, çekirdek paketleri düşürmeye ve bunu günlük olarak yazdırmaya başlar:

Jun  2 20:39:14 XXXX-XXX kernel: ip_conntrack: table full, dropping packet.

Bir sonraki adımda, çekirdeğin tüm bağlantıların TIME_WAIT paketleri bırakmak yerine devlet. Açmak için bunu yapabilirim tcp_tw_recycle veya artan ip_conntrack_max bağlantı için kullanılabilecek yerel bağlantı noktalarının sayısından daha büyük olması ip_local_port_range. Sanırım çekirdek yerel bağlantı noktalarından çıktığında bağlantıları geri dönüştürmeye başlar. Bu daha fazla bellek izleme bağlantısı kullanıyor ancak daha iyi bir çözüm gibi görünüyor. tcp_tw_recycle çünkü doktorlar bunun tehlikeli olduğunu ima ediyorlar.

Bu konfigürasyonla, tüm gün ab çalışabilirim ve asla bağlantıdan çıkamıyorum:

net.ipv4.netfilter.ip_conntrack_max = 32768
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 32768    61000

tcp_max_orphans Ayarın testlerimde herhangi bir etkisi olmadı ve nedenini bilmiyorum. Bağlantıları kapatacağını düşünürdüm TIME_WAIT Bir kez 8192'sini belirtiyorlar ama benim için bunu yapmıyor.


62
2018-06-03 16:02



Bu paramları nerede yapılandırıyoruz? - Codevalley
@Codevalley Bu sisteme bağlı olabilir ama Ubuntu Sunucusunda /etc/sysctl.conf'a giderler. - Ben Williams


/ Proc dosya sisteminin bu konuda size neler sunacağına gerçekten bakmak istersiniz.

Bu son sayfada, ilginizi çekecek aşağıdakileri bulabilirsiniz:

  • / Proc / sys / net / ipv4 / tcp_max_orphansSistem tarafından tutulan maksimum soket sayısını kontrol eden değil bir şeye bağlı. Bunu yükseltmek, 64kbyte'ye kadar değiştirilemez bellek tüketebilir. yetim soket başına.
  • / Proc / sys / net / ipv4 / tcp_orphan_retriesBir soket yetim olmadan ve kapatılmadan önce yeniden deneme sayısını kontrol eder. Bu sayfada, doğrudan ilgilendiğiniz web sunucuları hakkında belirli bir not var ...

23
2018-05-21 18:15



tcp_max_orphans ilginç ama işe yaramıyor gibi görünüyor. Testim sırasında yetim prizleri ölçmeye çalıştığımda 11,651'i görüyorum, tcp_max_orphans ise 8.092. # netstat - keten -p | grep "localhost: www" | sed \ '/ \ + / / g' | kesilmiş -d '' -f 1-4,6-7 | sıralama | uniq -c 11651 tcp 0 0 localhost: www TIME_WAIT - - Ben Williams
Tcp_orphan_retries ayarına bakın - buradaki fikir, soketler "itlaf" ... - Avery Payne
@Jauder Ho'nun önerisi + tcp_orphan_retries, durumunuz için potansiyel kazanç gibi görünüyor. - Avery Payne


Bunu doğrudan ayarlayabileceğimizi düşünmüyorum. Bu, TCP / IP ayarlaması kategorisine girer. Neleri ayarlayabileceğinizi öğrenmek için 'adam 7 tcp'yi deneyin. Bunları ayarlamak için sysctl ('man 8 sysctl') kullanılır. 'sysctl -a | grep tcp size neyi ayarlayabileceğinizi gösterecektir, ancak hepsini gösterip göstermeyeceğinden emin değilim. Ayrıca, bu değişmedikçe, TCP / IP soketleri açılarak dosya tanıtıcıları gibi görünür. Yani bu ve bu bağlantıdaki bir sonraki bölüm, aradığınız şey olabilir.


3
2018-05-21 17:31





Tcp_fin_timeout ayarını aşağıdaki gibi ayarlamayı deneyin. Bu, TIME_WAIT daha hızlı bir şekilde kapatılmalıdır.

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

2
2018-05-21 19:38



Dikkatli ol! Zor bir şekilde yaşandı. "Bu, yük dengeleme ve NAT'lar ile düşürülmüş çerçevelere neden olabilir, yalnızca bunu yalnızca yerel ağınızda iletişim kuran bir sunucu için kullanın." - wiki.archlinux.org/index.php/Sysctl - Henk
@Henk sanırım tcp_tw_recycle Bu potansiyel olarak tehlikeli. tcp_tw_reuse daha güvenli ve onları aynı anda kullanmak için bir neden göremiyorum. - Vladislav Rastrusny


Stok apache (1) sadece 250 eşzamanlı bağlantıyı destekleyecek şekilde önceden tanımlıyordu - daha fazlasını isterseniz daha eşzamanlı oturumlara izin vermek için değiştirilecek bir başlık dosyası vardı. Apache 2 ile hala bunun doğru olup olmadığını bilmiyorum.

Ayrıca, Apache'yi çalıştıran hesap için daha açık dosya tanımlayıcılarının yüklenmesine izin vermek için bir seçenek eklemeniz gerekir - önceki yorumların işaret edemediği bir şey.

Çalışanlarınızın ayarlarına ve Apache'nin içinde ne tür kalıcı zaman aşımlarına, kaç tane yedek sunucunuzun bir seferde çalıştığına ve bu ekstra süreçlerin ne kadar hızlı öldüğüne dikkat edin.


2
2018-05-21 21:21





TIME_WAIT durumunda harcanan zamanı azaltabilirsiniz (Set net.ipv4.tcp_fin_timeout). Apache'yi YAWS veya nginx veya benzeri bir şeyle değiştirebilirsiniz.

Daha fazla bağlantının takası genellikle bellek kullanımını içerir ve eğer bir forking işleminiz varsa, CPU'nuzu harcayan birçok çocuk işlemi.


1
2018-05-21 16:26



tcp_fin_timeout, çekirdeğin yeniden oluşturulmasının dışında değiştirilemeyen TIME-WAIT sona erdirme için değil, adından da anlaşılacağı gibi FIN için. - Alexandr Kurilin


Tek bir IP adresinde açılabilen mutlak sayıdaki soket sayısı 2 ^ 16'dır ve çekirdeğe değil TCP / UDP ile tanımlanır.


0
2018-05-30 16:42



Hayır değil. Uzak adresler farklı olduğu sürece yerel bağlantı noktasının benzersiz olması gerekmediğinden daha fazla açabilirsiniz. Dahası, OP sunucu başına dedi ve sunucu başına> 1 adrese sahip olabilirsiniz. - MarkR


Apache HTTP sunucusu kıyaslama aracı, ab, 2.4 sürümünde -s zaman aşımı seçeneği. Ayrıca bakınız ab (Apache Bench) hatası: apr_poll: Windows'ta belirtilen zaman aşımının süresi doldu (70007).

Bu seçenek probleminizi çözer.


0
2018-02-08 17:56