พยายามที่จะเรียกใช้โปรแกรม X ใช้8 เธรดและมันถูกกว่าในn นาที
พยายามที่จะเรียกใช้โปรแกรมเดียวกันโดยใช้50 หัวข้อและมันถูกกว่าในn * 10 นาที
เหตุใดสิ่งนี้จึงเกิดขึ้นและฉันจะได้รับจำนวนเธรดที่ดีที่สุดที่ฉันสามารถใช้ได้อย่างไร
พยายามที่จะเรียกใช้โปรแกรม X ใช้8 เธรดและมันถูกกว่าในn นาที
พยายามที่จะเรียกใช้โปรแกรมเดียวกันโดยใช้50 หัวข้อและมันถูกกว่าในn * 10 นาที
เหตุใดสิ่งนี้จึงเกิดขึ้นและฉันจะได้รับจำนวนเธรดที่ดีที่สุดที่ฉันสามารถใช้ได้อย่างไร
คำตอบ:
นี่เป็นคำถามที่ซับซ้อนที่คุณถาม โดยไม่ต้องรู้เพิ่มเติมเกี่ยวกับธรรมชาติของเธรดของคุณมันยากที่จะพูด สิ่งที่ต้องพิจารณาเมื่อวินิจฉัยประสิทธิภาพของระบบ:
เป็นกระบวนการ / เธรด
ทรัพยากรทั้งสามนี้มี จำกัด และผู้ใดก็ตามสามารถ จำกัด ประสิทธิภาพของระบบได้ คุณต้องดูว่าสถานการณ์ใดที่คุณบริโภค (อาจเป็น 2 หรือ 3 คนด้วยกัน)
คุณสามารถใช้ntop
และiostat
และvmstat
เพื่อวินิจฉัยสิ่งที่เกิดขึ้น
"ทำไมสิ่งนี้ถึงเกิดขึ้นได้?" เป็นคำตอบที่ง่าย ลองนึกภาพคุณมีทางเดินที่คุณสามารถใส่คนสี่คนลงมาข้างกัน คุณต้องการย้ายขยะทั้งหมดที่ปลายด้านหนึ่งไปยังปลายอีกด้าน จำนวนคนที่มีประสิทธิภาพมากที่สุดคือ 4
หากคุณมี 1-3 คนคุณจะพลาดที่จะใช้พื้นที่ทางเดิน หากคุณมี 5 คนขึ้นไปอย่างน้อยหนึ่งคนเหล่านั้นจะติดคิวหลังคนอื่นตลอดเวลา การเพิ่มคนมากขึ้นเรื่อย ๆ เพียงอุดตันทางเดินมันไม่ได้เพิ่มความรวดเร็ว
ดังนั้นคุณต้องการมีคนจำนวนมากเท่าที่คุณสามารถพอดีโดยไม่ทำให้เกิดการเข้าคิวใด ๆ ทำไมคุณมีการเข้าคิว (หรือคอขวด) ขึ้นอยู่กับคำถามในคำตอบของ slm
4
จะได้หมายเลขที่ดีที่สุด
คำแนะนำทั่วไปคือ n + 1 เธรดซึ่งเป็นจำนวนแกน CPU ที่มีอยู่ วิธีนี้จะทำให้เธรดสามารถทำงาน CPU ได้ในขณะที่ 1 เธรดกำลังรอดิสก์ I / O การมีเธรดที่น้อยลงจะไม่ใช้ทรัพยากร CPU อย่างเต็มที่ (ในบางจุดจะมี I / O รออยู่เสมอ) การมีเธรดเพิ่มเติมจะทำให้เธรดต่อสู้กับทรัพยากร CPU
เธรดมาไม่ฟรี แต่ด้วยค่าใช้จ่ายเช่นสวิทช์บริบทและ - หากข้อมูลจะต้องมีการแลกเปลี่ยนระหว่างหัวข้อซึ่งมักจะเป็นกรณี - กลไกการล็อคต่างๆ นี่เป็นเพียงค่าใช้จ่ายเมื่อคุณมีคอร์ CPU ที่เฉพาะเจาะจงมากขึ้นในการรันโค้ด บน CPU แกนเดียวกระบวนการเดียว (ไม่มีเธรดแยก) มักจะเร็วกว่าการทำเธรดใด ๆ เธรดไม่ได้ทำให้ซีพียูของคุณทำงานได้เร็วขึ้นอย่างน่าอัศจรรย์นั่นหมายถึงการทำงานพิเศษ
ดังที่คนอื่น ๆ ได้ชี้ให้เห็น ( คำตอบ slm , EightBitTony คำตอบ ) นี่เป็นคำถามที่ซับซ้อนและอื่น ๆ อีกมากมายเนื่องจากคุณไม่ได้อธิบายสิ่งที่คุณทำและวิธีการที่พวกเขาทำ
แต่การโยนในหัวข้อเพิ่มเติมอย่างชัดเจนสามารถทำให้สิ่งเลวร้ายลง
ในสาขาการคำนวณแบบขนานมีกฎหมายของ Amdahlที่สามารถใช้งานได้ (หรือไม่สามารถไม่ได้ แต่คุณไม่ได้อธิบายรายละเอียดของปัญหาของคุณดังนั้น .... ) และสามารถให้ข้อมูลเชิงลึกทั่วไปเกี่ยวกับปัญหาในระดับนี้
ประเด็นของกฎหมายของ Amdahl ก็คือว่าในโปรแกรมใด ๆ (ในอัลกอริทึมใด ๆ ) จะมีเปอร์เซ็นต์ที่ไม่สามารถทำงานแบบขนานได้ ( ส่วนต่อเนื่อง ) และมีอีกเปอร์เซ็นต์ที่สามารถทำงานแบบขนาน ( ส่วนขนาน ) ได้อย่างชัดเจน สองส่วนนี้รวมกันได้มากถึง 100%]
ส่วนนี้สามารถแสดงเป็นเปอร์เซ็นต์ของเวลาดำเนินการ ตัวอย่างเช่นอาจมี 25% ของเวลาที่ใช้ในการดำเนินการตามลำดับอย่างเคร่งครัดและ 75% ของเวลาที่เหลือจะใช้ในการดำเนินการที่สามารถดำเนินการแบบขนาน
(ภาพจากWikipedia )
กฎหมายของ Amdahl ทำนายว่าสำหรับทุก ๆ ส่วนที่ขนานกัน (เช่น 75%) ของโปรแกรมคุณสามารถเพิ่มความเร็วในการประมวลผลได้เพียงเท่านี้ (เช่นมากที่สุด 4 เท่า) แม้ว่าคุณจะใช้โปรเซสเซอร์มากขึ้นเรื่อย ๆ ในการทำงาน
ตามกฎของหัวแม่มือยิ่งโปรแกรมของคุณที่คุณไม่สามารถแปลงในการประมวลผลแบบขนานได้น้อยเท่าไหร่คุณก็ยิ่งสามารถใช้หน่วยประมวลผลได้มากขึ้นเท่านั้น (ตัวประมวลผล)
เนื่องจากคุณกำลังใช้เธรด (ไม่ใช่ตัวประมวลผลทางกายภาพ) สถานการณ์อาจยิ่งแย่กว่านี้ โปรดจำไว้ว่าสามารถประมวลผลเธรดได้ (ขึ้นอยู่กับการนำไปใช้งานและฮาร์ดแวร์ที่มีเช่น CPUs / Cores) ที่แชร์ตัวประมวลผลทางกายภาพ/ คอร์ที่เหมือนกัน (เป็นรูปแบบของการทำงานแบบมัลติทาสก์
การทำนายแบบเชิงประจักษ์ (ประมาณ CPU ครั้ง) ไม่ได้พิจารณาถึงคอขวดที่ใช้งานได้อื่น ๆ เช่น
ที่สามารถเป็นปัจจัย จำกัด ในการใช้งานจริง
ผู้กระทำผิดที่นี่ควรเป็น "บริบทสลับ" เป็นกระบวนการของการบันทึกสถานะของเธรดปัจจุบันเพื่อเริ่มดำเนินการเธรดอื่น หากมีเธรดจำนวนหนึ่งที่ได้รับระดับความสำคัญเท่ากันจะต้องสลับไปมาจนกว่าจะเสร็จสิ้นการดำเนินการ
ในกรณีของคุณเมื่อมีเธรด 50 เธรดการสลับบริบทจะเกิดขึ้นมากมายเมื่อเปรียบเทียบกับการรันเพียง 10 เธรด
ค่าใช้จ่ายในครั้งนี้ได้รับการแนะนำเนื่องจากการสลับบริบทเป็นสิ่งที่ทำให้โปรแกรมของคุณทำงานช้า
ps ax | wc -l
รายงาน 225 กระบวนการและมันไม่โหลดหนักมาก) ฉันอยากจะไปกับการเดา @ EightBitTony; แคชโมฆะน่าจะเป็นปัญหาที่ใหญ่กว่าเพราะทุกครั้งที่คุณล้างแคชของ CPU มีการรอมหายุครหัสและข้อมูลจาก RAM
ในการแก้ไขคำอุปมาของ EightBitTony:
"ทำไมสิ่งนี้ถึงเกิดขึ้นได้?" เป็นคำตอบที่ง่าย ลองนึกภาพคุณมีสระว่ายน้ำสองสระสระหนึ่งสระเต็มและสระว่าง คุณต้องการที่จะย้ายน้ำทั้งหมดจากที่หนึ่งไปยังที่อื่น ๆ และมี 4 บุ้งกี๋ จำนวนคนที่มีประสิทธิภาพมากที่สุดคือ 4
หากคุณมี 1-3 คนคุณก็พลาดที่จะใช้ที่เก็บบางอัน ถ้าคุณมี 5 คนหรือมากกว่านั้นอย่างน้อยหนึ่งในคนเหล่านั้นจะติดอยู่รอถัง กำลังเพิ่มผู้คนมากขึ้น ... ไม่ได้เพิ่มความเร็วในกิจกรรม
ดังนั้นคุณจึงต้องการที่จะมีเป็นคนจำนวนมากที่สุดเท่าที่สามารถทำงานบางอย่าง (ใช้ถัง) ไปพร้อม ๆ กัน
บุคคลที่นี่คือเธรดและที่ฝากข้อมูลแสดงถึงทรัพยากรการดำเนินการใด ๆ ที่เป็นคอขวด การเพิ่มชุดข้อความเพิ่มเติมไม่ช่วยหากไม่สามารถทำอะไรได้ นอกจากนี้เราควรเน้นว่าการส่งฝากข้อมูลจากบุคคลหนึ่งไปยังอีกคนหนึ่งโดยทั่วไปจะช้ากว่าคนคนเดียวที่ถือถังเก็บน้ำในระยะทางเดียวกัน นั่นคือเธรดสองเธรดที่ทำงานบนคอร์โดยทั่วไปแล้วจะทำงานน้อยกว่าเธรดเดี่ยวที่รันสองครั้งเป็นเวลานานนั่นเป็นเพราะการทำงานพิเศษที่ทำเพื่อสลับไปมาระหว่างเธรดทั้งสองนั้น
ไม่ว่าจะเป็นทรัพยากรการดำเนินการที่ จำกัด (ถัง) เป็นซีพียูหรือแกนกลางหรือขั้นตอนการสอนแบบไฮเปอร์เธรดสำหรับวัตถุประสงค์ของคุณขึ้นอยู่กับว่าส่วนใดของสถาปัตยกรรมที่เป็นปัจจัย จำกัด ของคุณ โปรดทราบเรากำลังสมมติว่าเธรดทั้งหมดเป็นอิสระ นี่เป็นกรณีเฉพาะถ้าพวกเขาไม่เปิดเผยข้อมูล (และหลีกเลี่ยงการชนกันของแคช)
ตามที่มีผู้แนะนำสองคนสำหรับ I / O ทรัพยากรที่ จำกัด อาจเป็นจำนวนของการดำเนินการ I / O ที่จัดคิวได้อย่างเป็นประโยชน์: สิ่งนี้อาจขึ้นอยู่กับโฮสต์ทั้งหมดของฮาร์ดแวร์และเคอร์เนลปัจจัย แต่อาจใหญ่กว่าจำนวนของ แกน ที่นี่การสลับบริบทซึ่งมีค่าใช้จ่ายสูงเมื่อเทียบกับโค้ดที่ถูกเรียกใช้งานจะค่อนข้างถูกเมื่อเทียบกับ I / O โค้ดที่ถูกผูกไว้ น่าเศร้าที่ฉันคิดว่าคำอุปมาจะหลุดพ้นจากการควบคุมอย่างสมบูรณ์ถ้าฉันพยายามที่จะพิสูจน์เรื่องนี้ด้วยถัง
โปรดทราบว่าโดยทั่วไปพฤติกรรมที่เหมาะสมกับรหัสที่ถูกผูกไว้ I / O นั้นยังคงมีอย่างน้อยหนึ่งเธรดต่อไพพ์ไลน์ / คอร์ / ซีพียู อย่างไรก็ตามคุณต้องเขียนโค้ด I / O แบบอะซิงโครนัสหรือซิงโครนัส / ไม่มีการปิดกั้นและการปรับปรุงประสิทธิภาพที่ค่อนข้างเล็กไม่ได้ช่วยให้เกิดความซับซ้อนเพิ่มขึ้นเสมอไป
PS ปัญหาของฉันกับอุปมาอุปไมยทางเดินดั้งเดิมคือมันแนะนำอย่างยิ่งว่าคุณควรจะสามารถมี 4 คิวของคนโดยมี 2 คิวที่บรรจุขยะและ 2 กลับไปเก็บเพิ่มเติม จากนั้นคุณสามารถสร้างคิวแต่ละคิวได้ตราบเท่าที่ทางเดินและการเพิ่มคนทำให้อัลกอริทึมเร็วขึ้น (โดยทั่วไปคุณเปลี่ยนทางเดินทั้งหมดเป็นสายพาน)
ในความเป็นจริงสถานการณ์นี้คล้ายกับคำอธิบายมาตรฐานของความสัมพันธ์ระหว่างเวลาแฝงและขนาดหน้าต่างในระบบเครือข่าย TCP ซึ่งเป็นสาเหตุที่มันกระโดดออกมาที่ฉัน
มันค่อนข้างตรงไปตรงมาและเข้าใจง่าย การมีเธรดมากกว่าสิ่งที่ CPU ของคุณสนับสนุนคุณจริง ๆ แล้วเป็นอนุกรมและไม่ขนาน ยิ่งมีเธรดมากเท่าไหร่ระบบของคุณก็จะยิ่งช้าลง ผลลัพธ์ของคุณเป็นข้อพิสูจน์ของปรากฏการณ์นี้