Mục tiêu của tôi là để cho phép 10000 đồng thời ssh s đang chạy trên một đơn máy chủ.
Để đơn giản, tôi ssh-ing đến localhost:
for i in `seq 1 10000`; do
ssh localhost "echo ${i}; sleep 100" >>./info 2>>./log &
done
sleep 100
là để đảm bảo khi ssh thứ 10000 bắt đầu, ssh thứ 1 vẫn còn kết nối nên thực sự có 10000 ssh s đồng thời .
Và đây là hai loại thông báo lỗi tôi nhận được:
1. ssh_exchange_identification: Connection closed by remote host
2. ssh_exchange_identification: read: Connection reset by peer
Tôi đã thực hiện các sửa đổi sau:
- Trong
/etc/security/limits.conf
và/etc/security/limits.d/90-nproc.conf
, đặt mềm & cứngnofile
&nproc
thành 65535 (đây là giá trị tối đa có thể phải không? - Cập nhật: không. Giá trị tối đa là 1048576 ) - Trong
/etc/sysctl.conf
, đặtkernel.pty.max = 65535
- Trong
/etc/ssh/sshd_config
, thiết lậpMaxStartups 10000
.
Những sửa đổi này cho phép tôi chạy thành công 1000 ssh đồng thời đến một máy chủ, nhưng chúng không hoạt động trong 2000 và trên ssh s.
Một số người đã đề nghị thay đổi giá trị cho MaxSessions
(thực ra tôi không rõ về cách sử dụng của nó: việc ghép kênh ảnh hưởng đến trường hợp của tôi như thế nào?), /proc/sys/net/core/netdev_max_backlog
Và /proc/sys/net/core/somaxconn
, nhưng dường như chúng không có sự khác biệt.
Bên cạnh đó, không có lỗi nếu họ là 10000 đồng thời ssh s khác nhau máy chủ (vấn đề chỉ xảy ra khi ssh đến một single 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
Tôi đã bị mắc kẹt trên này khá lâu.
Mọi sự giúp đỡ đều được đánh giá cao!
sleep 100s
những gì bạn nghĩ. Nó được thực thi không phải trong phiên ssh, mà trên máy của riêng bạn.
error: reexec socketpair: Too many open files
, vì vậy tôi cho rằng giá trị trước đó của nofile
(tức là 65535) là không đủ. Tôi không quen với ControlMaster nhưng tôi sẽ thử, cảm ơn bạn !! :)
ps axu | egrep "ssh|sleep" | grep -v grep
chỉ liệt kê một sleep 100s
, không phải ssh
. Tôi nghĩ bạn nên thay đổi lệnh để ssh "echo hi; sleep 100s"
.
sleep 100
nên có trong lệnh được gửi qua ssh, đó là trường hợp trong kịch bản thực tế của tôi, nhưng tôi đã đánh máy ở đây. Tôi đã cập nhật bài viết chính cho phù hợp. Cảm ơn bạn rất nhiều vì đã chỉ ra nó !!