ปรับแต่งเซิร์ฟเวอร์ Linux ของฉันเพื่อจัดการ 10,000 เธรดต่อกระบวนการ
ตามที่คนอื่นอธิบายนี่เป็นความผิดปกติ ด้ายเป็นทรัพยากรที่มีค่าใช้จ่ายสูงสะดุดตาเพราะมันมีของตัวเองเรียกกอง (โดยทั่วไปเมกะไบต์) และเพราะมันเป็น schedulable งานโดย kernel หัวข้อแม้ราคาแพงกว่าเปิดอธิบายไฟล์
อ่านระบบปฏิบัติการ: สามชิ้นง่าย (ตำราเรียนที่ดาวน์โหลดได้อย่างอิสระ)
โดยทั่วไปแล้วคุณไม่ต้องการมีหลายเธรดและแน่นอนว่ามีหลายเธรดที่รันไม่ได้ จำนวนเธรดที่รันได้โดยทั่วไปควรมีจำนวนคอร์มากที่สุด(หรือหลาย ๆ อัน) ดังนั้นจะมีประมาณหนึ่งโหล จำนวนเธรดในกระบวนการอาจใหญ่กว่าเล็กน้อย ดังนั้นถ้าคุณมีเซิร์ฟเวอร์ที่กว้างขวางมาก (ที่มีซ็อกเก็ตโปรเซสเซอร์และแกนประมวลผลจำนวนมาก) คุณไม่ต้องการมีเธรดที่รันได้มากกว่าหนึ่งโหลและหนึ่งร้อยเธรด (ส่วนใหญ่จะไม่ได้ใช้งาน) ในกระบวนการของคุณ (บนเดสก์ท็อป) .
บน Linux เธรดและกระบวนการคล้ายกันมาก (เนื่องจากทั้งคู่สามารถสร้างได้โดยการโคลน (2) ) และทั้งคู่เป็นงานที่กำหนดโดยเคอร์เนล อันที่จริงตัวจัดตารางเวลาเคอร์เนลคือการกำหนดเวลางานซึ่งสามารถเป็นเธรดภายในกระบวนการแบบมัลติเธรดบางส่วนหรือเธรดหลักเดี่ยวของกระบวนการแบบเธรดเดียว (ในกรณีนี้คุณจะตั้งชื่อ "กระบวนการ" ที่เธรดเดี่ยว) หรือเธรดเคอร์เนล คุณอาจไม่ต้องการมีงานที่กำหนดตารางเวลาได้มากกว่าพันงานในระบบเดสก์ท็อปของคุณ
บน Linux กระบวนการเป็นเพียงกลุ่มของเธรดที่แชร์พื้นที่ที่อยู่เสมือนเดียวกัน(และแบ่งปันสิ่งอื่น ๆ เช่นตารางตัวอธิบายไฟล์ ฯลฯ ... ) บางกระบวนการมีเพียงเธรดเดียว
พื้นที่ที่อยู่เสมือนจะถูกกำหนดโดยวิกิพีเดีย
"ชุดช่วงของที่อยู่เสมือนที่ระบบปฏิบัติการทำให้กระบวนการ"
(แต่โปรดดูคำตอบนี้เพื่ออธิบายว่าคำศัพท์นั้นไม่เป็นสากลและเอกสารของ Microsoft บางฉบับใช้คำจำกัดความที่แตกต่างและเข้ากันไม่ได้ )
บน Linux proc (5)มีประโยชน์ในการทำความเข้าใจพื้นที่ที่อยู่เสมือนของกระบวนการบางอย่าง ลองทั้งสอง
cat /proc/self/maps
และcat /proc/$$/maps
ในสถานี ดูเพิ่มเติมนี้และpmap (1)และPS (1)และด้านบน (1)
โปรแกรมพื้นที่ผู้ใช้ทั้งหมดกำลังทำงานในบางกระบวนการและใช้หน่วยความจำเสมือนดังนั้นทุกกระบวนการมีพื้นที่ที่อยู่เสมือนของตัวเอง RAMจริงเป็นทรัพยากรที่จัดการโดยเคอร์เนล Linux และแอปพลิเคชันไม่สามารถเข้าถึง RAM โดยตรง (ยกเว้นโดยmmap (2) -ing /dev/mem
, ดูmem (4) )
ดังนั้นกระบวนการไม่ได้ใช้RAM โดยตรง มันใช้หน่วยความจำเสมือนและมีพื้นที่ที่อยู่เสมือนของตัวเอง เคอร์เนลใช้เพจการจัดการ RAM ที่มีอยู่จริงหน้าและให้พื้นที่ที่อยู่เสมือนและกระบวนการที่เป็นนามธรรม ได้ตลอดเวลา (แม้ในขณะที่กระบวนการของคุณไม่ได้ใช้งานหรือเมื่อมันกำลังทำงาน) เคอร์เนลอาจเลื่อนหน้าบางหน้าออก (เช่นสลับไปยังดิสก์) เคอร์เนลกำลังกำหนดค่าMMU (และการจัดการข้อยกเว้นฮาร์ดแวร์หน้าพลาดในบางจัดการขัดจังหวะไม่ว่าจะโดยการดึงหน้าจากดิสก์หรือโดยการเผยแพร่ข้อผิดพลาดการแบ่งส่วนเพื่อกระบวนการดูสัญญาณ (7) )
คุณอาจมีเธรดสีเขียวด้านบนเธรดระบบ (แต่ไลบรารีเธรดสีเขียวนั้นยากต่อการปรับใช้และดีบัก) ดูgoroutines ที่ใช้ในGoเพื่อเป็นตัวอย่างแฟนซี ดูยังsetcontext (3)
บางครั้งระบบของคุณอาจทดลองหวด สิ่งนี้เกิดขึ้นเมื่อหน่วยความจำเสมือนทั้งหมด (ต้องการโดยทุกกระบวนการ) เกินกว่า - โดยใช้หน่วยความจำขนาดใหญ่ - ฟิสิคัลแรมที่มีอยู่ จากนั้นคอมพิวเตอร์ของคุณจะไม่ตอบสนอง อ่านข้อมูลเกี่ยวกับขนาดของถิ่นที่อยู่ในชุด , ความต้องการเพจจิ้ง , ชุดทำงาน , หน่วยความจำ overcommitmment , ASLR
ดูเพิ่มเติม - สำหรับ Linux- ทางแยก (2) , โคลน (2) , mmap (2) , madvise (2) , posix_fadvise (2) , mlock (2) , execve (2) , หนังสือรับรอง (7) , pthreads (7) , futex (7) , ความสามารถในการ (7)