จำนวนเธรดที่เหมาะสมที่สุดต่อหนึ่งคอร์


281

สมมติว่าฉันมีซีพียู 4 คอร์และฉันต้องการเรียกใช้กระบวนการบางอย่างในเวลาน้อยที่สุด กระบวนการนี้เป็นแบบขนานกันอย่างสมบูรณ์ดังนั้นฉันสามารถเรียกใช้ชิ้นส่วนกับจำนวนเธรดที่ไม่สิ้นสุดและแต่ละเธรดใช้เวลาเท่ากัน

เนื่องจากฉันมี 4 คอร์ฉันไม่คาดหวังว่าการเร่งความเร็วใด ๆ โดยการรันเธรดมากกว่าคอร์เนื่องจากคอร์เดียวสามารถรันเธรดเดี่ยวในเวลาที่กำหนดเท่านั้น ฉันไม่รู้เกี่ยวกับฮาร์ดแวร์มากนักนี่เป็นเพียงการคาดเดา

มีประโยชน์ในการรันกระบวนการแบบขนานบนเธรดมากกว่าคอร์หรือไม่? กล่าวอีกนัยหนึ่งกระบวนการของฉันจะเสร็จเร็วขึ้นช้าลงหรือประมาณระยะเวลาเท่ากันถ้าฉันรันด้วยเธรด 4000 แทนที่จะเป็น 4 เธรด

คำตอบ:


254

หากเธรดของคุณไม่ได้ทำ I / O การซิงโครไนซ์ ฯลฯ และไม่มีสิ่งใดที่ทำงานอยู่ 1 เธรดต่อคอร์จะได้รับประสิทธิภาพที่ดีที่สุด อย่างไรก็ตามมันไม่น่าเป็นไปได้มาก การเพิ่มเธรดเพิ่มเติมมักจะช่วยได้ แต่หลังจากผ่านไประยะหนึ่งมันจะทำให้ประสิทธิภาพลดลง

ไม่นานมานี้ฉันกำลังทำการทดสอบประสิทธิภาพบนเครื่อง 2 quad-core ที่รันแอพพลิเคชั่น ASP.NET บน Mono ภายใต้ภาระที่ค่อนข้างดี เราเล่นด้วยจำนวนเธรดขั้นต่ำและสูงสุดและในที่สุดเราพบว่าสำหรับแอปพลิเคชันนั้นในการกำหนดค่าเฉพาะนั้นปริมาณงานที่ดีที่สุดอยู่ที่ระหว่าง 36 และ 40 เธรด อะไรก็ตามที่อยู่นอกขอบเขตเหล่านั้นก็ยิ่งเลวร้ายลง บทเรียน? ถ้าฉันเป็นคุณฉันจะทดสอบด้วยจำนวนกระทู้ที่แตกต่างกันจนกว่าคุณจะพบหมายเลขที่เหมาะสมสำหรับการสมัครของคุณ

สิ่งหนึ่งที่แน่นอน: 4k กระทู้จะใช้เวลานาน นั่นคือการสลับบริบทมากมาย


21
ฉันคิดว่าคำตอบของกอนซาโล่นั้นดี ฉันแค่เพิ่มที่คุณควรทดสอบและวัด โปรแกรมของคุณจะแตกต่างจากของเขาหรือของฉันหรือคนอื่นและการวัดเพียงอย่างเดียวของพฤติกรรมของโปรแกรมของคุณจะตอบคำถามของคุณอย่างถูกต้อง ประสิทธิภาพของโปรแกรมแบบขนาน (หรือพร้อมกัน) ไม่ใช่พื้นที่ที่สามารถสรุปได้ดีจากหลักการแรกเพียงอย่างเดียว
เครื่องหมายประสิทธิภาพสูง

5
+1, + คำตอบ: มันทำให้ฉันประหลาดใจที่การมีเธรดมากกว่าหลายคอร์ส่งผลให้มีประสิทธิภาพที่ดีขึ้นแม้ว่ามันจะเหมาะสมถ้าเธรดเพิ่มเติมหมายถึงการแบ่งเวลาที่มากขึ้นเมื่อเทียบกับเธรดที่แข่งขันกัน มันจะเป็นการดีที่แอปพลิเคชั่นของฉันสามารถตรวจจับความแตกต่างของประสิทธิภาพและปรับแต่งอัตโนมัติตามจำนวนเธรดที่เหมาะสม
Juliet

12
ไม่ควรทำให้คุณประหลาดใจในสถานการณ์จริง บล็อกเธรดกำลังรอทรัพยากร IO เช่นการเข้าถึงดิสก์เครือข่าย ฯลฯ และรอทรัพยากรที่ไม่ใช่ IO เช่นเธรดอื่น ๆ ให้เสร็จสิ้นโดยใช้ตัวแปรที่แชร์ สิ่งที่คุณต้องการบรรลุคือจำนวนเธรดขั้นต่ำที่อย่างน้อยหนึ่งเธรดต่อคอร์สามารถรันได้เสมอ
patros

4
1 เธรดต่อคอร์ไม่เหมาะสม จำเป็นต้องเพิ่มขึ้นอีกเล็กน้อยโดยเฉพาะอย่างยิ่งสองเท่าเนื่องจากจะทำให้เธรดอื่นทำงานได้หากเธรดถูกบล็อกชั่วคราว แม้ว่าในหน่วยความจำเท่านั้น นี่คือการนำเข้าที่มากขึ้นถ้าคุณมีระบบ (P4, I7, Sun Rock และอื่น ๆ ) ที่มีคุณสมบัติ SMT / HT)
Marco van de Voort

1
ดังนั้น "นั่นน่าจะไม่ใช่กรณี" ในคำตอบของฉัน การค้นหาหมายเลขที่ถูกต้องนั้นขึ้นอยู่กับแอพพลิเคชั่นและสถาปัตยกรรมที่รันอยู่
กอนซาโล่

129

ฉันเห็นด้วยกับคำตอบของ @ Gonzalo ฉันมีกระบวนการที่ไม่ทำ I / O และนี่คือสิ่งที่ฉันพบ:

ป้อนคำอธิบายรูปภาพที่นี่

โปรดทราบว่าเธรดทั้งหมดทำงานในหนึ่งอาเรย์ แต่ช่วงที่แตกต่างกัน (สองเธรดไม่สามารถเข้าถึงดัชนีเดียวกัน) ดังนั้นผลลัพธ์อาจแตกต่างกันถ้าพวกเขาทำงานในอาร์เรย์ที่แตกต่างกัน

เครื่อง 1.86 นั้นเป็น macbook air ที่มี SSD Mac อีกเครื่องเป็น iMac ที่มี HDD ปกติ (ฉันคิดว่ามันคือ 7200 รอบต่อนาที) เครื่องที่ใช้ Windows ยังมี HDD 7200 รอบต่อนาที

ในการทดสอบนี้จำนวนที่เหมาะสมคือจำนวนแกนในเครื่อง


14
+1 สำหรับกราฟ ชัดเจนว่า 1 เธรดต่อคอร์นั้นดีที่สุด แต่น่าสนใจที่ระบบควอดคอร์ดูเหมือนจะไม่ได้อยู่ที่จำนวนเธรดที่สูงกว่า (<100 ต่อไป) ในแบบที่คนอื่น ๆ ทำ
Jim Garrison

46
-1 สำหรับกราฟ! ทำให้เส้นโค้งเรียบผ่านพิกัด x-integer? กระโดดป่าจาก 1 2 3 ถึง 10 20 30 ถึง 50 100? และพิกัด y ที่เป็นทวีคูณของ 10 บวก 2 สำหรับการวัดที่ดี นี่คือการทำของ Excel ใช่มั้ย
Spacedman

5
@ Spacerman ใช่มันเป็น เส้นโค้งที่เรียบมีลักษณะที่ดูดีกว่ามาก IMHO : D
Motasim

22
@PascalvKooten ปัญหาไม่ใช่ว่ามันดูสวย แต่ก็หลอกลวงได้อย่างรวดเร็วก่อน ก่อนอื่นแกน y เริ่มต้นที่ 42 การพูดเกินจริงถึงความแตกต่างที่ชัดเจนระหว่างเครื่องทดสอบ ประการที่สองความก้าวหน้าที่แปลกประหลาดของค่าแกน x แนะนำว่า 'หมดเวลา' ไม่ได้ปรับขนาดเชิงเส้นด้วย 'จำนวนกระทู้' ซึ่งเป็นจริงโดยเฉพาะอย่างยิ่งสำหรับเส้นสีน้ำเงิน ฉันคิดว่าปัญหาที่คนอื่น ๆ (รวมถึงตัวฉันเอง) มีอยู่ด้วยคือมันแสดงข้อมูลผิดพลาด
pauluss86

13
@ Spacedman คำวิจารณ์บนกราฟเป็นสิ่งที่ไร้สาระที่สุดที่ฉันเจอใน 24 ชั่วโมงที่ผ่านมา กราฟช่วย มาก. ระยะเวลา มันทำได้ดีกว่านี้ไหม? ไม่มีใครสนใจ. โค้งเรียบแทนที่จะเป็นแบบแยก? นั่นคือปัญหาของคุณ ???? ฉันคิดว่าคุณทุกคนจะไม่รวมกราฟเข้าไปในคำตอบของพวกเขาเพราะคุณไม่มีเวลา / พลังงานพิเศษที่จะทำให้มันดูดี นั่นคือประเด็นของฉัน
tyrex

50

ฉันรู้ว่าคำถามนี้ค่อนข้างเก่า แต่สิ่งต่าง ๆ มีวิวัฒนาการมาตั้งแต่ 2552

ตอนนี้มีสองสิ่งที่ต้องคำนึงถึง: จำนวนแกนและจำนวนเธรดที่สามารถเรียกใช้ภายในแต่ละคอร์

ด้วยโปรเซสเซอร์ของ Intel จำนวนเธรดจะถูกกำหนดโดย Hyperthreading ซึ่งมีเพียง 2 (เมื่อมี) แต่ Hyperthreading จะลดเวลาในการประมวลผลของคุณสองครั้งแม้ว่าจะไม่ได้ใช้ 2 เธรด! (เช่น 1 ไปป์ไลน์ที่ใช้ร่วมกันระหว่างสองกระบวนการ - นี่เป็นสิ่งที่ดีเมื่อคุณมีกระบวนการมากขึ้นไม่ดีอย่างอื่นแกนเพิ่มเติมจะดีกว่าแน่นอน!

ในโปรเซสเซอร์อื่นคุณอาจมี 2, 4 หรือ 8 เธรด ดังนั้นถ้าคุณมี 8 คอร์แต่ละตัวรองรับ 8 เธรดคุณสามารถมีกระบวนการ 64 กระบวนการทำงานแบบขนานโดยไม่ต้องสลับบริบท

"ไม่มีการสลับบริบท" ไม่เป็นความจริงหากคุณใช้ระบบปฏิบัติการมาตรฐานซึ่งจะทำการสลับบริบทสำหรับสิ่งอื่น ๆ ที่อยู่นอกเหนือการควบคุมของคุณ แต่นั่นเป็นแนวคิดหลัก ระบบปฏิบัติการบางระบบให้คุณจัดสรรโปรเซสเซอร์ดังนั้นเฉพาะแอปพลิเคชันของคุณที่มีการเข้าถึง / การใช้งานโปรเซสเซอร์ดังกล่าว!

จากประสบการณ์ของฉันเองถ้าคุณมี I / O มากมายหลายเธรดก็ดี หากคุณมีงานที่ต้องใช้หน่วยความจำหนักมาก (อ่านซอร์ส 1, อ่านซอร์ส 2, การคำนวณอย่างรวดเร็ว, เขียน) ดังนั้นการมีเธรดเพิ่มเติมก็ไม่ได้ช่วยอะไร อีกครั้งนี้ขึ้นอยู่กับจำนวนข้อมูลที่คุณอ่าน / เขียนในเวลาเดียวกัน (เช่นถ้าคุณใช้ SSE 4.2 และอ่านค่า 256 บิตซึ่งจะหยุดเธรดทั้งหมดในขั้นตอนของพวกเขา ... กล่าวอีกนัยหนึ่งเธรด 1 อาจจะง่ายกว่ามาก อาจเกือบจะเร็วถ้าไม่เร็วกว่านี้จริง ๆ แล้วมันจะขึ้นอยู่กับสถาปัตยกรรมกระบวนการและหน่วยความจำของคุณเซิร์ฟเวอร์ขั้นสูงบางตัวจัดการช่วงหน่วยความจำแยกต่างหากสำหรับคอร์ที่แยกต่างหากดังนั้นเธรดที่แยกต่างหากจะเร็วกว่า สถาปัตยกรรมกระบวนการ 4 กระบวนการจะทำงานเร็วกว่า 1 กระบวนการด้วย 4 เธรด)


4
อาจมีคนอื่น ๆ แต่สิ่งที่ฉันรู้คือโปรเซสเซอร์พลังงานจาก IBM พวกเขามีระบบที่มี 4 หรือ 8 เธรดต่อโปรเซสเซอร์ ตอนนี้พวกเขาสามารถหมุนแกนมากขึ้นดังนั้นพวกเขาจึงเสนอ 2 เธรดต่อแกนแทน ...
Alexis Wilke

นี่เก่า แต่ Intel i5, i7 ส่วนใหญ่มี cpu หลายเธรดเช่น i7 cpu มักจะมี 4 คอร์ แต่ 8 เธรด
Edgar.A

4
หน่วยประมวลผลไม่มีกระทู้ พวกเขามีแกนร่างกายและตรรกะ ด้วย hyperthreading ฟิสิคัลคอร์เดียวทำหน้าที่เป็นแกนตรรกะสองแกน ฉันมีเทคโนโลยีที่ยืนยันว่าโปรเซสเซอร์ที่มีเธรดเป็นของจริงฉันจึงวาดภาพบนไวท์บอร์ดของโปรเซสเซอร์ด้วยแกนหมุนของเธรดที่ยื่นออกมา

@TechnikEmpire ดูที่intel.com/content/www/us/en/processors/core/ …จากนั้นคุณสามารถติดต่อ intel และวาดเธรดเหล่านั้นได้เช่นกัน
g7k

24

ประสิทธิภาพที่แท้จริงจะขึ้นอยู่กับจำนวนอาสาสมัครที่ยอมทำแต่ละเธรด ตัวอย่างเช่นหากเธรดไม่ทำ I / O เลยและไม่ใช้บริการของระบบ (เช่นเป็น 100% cpu-bound) ดังนั้น 1 เธรดต่อคอร์จะเหมาะสมที่สุด หากเธรดดำเนินการใด ๆ ที่ต้องรอคุณจะต้องทดสอบเพื่อกำหนดจำนวนเธรดที่เหมาะสมที่สุด 4000 เธรดจะมีค่าโสหุ้ยการกำหนดเวลาที่สำคัญดังนั้นอาจไม่เหมาะสมเช่นกัน


21

คำตอบขึ้นอยู่กับความซับซ้อนของอัลกอริทึมที่ใช้ในโปรแกรม ฉันคิดวิธีการคำนวณจำนวนเธรดที่เหมาะสมโดยทำการวัดสองครั้งของการประมวลผล Tn และ Tm สำหรับจำนวนเธรด 'n' และ 'm' สองจำนวนโดยพลการ สำหรับอัลกอริธึมเชิงเส้นจำนวนเธรดที่เหมาะสมที่สุดคือ N = sqrt ((m n (Tm * (n-1) - Tn * (m-1))) / (n Tn-m Tm)

โปรดอ่านบทความของฉันเกี่ยวกับการคำนวณจำนวนที่เหมาะสมที่สุดสำหรับอัลกอริทึมต่างๆ: pavelkazenin.wordpress.com


4
ทำไมมันจึงลงคะแนน ฉันขอโทษ แต่นี่เป็นคำตอบที่ดีที่สุดสำหรับคำถามนี้ gonzalo เน้นส่วนที่เป็นตัวหนาของคำถามและ pkazen เน้นที่ชื่อ คำตอบทั้งสองนั้นมีประโยชน์มาก แต่คำตอบของ pkazen นั้นมีความเกี่ยวข้องเพราะเรามีวิธีการที่เป็นระบบในการประมาณจำนวนเธรด เขายังให้สูตรสำหรับอัลกอริทึม linea
tobiak777

1
ฉันไม่ได้ลงคะแนน แต่ถ้าฉันทำมันจะอยู่บนพื้นฐานที่ไม่มีคำอธิบายที่แท้จริงว่าทำไมหรือว่าจำนวนเธรดที่เหมาะสมที่สุดอาจเกี่ยวข้องกับความซับซ้อนของอัลกอริทึมบันทึกโดยการอ่านบทความที่เชื่อมโยงทั้งหมดซึ่ง เป็นการอ่านที่ยาวนาน (เนื่องจากความซับซ้อนของบทความ) นอกเหนือจากนั้นบางแง่มุมของบทความยังไม่ชัดเจนสำหรับฉันสิ่งสำคัญที่สุดคือผลการทดลองยืนยันทฤษฎี
Codebling

นอกจากนี้ฉันเชื่อว่าการคำนวณนี้ถือว่าคุณมีจำนวนคอร์ CPU ที่ไม่ จำกัด แม้ว่าข้อมูลนี้จะเป็นข้อมูลที่มีค่าแน่นอน แต่คำถามก็หมายถึงเครื่องจักรจริงที่มีคอร์จำนวนไม่มาก
Navneeth

9

ฉันคิดว่าฉันจะเพิ่มมุมมองอื่นที่นี่ คำตอบนั้นขึ้นอยู่กับว่าคำถามนั้นมีการคาดเดาขนาดเล็กหรือขนาดใหญ่หรือไม่

จากWikipedia :

การปรับขนาดที่อ่อนแอ:เวลาที่ใช้ในการแก้ไขจะแตกต่างกันอย่างไรกับจำนวนตัวประมวลผลสำหรับขนาดของปัญหาที่คงที่ต่อตัวประมวลผล

การปรับสเกลที่แข็งแกร่ง:เวลาที่โซลูชันแตกต่างกันไปตามจำนวนตัวประมวลผลสำหรับขนาดปัญหาทั้งหมดคงที่

หากคำถามสมมติว่ามีการปรับสเกลเล็กน้อยดังนั้นคำตอบของ @ Gonzalo ก็เพียงพอ อย่างไรก็ตามหากคำถามสมมติว่ามีการปรับสเกลสูงจะมีสิ่งที่ต้องเพิ่มอีกมาก ในสเกลที่แข็งแกร่งคุณจะถือว่าขนาดเวิร์กโหลดคงที่ดังนั้นหากคุณเพิ่มจำนวนเธรดขนาดของข้อมูลที่แต่ละเธรดต้องทำงานลดลง ในการเข้าถึงหน่วยความจำซีพียูสมัยใหม่นั้นมีราคาแพงและน่าจะดีกว่าที่จะรักษาตำแหน่งโดยการเก็บข้อมูลไว้ในแคช ดังนั้นจำนวนเธรดที่เหมาะสมน่าจะพบได้เมื่อชุดข้อมูลของแต่ละเธรดเหมาะกับแคชของคอร์แต่ละแกน (ฉันไม่ได้เข้าไปดูรายละเอียดของการอภิปรายว่าเป็นแคช L1 / L2 / L3 ของระบบ) หรือไม่

สิ่งนี้จะเป็นจริงแม้ว่าจำนวนเธรดจะเกินจำนวนแกน ตัวอย่างเช่นสมมติว่ามี 8 งานตามอำเภอใจ (หรือ AU) ของการทำงานในโปรแกรมซึ่งจะถูกดำเนินการบนเครื่อง 4 คอร์

กรณีที่ 1:รันด้วยสี่เธรดที่แต่ละเธรดต้องการ 2AU ที่สมบูรณ์ แต่ละหัวข้อใช้เวลา 10 วินาทีที่จะสมบูรณ์ ( ที่มีจำนวนมากคิดถึงแคช ) ด้วยสี่คอร์เวลาทั้งหมดจะเป็น 10 วินาที (10s * 4 เธรด / 4 คอร์)

กรณีที่ 2:รันด้วยแปดเธรดที่แต่ละเธรดต้องการให้เสร็จสิ้น 1AU แต่ละเธรดใช้เวลาเพียง 2 วินาที (แทนที่จะเป็น 5 วินาทีเนื่องจากจำนวนแคชที่ลดลงลดลง ) ด้วยสี่คอร์เวลาทั้งหมดจะเป็น 4s (2s * 8 เธรด / 4 คอร์)

ฉันได้ทำให้ปัญหาง่ายขึ้นและไม่สนใจค่าโสหุ้ยที่กล่าวถึงในคำตอบอื่น ๆ (เช่นสวิทช์บริบท) แต่หวังว่าคุณจะได้รับจุดที่อาจเป็นประโยชน์ในการมีจำนวนเธรดมากกว่าจำนวนแกนที่มีอยู่ทั้งนี้ขึ้นอยู่กับขนาดข้อมูลของคุณ กำลังจัดการกับ


7

4000 กระทู้ในครั้งเดียวค่อนข้างสูง

คำตอบคือใช่และไม่ใช่ หากคุณกำลังทำการบล็อก I / O จำนวนมากในแต่ละเธรดแล้วใช่คุณสามารถแสดงการเร่งความเร็วที่สำคัญซึ่งอาจทำได้ถึง 3 หรือ 4 เธรดต่อตรรกะหลัก

หากคุณไม่ได้บล็อกสิ่งต่าง ๆ จำนวนมากค่าโสหุ้ยพิเศษที่มีเธรดจะทำให้ช้าลง ดังนั้นให้ใช้ตัวสร้างโปรไฟล์และดูว่าคอขวดอยู่ตรงไหนในแต่ละส่วนที่เป็นไปได้ หากคุณทำการคำนวณอย่างหนักมากกว่า 1 เธรดต่อ CPU จะไม่ช่วย หากคุณทำการโอนหน่วยความจำจำนวนมากจะไม่ช่วยได้เช่นกัน หากคุณกำลังทำ I / O จำนวนมากเช่นสำหรับการเข้าถึงดิสก์หรือการเข้าถึงอินเทอร์เน็ตดังนั้นการมีหลายเธรดจะช่วยได้ในระดับหนึ่งหรืออย่างน้อยก็ทำให้แอปพลิเคชันตอบสนองได้ดีขึ้น


7

เกณฑ์มาตรฐาน

ฉันเริ่มเพิ่มจำนวนเธรดสำหรับแอปพลิเคชันเริ่มต้นที่ 1 จากนั้นไปที่ 100 เช่นเรียกใช้การทดลองสามถึงห้าสำหรับแต่ละเธรดและสร้างกราฟความเร็วในการทำงานเทียบกับจำนวนเธรด .

คุณควรว่าเคสเธรดสี่ตัวนั้นเหมาะสมที่สุดโดยเพิ่มขึ้นเล็กน้อยในรันไทม์หลังจากนั้น แต่อาจจะไม่ อาจเป็นเพราะแอปพลิเคชันของคุณมีแบนด์วิดท์ที่ จำกัด เช่นชุดข้อมูลที่คุณโหลดเข้าไปในหน่วยความจำมีขนาดใหญ่มากคุณจะได้รับแคชจำนวนมากที่พลาดไป

คุณไม่รู้จนกว่าคุณจะทดสอบ


3

คุณจะพบจำนวนเธรดที่คุณสามารถรันบนเครื่องของคุณโดยรันคำสั่ง htop หรือ ps ที่ส่งคืนจำนวนของกระบวนการบนเครื่องของคุณ

คุณสามารถใช้ man page เกี่ยวกับคำสั่ง 'ps'

man ps

หากคุณต้องการคำนวณจำนวนกระบวนการของผู้ใช้ทั้งหมดคุณสามารถใช้หนึ่งในคำสั่งเหล่านี้:

  1. ps -aux| wc -l
  2. ps -eLf | wc -l

การคำนวณจำนวนกระบวนการของผู้ใช้:

  1. ps --User root | wc -l

นอกจากนี้คุณยังสามารถใช้ "htop" [อ้างอิง] :

การติดตั้งบน Ubuntu หรือ Debian:

sudo apt-get install htop

การติดตั้งบน Redhat หรือ CentOS:

yum install htop
dnf install htop      [On Fedora 22+ releases]

หากคุณต้องการที่จะรวบรวม htop จากซอร์สโค้ดคุณจะพบว่ามันนี่


2

อุดมคติคือ 1 เธรดต่อคอร์ตราบเท่าที่ไม่มีเธรดใดจะบล็อก

กรณีหนึ่งซึ่งสิ่งนี้อาจไม่เป็นจริง: มีเธรดอื่นที่รันอยู่บนแกนประมวลผลซึ่งในกรณีนี้เธรดอื่น ๆ อาจทำให้โปรแกรมของคุณมีเวลาในการประมวลผลมากขึ้น


ขึ้นอยู่กับว่าคุณต้องการให้กระบวนการเบื้องหลังของผู้ใช้ทำงานเหมือนอึในขณะที่แอปพลิเคชันของคุณทำงานอยู่หรือไม่ สำหรับเรื่องนั้นคุณสามารถตั้งค่าลำดับความสำคัญแบบเรียลไทม์สำหรับแต่ละเธรดและรับพลังงานสูงสุด แต่ผู้ใช้ชอบมัลติทาสกิ้ง
Earlz

2
เรากำลังจัดการกับแอพพลิเคชั่นคู่ขนานที่น่าอัศจรรย์ ถ้าฉันเคยสร้างสิ่งเช่นนั้นฉันจะรู้สึกว่ามีสิทธิ์ได้รับซีพียูมากเท่าที่ฉันต้องการ
patros

2

ตัวอย่างหนึ่งของเธรดจำนวนมาก ("เธรดพูล") เทียบกับหนึ่งต่อคอร์คือการใช้เว็บเซิร์ฟเวอร์ใน Linux หรือใน Windows

เนื่องจากซ็อกเก็ตถูกสำรวจใน Linux หลายเธรดอาจเพิ่มโอกาสในการสำรวจซ็อกเก็ตที่ถูกต้องในเวลาที่เหมาะสม แต่ค่าใช้จ่ายในการประมวลผลโดยรวมจะสูงมาก

ใน Windows เซิร์ฟเวอร์จะดำเนินการโดยใช้ I / O Completion Ports - IOCP ซึ่งจะทำให้แอปพลิเคชั่นขับเคลื่อน: หาก I / O เสร็จสิ้น OS จะเปิดเธรดแบบสแตนด์บายเพื่อประมวลผล เมื่อการประมวลผลเสร็จสิ้น (โดยปกติจะมีการดำเนินการ I / O อื่นเช่นเดียวกับในคู่การร้องขอการตอบกลับ) เธรดจะกลับไปที่พอร์ต IOCP (คิว) เพื่อรอการดำเนินการต่อไป

หากไม่มี I / O เสร็จสิ้นจะไม่มีการประมวลผลที่ต้องทำและไม่มีการเปิดเธรด

แน่นอน Microsoft แนะนำไม่เกินหนึ่งเธรดต่อหลักในการใช้งาน IOCP I / O ใด ๆ อาจติดอยู่กับกลไก IOCP IOC อาจโพสต์โดยแอปพลิเคชันหากจำเป็น


ฉันไม่รู้ว่าคุณกำลังพูดถึงลินุกซ์ แต่บล็อกของฉันจนกว่าการเชื่อมต่อจะมาถึง ฉันขอแนะนำให้คุณอ่านบางสิ่งเกี่ยวกับ select () และ FD_SET () และฟังก์ชั่น / มาโครที่คล้ายกัน
Alexis Wilke

ตกลงดังนั้นจึงไม่มีรูปแบบอะซิงโครนัสซึ่งส่งคืนทันทีหรือไม่
Olof Forshell

จาก man page select ():timeout is an upper bound on the amount of time elapsed before select() returns. If both fields of the timeval structure are zero, then select() returns immediately. (This is useful for polling.) If timeout is NULL (no timeout), select() can block indefinitely.
Alexis Wilke

0

การพูดจากการคำนวณและมุมมองขอบเขตหน่วยความจำ (การคำนวณทางวิทยาศาสตร์) 4000 เธรดจะทำให้แอปพลิเคชันทำงานช้ามาก ส่วนหนึ่งของปัญหาคือค่าใช้จ่ายที่สูงมากของการสลับบริบทและเป็นไปได้มากว่าสถานที่หน่วยความจำไม่ดี

แต่มันก็ขึ้นอยู่กับสถาปัตยกรรมของคุณด้วย จากที่ฉันได้ยินว่าตัวประมวลผลของ Niagara คาดว่าจะสามารถจัดการหลายเธรดบนแกนเดียวโดยใช้เทคนิคขั้นสูงในการวางท่อ อย่างไรก็ตามฉันไม่มีประสบการณ์กับโปรเซสเซอร์เหล่านั้น


0

หวังว่านี่สมเหตุสมผล, ตรวจสอบการใช้งาน CPU และหน่วยความจำและใส่ค่าเกณฑ์บางอย่าง ถ้าข้ามค่าขีด จำกัด แล้วไม่อนุญาตให้สร้างเธรดใหม่อื่นอนุญาต ...

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