Maksimum bağlantı sayısı, biraz farklı da olsa, hem istemci hem de sunucu tarafında belirli sınırlardan etkilenir.
İstemci tarafında:
Ephermal port aralığını artırın vetcp_fin_timeout
Varsayılan değerleri bulmak için:
sysctl net.ipv4.ip_local_port_range
sysctl net.ipv4.tcp_fin_timeout
Ephermal bağlantı noktası aralığı, bir ana bilgisayarın belirli bir IP adresinden oluşturabileceği maksimum çıkış soketi sayısını tanımlar. fin_timeout
Bu prizler kalacak minimum süreyi tanımlar TIME_WAIT
devlet (bir kez kullanıldıktan sonra kullanılmaz hale). Genel sistem varsayılanları:
net.ipv4.ip_local_port_range = 32768 61000
net.ipv4.tcp_fin_timeout = 60
Bu temel olarak sisteminizin (61000 - 32768) / 60 = 470
saniyede sürekli olarak soketten fazlasını garanti edemeyeceği anlamına gelir . Eğer bundan memnun değilseniz, artırmakla başlayabilirsiniz port_range
. Aralığı ayarlamak 15000 61000
bugünlerde oldukça yaygın. Değerini azaltarak kullanılabilirliği daha da artırabilirsiniz fin_timeout
. Her ikisini de yaptığınızı varsayalım, saniyede 1500'den fazla giden bağlantı görmelisiniz, daha kolay.
Değerleri değiştirmek için :
sysctl net.ipv4.ip_local_port_range="15000 61000"
sysctl net.ipv4.tcp_fin_timeout=30
Yukarıdakiler, saniyede giden bağlantı yapmada sistem kapasitesini etkileyen faktörler olarak yorumlanmamalıdır. Ancak daha ziyade bu faktörler, sistemin eşzamanlı bağlantıları, büyük "faaliyet" dönemleri için sürdürülebilir bir şekilde ele alma yeteneğini etkiler.
İçin tipik bir Linux paketinde Sysctl varsayılan değerlere tcp_tw_recycle
& tcp_tw_reuse
olurdu
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=0
Bunlar "kullanılmış" bir soketten (bekleme durumunda) bir bağlantıya izin vermez ve soketleri tam time_wait
çevrimi sürdürebilir. Ayarlamanızı tavsiye ederim:
sysctl net.ipv4.tcp_tw_recycle=1
sysctl net.ipv4.tcp_tw_reuse=1
Bu, soketlerin hızlı bir şekilde çevrilmesine time_wait
ve tekrar kullanılmasına olanak tanır . Ancak bu değişikliği yapmadan önce, bu soketlere ihtiyaç duyan uygulama için kullanacağınız protokollerle çelişmediğinden emin olun. Etkilerini anlamak için Vincent Bernat'ın "TCP TIME-WAIT ile Başa Çıkma" yazısını okuduğunuzdan emin olun . Bu net.ipv4.tcp_tw_recycle
seçenek, aynı NAT aygıtının arkasındaki iki farklı bilgisayardan gelen bağlantıları işlemeyeceğinden, halka açık sunucular için oldukça sorunludur , bu da algılanması ve ısırmayı beklemesi zor bir sorundur. Not net.ipv4.tcp_tw_recycle
olmuştur kaldırıldı Linux 4.12 den.
Sunucu Tarafında:net.core.somaxconn
değeri önemli bir role sahiptir. Bir dinleme soketine kuyrukta verilen maksimum istek sayısını sınırlar. Sunucu uygulamanızın yeteneğinden eminseniz, varsayılan 128'den 128 ila 1024 gibi bir şeye yükseltin. Şimdi, uygulamanızın dinleme çağrısındaki dinleme biriktirme değişkenini eşit veya daha yüksek bir tamsayı olarak değiştirerek bu artıştan yararlanabilirsiniz.
sysctl net.core.somaxconn=1024
txqueuelen
Ethernet kartlarınızın parametresinin de oynayacağı bir rol vardır. Varsayılan değerler 1000'dir, bu nedenle sisteminiz işleyebilirse bunları 5000 veya daha fazla çarpın.
ifconfig eth0 txqueuelen 5000
echo "/sbin/ifconfig eth0 txqueuelen 5000" >> /etc/rc.local
Benzer şekilde değerlerini yükseltmek net.core.netdev_max_backlog
ve net.ipv4.tcp_max_syn_backlog
. Varsayılan değerleri sırasıyla 1000 ve 1024'tür.
sysctl net.core.netdev_max_backlog=2000
sysctl net.ipv4.tcp_max_syn_backlog=2048
Şimdi hem istemci hem de sunucu tarafı uygulamalarınızı kabuktaki FD ulimt'lerini artırarak başlatmayı unutmayın.
Ayrıca, programcılar tarafından kullanılan bir diğer popüler teknik, tcp yazma çağrılarının sayısını azaltmaktır . Kendi tercihim, istemciye göndermek istediğim verileri ittiğim bir tampon kullanmak ve daha sonra uygun noktalarda tamponlanmış verileri gerçek sokete yazıyorum. Bu teknik, büyük veri paketleri kullanmamı, parçalanmayı azaltmamı, hem kullanıcı arazisinde hem de çekirdek düzeyinde CPU kullanımını azaltmamı sağlıyor.