Kích hoạt SSH đồng thời lớn cho một máy chủ


9

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 100là để đả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:

  1. Trong /etc/security/limits.conf/etc/security/limits.d/90-nproc.conf, đặt mềm & cứng nofile& nprocthà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 )
  2. Trong /etc/sysctl.conf, đặtkernel.pty.max = 65535
  3. Trong /etc/ssh/sshd_config, thiết lập MaxStartups 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/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!


1
Nhật ký máy chủ sshd có thể cung cấp thêm thông tin về lý do từ chối kết nối. Về cơ bản nếu bạn chỉ muốn 10000 phiên, tôi khuyên bạn nên sử dụng ghép kênh bằng ControlMaster (và dĩ nhiên là tăng MaxSimes).
Jakuje

1
Tôi không nghĩ sleep 100snhữ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.
daniel kullmann

1
@Jakuje cảm ơn vì đã nhắc tôi kiểm tra nhật ký máy chủ! Tôi đã tìm thấy 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 !! :)
Clara

1
Thật thú vị, khi tôi thực hiện một trong các dòng, ps axu | egrep "ssh|sleep" | grep -v grepchỉ 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".
daniel kullmann

2
@danielkullmann Có bạn hoàn toàn đúng - sleep 100nê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ó !!
Clara

Câu trả lời:


2

/ tôi ước anh ấy có thể bình luận

sshd cần (thông thường, nhưng mặc dù bạn không chỉ định trường hợp sử dụng chính xác, v.v.) phân bổ một pty cho mỗi lần đăng nhập, tuy nhiên, trong trường hợp của bạn, ssh "echo hi; ngủ 100s" KHÔNG phân bổ một pty, vì vậy không cần cài đặt kernel.pty.max ... trừ khi bạn muốn hàng ngàn người dùng đăng nhập * ... để kiểm tra điều đó, bạn sẽ cần thêm tùy chọn -t vào các thử nghiệm của mình, tức là. ssh -t "echo hi; ngủ 100s"

Quay trở lại vấn đề hiện tại với các error: reexec socketpair: Too many open files Thử nghiệm trên hệ thống Wheezy được nâng cấp lên hệ thống Jessie, tôi thấy rằng / etc / security / limit * không thay đổi giới hạn của sshd.

kiểm tra xem cat /proc/<pid-of-sshd>/limits trong trường hợp của tôi, sau khi cài đặt trong /etc/security/limits.conf: * nofile soft 65535 * nofile hard 65535 vẫn chỉ báo cáo 1024 (mềm) và 4096 (cứng) cho giới hạn của sshd. Độ phân giải dường như là buộc ulimit -Hn 65535& ulimit -n 65535bên trong /etc/init.d/sshtập lệnh sử dụng các lệnh ulimit đó, tôi đã nâng các nofiles của sshd lên 65535/65535 từ 1024/4096

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.