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.