เปิดใช้งาน Massive Concurrent SSH ไปยังเซิร์ฟเวอร์เดียว


9

เป้าหมายของฉันคืออนุญาตให้ 10,000 sshทำงานพร้อมกันบนเซิร์ฟเวอร์เดียว

เพื่อความเรียบง่ายฉันกำลังไปที่ localhost:

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

sleep 100เพื่อให้แน่ใจว่าเมื่อ 10000 SSH เริ่มต้นที่ SSH ที่ 1 ยังคงอยู่ในการเชื่อมต่อเพื่อให้มีแน่นอน 10000 พร้อมกัน SSH s

และนี่คือข้อความแสดงข้อผิดพลาดสองประเภทที่ฉันได้รับ:

1. ssh_exchange_identification: Connection closed by remote host

2. ssh_exchange_identification: read: Connection reset by peer

ฉันได้ทำการแก้ไขต่อไปนี้แล้ว:

  1. ใน/etc/security/limits.confและ/etc/security/limits.d/90-nproc.confตั้งค่า soft & hard nofile& nprocเป็น 65535 (นี่เป็นค่าสูงสุดที่เป็นไปได้ใช่ไหม - อัปเดต: ไม่ค่าสูงสุดคือ1048576 )
  2. ในการ/etc/sysctl.confตั้งค่าkernel.pty.max = 65535
  3. ในชุด/etc/ssh/sshd_configMaxStartups 10000

การปรับเปลี่ยนเหล่านี้ช่วยให้ผมที่จะทำงานได้สำเร็จ 1000 พร้อมกันSSH s ไปยังเซิร์ฟเวอร์เดียว แต่พวกเขาจะไม่ได้ทำงานสำหรับปี 2000 และเหนือSSH s

บางคนแนะนำให้เปลี่ยนค่าสำหรับMaxSessions(จริง ๆ แล้วฉันไม่ชัดเจนเกี่ยวกับการใช้งาน: มัลติเพล็กซิ่งมีผลต่อกรณีของฉันอย่างไร) /proc/sys/net/core/netdev_max_backlogและ/proc/sys/net/core/somaxconnดูเหมือนว่าพวกเขาจะไม่แตกต่างกัน

นอกจากนี้ยังมีข้อผิดพลาดไม่ว่าพวกเขาจะพร้อมกัน 10000 SSHที่จะแตกต่างกันเซิร์ฟเวอร์ (ปัญหาเกิดขึ้นเฉพาะเมื่อ SSH ไปเดียวเซิร์ฟเวอร์):

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

ฉันติดอยู่กับเรื่องนี้มานานแล้ว
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างลึกซึ้ง!


1
บันทึกเซิร์ฟเวอร์ sshd สามารถให้ข้อมูลเพิ่มเติมเกี่ยวกับเหตุผลในการปฏิเสธการเชื่อมต่อ โดยทั่วไปถ้าคุณต้องการเพียง 10,000 รอบฉันขอแนะนำให้คุณใช้มัลติเพล็กซิ่งโดยใช้ ControlMaster (และจากนั้นแน่นอนชน MaxSessions)
Jakuje

1
ฉันไม่คิดว่าsleep 100sจะทำในสิ่งที่คุณคิด มันถูกเรียกใช้งานไม่ได้อยู่ในเซสชัน ssh แต่บนเครื่องของคุณเอง
daniel kullmann

1
@Jakuje ขอบคุณที่เตือนให้ฉันตรวจสอบบันทึกเซิร์ฟเวอร์! ฉันพบerror: reexec socketpair: Too many open filesดังนั้นฉันคิดว่าค่าก่อนหน้าของnofile(เช่น 65535) นั้นยังห่างไกลจากที่เพียงพอ ฉันไม่คุ้นเคยกับ ControlMaster แต่ฉันจะลองขอขอบคุณ !! :)
Clara

1
ที่น่าสนใจเมื่อฉันจะดำเนินการอย่างใดอย่างหนึ่งของเส้นที่ps axu | egrep "ssh|sleep" | grep -v grepแสดงรายการเฉพาะไม่sleep 100s ฉันคิดว่าคุณควรเปลี่ยนคำสั่งไปยังssh ssh "echo hi; sleep 100s"
daniel kullmann

2
@danielkullmann ใช่คุณถูกต้อง - sleep 100ควรอยู่ในคำสั่งที่ส่งผ่าน ssh ซึ่งเป็นกรณีในสคริปต์จริงของฉัน แต่ฉันพิมพ์ผิดที่นี่ ฉันได้อัปเดตโพสต์หลักตาม ขอบคุณมากสำหรับการชี้ให้เห็น !!
คลาร่า

คำตอบ:


2

/ ฉันหวังว่าเขาจะแสดงความคิดเห็น

sshd ต้องการ (โดยทั่วไป แต่ถึงแม้ว่าคุณจะไม่ได้ระบุกรณีการใช้งานที่แน่นอน ฯลฯ ) จัดสรร pty ต่อการเข้าสู่ระบบอย่างไรก็ตามในกรณีของคุณ ssh "echo hi; sleep 100s" ไม่จัดสรร pty ดังนั้น ไม่จำเป็นสำหรับการตั้งค่า kernel.pty.max ... เว้นแต่คุณต้องการให้ผู้ใช้หลายพันคนลงชื่อเข้าใช้* ... เพื่อทดสอบว่าคุณจะต้องเพิ่มตัวเลือก -t ในการทดสอบของคุณเช่น ssh -t "echo hi; sleep 100s"

กลับไปที่ปัญหาด้วยการerror: reexec socketpair: Too many open files ทดสอบบน Wheezy dist-upgrade เป็นระบบของเจสซีฉันพบว่า / etc / security / limit * ไม่เปลี่ยนข้อ จำกัด ของ sshd

ตรวจสอบว่าcat /proc/<pid-of-sshd>/limits ในกรณีของฉันหลังจากการตั้งค่าใน /etc/security/limits.conf: * nofile soft 65535 * nofile hard 65535 ยังคงรายงานเพียง 1024 (อ่อน) และ 4096 (ยาก) สำหรับข้อ จำกัด ของ sshd ความละเอียดดูเหมือนจะบังคับulimit -Hn 65535& ulimit -n 65535ภายใน/etc/init.d/sshสคริปต์โดยใช้คำสั่ง ulimit นั้นฉันได้เพิ่ม nofiles ของ sshd เป็น 65535/65535 จาก 1024/4096

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.