Tek bir sunucuda Devasa Eşzamanlı SSH'yi etkinleştir


9

Amacım tek bir sunucuda 10000 eşzamanlı ssh s'nin çalışmasına izin vermektir .

Basitlik için localhost'a veriyorum:

for i in `seq 1 10000`; do
    ssh localhost "echo ${i}; sleep 100"  >>./info 2>>./log &
done

sleep 10010000 ssh başladığında 1. ssh hala bağlantıda olduğundan emin olmak için 10000 eşzamanlı ssh s vardır.

İşte iki tür hata mesajı var:

1. ssh_exchange_identification: Connection closed by remote host

2. ssh_exchange_identification: read: Connection reset by peer

Aşağıdaki değişiklikleri yaptım:

  1. Gelen /etc/security/limits.confve /etc/security/limits.d/90-nproc.confset yumuşak ve sert nofile& nproc(?. -: hayır maksimum değerdir Güncelleme Bu maksimum olası değer hakkıdır 65535 1048576 )
  2. In /etc/sysctl.conf, ayarlayınkernel.pty.max = 65535
  3. In /etc/ssh/sshd_config, ayarlayın MaxStartups 10000.

Bu değişiklikler 1000 eşzamanlı ssh s'yi tek bir sunucuda başarıyla çalıştırmama izin veriyor , ancak 2000 ve üstü ssh s için çalışmıyorlar .

Bazı insanlar için değeri değiştirmeyi önermişlerdir MaxSessions(aslında kullanımı hakkında net değilim: çoklama davamı nasıl etkiler?), /proc/sys/net/core/netdev_max_backlogVe /proc/sys/net/core/somaxconnhiçbir fark yaratmıyor gibi görünüyor.

Ayrıca, farklı sunuculara 10000 eşzamanlı ssh s ise hata yoktur (sorunlar sadece tek bir sunucuya ssh olduğunda ortaya çıkar ):

for i in `seq 1 10000`; do
    j=$(( 1 + $i % 8 ))
    ssh server-${j} "echo hi; sleep 100" >info-${j} 2>log-${j} &
done

Uzun süredir bu konuda takılıp kaldım.
Herhangi bir yardım derinden takdir edilecektir!


1
sshd sunucu günlüğü bağlantıların reddedilme nedeni hakkında daha fazla bilgi sağlayabilir. Temel olarak sadece 10000 oturum istiyorsanız, ControlMaster kullanarak çoğullamayı kullanmanızı öneririm (ve elbette MaxSessions'ı çarpın).
— Jakuje

1
Ne düşündüğünü sleep 100syapar sanmıyorum. Ssh oturumunda değil, kendi makinenizde yürütülür.
— daniel kullmann

1
@ Jakuje sunucu günlüğünü kontrol etmemi hatırlattığın için teşekkürler! Ben buldum error: reexec socketpair: Too many open files, yani nofile(yani 65535) önceki değeri yeterli olmaktan uzak olduğunu varsayalım . ControlMaster'ı tanımıyorum ama deneyeceğim, teşekkür ederim !! :)
— Clara

1
İlginç, ben satırlardan birini yürütmek, ps axu | egrep "ssh|sleep" | grep -v grepsadece listeler sleep 100s, değil ssh. Bence bu komutu değiştirmelisin ssh "echo hi; sleep 100s".
— daniel kullmann

2
@danielkullmann Evet kesinlikle haklısın - sleep 100ssh ile gönderilen komutta olmalı, bu benim gerçek senaryomda olduğu gibi, ama burada bir yazım hatası yaptım. Ana yayını buna göre güncelledim. İşaret ettiğiniz için çok teşekkür ederim !!
— Clara

Yanıtlar:


2

/ ben yorum yapabilmeyi diledi

sshd'nin (tipik olarak, ancak tam kullanım durumlarını vb. belirtmediyseniz) giriş başına bir pty ayırması gerekir, ancak, sizin durumunuzda, ssh "echo hi; sleep 100s" bir pty ayırmaz, bu yüzden istediğiniz sürece kernel.pty.max ayarı için gerek ... binlerce kullanıcı açmış , siz, testlere yani -t seçeneği eklemek gerekir test etmek için * ... lütfen. ssh -t "yankı merhaba; 100'lü uyku"

error: reexec socketpair: Too many open files Jessie sistemine dağıtılan bir Wheezy'deki Testler ile ilgili soruna geri döndüğümde, / etc / security / limit * 'nin sshd sınırlarını değiştirmediğini gördüm.

kontrol etmenizi ile cat /proc/<pid-of-sshd>/limits benim durumumda olan /etc/security/limits.conf içinde ayarladıktan sonra: * nofile yumuşak 65535 * nofile 65535 sert hala sshd en sınırlar sadece 1024 (yumuşak) ve 4096 (sert) bildirir. Çözünürlük , ulimit komutlarını kullanarak komut dosyasının içinde ulimit -Hn 65535ve ulimit -n 65535içinde zorlamak gibi görünüyor /etc/init.d/ssh, ben sshd nofiles 1024/4096 dan 65535/65535 yükseltti

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.