Aktifkan SSH Concurrent Massive ke satu server

9

Tujuan saya adalah untuk memungkinkan 10000 ssh berjalan bersamaan pada satu server.

Untuk kesederhanaan, saya ssh-ing ke localhost:

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

sleep 100adalah untuk memastikan ketika ssh ke-10.000 dimulai, ssh ke-1 masih terhubung sehingga memang ada 10.000 ssh bersamaan .

Dan inilah dua jenis pesan kesalahan yang saya dapat:

1. ssh_exchange_identification: Connection closed by remote host

2. ssh_exchange_identification: read: Connection reset by peer

Saya telah melakukan modifikasi berikut:

  1. Di /etc/security/limits.confdan /etc/security/limits.d/90-nproc.conf, atur lunak & keras nofile& nprocke 65535 (ini adalah nilai maksimum yang mungkin? - Pembaruan: tidak. Nilai maks adalah 1048576 )
  2. Di /etc/sysctl.conf, aturkernel.pty.max = 65535
  3. Di /etc/ssh/sshd_config, atur MaxStartups 10000.

Modifikasi ini memungkinkan saya untuk berhasil menjalankan 1000 ssh s bersamaan ke satu server, tetapi mereka tidak berfungsi untuk 2000 dan di atas ssh s.

Beberapa orang menyarankan untuk mengubah nilainya MaxSessions(sebenarnya saya tidak jelas tentang penggunaannya: bagaimana multiplexing mempengaruhi kasus saya?), /proc/sys/net/core/netdev_max_backlogDan /proc/sys/net/core/somaxconn, tetapi mereka tampaknya tidak membuat perbedaan.

Selain itu, tidak ada kesalahan jika mereka 10.000 ssh bersamaan ke server yang berbeda (masalah hanya terjadi ketika ssh ke satu server):

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

Saya sudah terjebak dalam hal ini cukup lama.
Bantuan apa pun akan sangat dihargai!

Clara
sumber
1
log server sshd dapat memberikan informasi lebih lanjut tentang alasan penolakan koneksi. Pada dasarnya jika Anda ingin hanya 10.000 sesi, saya akan merekomendasikan Anda untuk menggunakan multiplexing menggunakan ControlMaster (dan tentu saja bertemu MaxSessions).
Jakuje
1
Saya tidak berpikir sleep 100sapa yang Anda pikirkan. Itu dijalankan bukan di sesi ssh, tetapi di mesin Anda sendiri.
daniel kullmann
1
@ Jakuje terima kasih telah mengingatkan saya untuk memeriksa log server! Saya menemukan error: reexec socketpair: Too many open files, jadi saya kira nilai sebelumnya nofile(yaitu 65.535) masih jauh dari cukup. Saya tidak terbiasa dengan ControlMaster tetapi saya akan mencobanya, terima kasih !! :)
Clara
1
Menarik, ketika saya mengeksekusi salah satu baris, ps axu | egrep "ssh|sleep" | grep -v grephanya daftar sleep 100s, bukan ssh. Saya pikir Anda harus mengubah perintah ke ssh "echo hi; sleep 100s".
daniel kullmann
2
@danielkullmann Ya Anda memang benar - sleep 100harus dalam perintah yang dikirim melalui ssh, yang merupakan kasus dalam skrip aktual saya, tapi saya membuat kesalahan ketik di sini. Saya telah memperbarui pos utama yang sesuai. Terima kasih banyak untuk menunjukkannya !!
Clara

Jawaban:

2

Aku berharap dia bisa berkomentar

sshd perlu (biasanya, tetapi meskipun Anda tidak menentukan kasus penggunaan yang tepat, dll.) mengalokasikan pty per login, namun, dalam kasus Anda, ssh "echo hi; sleep 100s" TIDAK mengalokasikan pty, jadi tidak perlu untuk pengaturan kernel.pty.max ... kecuali jika Anda ingin ribuan pengguna login * ... untuk mengujinya, Anda harus menambahkan opsi -t ke pengujian Anda, yaitu. ssh -t "echo hai; tidur 100-an"

Kembali ke masalah yang dihadapi dengan error: reexec socketpair: Too many open files Tes pada Wheezy dist-upgrade ke sistem Jessie, saya menemukan bahwa / etc / security / limit * tidak mengubah batas sshd.

periksa dengan cat /proc/<pid-of-sshd>/limits yang dalam kasus saya, setelah pengaturan di /etc/security/limits.conf: * nofile soft 65535 * nofile hard 65535 masih melaporkan hanya 1024 (soft) dan 4096 (hard) untuk batas sshd. Resolusi tampaknya untuk memaksa ulimit -Hn 65535& ulimit -n 65535di dalam /etc/init.d/sshskrip menggunakan perintah ulimit itu, saya telah menaikkan nshiles sshd ke 65535/65535 dari 1024/4096

Keriangan
sumber