Hyperthreading ควรใช้ CPU จำนวนเท่าใด?


22

สมมติว่าฉันมีซีพียูเซิร์ฟเวอร์ที่มี 18 คอร์โดยมีไฮเปอร์เธรดเปิดอยู่ซึ่งหมายความว่าฉันสามารถเห็น 36 ซีพียูใน htop

หากต้องการใช้ CPU อย่างเต็มที่และไม่ส่งผลกระทบต่อประสิทธิภาพของเธรดเดี่ยวฉันควรตั้งเป้าให้ "คอร์" ทั้ง 36 คอร์ททำงานที่ 100% และคอร์ HT จะทำงานได้น้อยลงและยังคงรายงาน 100% หรือหมายความว่า แกน "เต็ม" กำลังถูกขัดจังหวะโดยงานใน "HT core" ของมันและทำงานแบบเธรดเดี่ยวน้อยลงหรือไม่

ฉันรู้ว่ามีตัวแปรมากมายที่ส่งผลต่อประสิทธิภาพ HT ฉันแค่อยากรู้ว่าซีพียูเมตรมีความหมายอย่างไรเมื่อจัดการกับ HT


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

4
เนื่องจากการออกแบบนั้นไฮเปอร์เธรดทำงานได้ดีกับเวิร์กโหลดแบบผสม ตัวอย่างเช่นไฮเปอร์ไวเซอร์ที่ VMs ทั้งหมดเรียกใช้บริการที่แตกต่างกัน ในสถานการณ์แบบนั้นอาจไม่จำเป็นต้องทำการทดสอบด้วยซ้ำ สำหรับปริมาณงานที่เป็นเนื้อเดียวกันมากขึ้นโดยปกติแล้วการทดสอบจำเป็นต้องแน่ใจ
Michael Hampton

คำตอบ:


14

หากแกนประมวลผลเสมือนที่สองได้รับอนุญาตให้มีส่วนร่วมเมื่อก่อนอื่นจะติดอยู่ก็จะดีกว่าไม่ดังนั้นคุณจะได้รับงานพิเศษเล็กน้อย (อย่างน้อย)

คำถามจะกลายเป็น: เมื่อมีสองหัวข้อที่แตกต่างกันทำให้หนึ่งทำงานแย่ลง? การคาดคะเนสาขาและการอ้างอิงระหว่างคำแนะนำจะไม่เปลี่ยนแปลง กำลังรอการเข้าถึงหน่วยความจำทันที ... เธรดทั้งสองจะแย่งชิงการเข้าถึงหน่วยความจำทั้งในการใช้แคชและแบนด์วิดท์

หากคุณมี CPU บางตัวที่ทำงานกับ HT และอื่น ๆ ไม่ได้หมายความว่าคุณจะกำหนดเธรดเฉพาะให้กับประเภทหนึ่งหรืออีกประเภทหนึ่ง ฉันคิดว่าไม่ได้: โปรแกรมของคุณจะรันเธรดของพวกเขาบนคอร์เสมือนแบบสุ่ม ดังนั้นการแยกการกำหนดค่าช่วยได้อย่างไร เนื่องจาก CPU แต่ละตัวมีแคชของตัวเองสิ่งเดียวที่ส่งผลกระทบนั้นเกิดจากแบนด์วิดท์หน่วยความจำและภาระการเชื่อมโยงกันของแคช

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

ไม่มีคำตอบง่ายๆ แม้จะมีโปรแกรมเฉพาะในใจเครื่องอาจแตกต่างจากคนที่เกี่ยวข้องกับประสบการณ์ของตนเอง

คุณต้องลองด้วยตัวคุณเองและวัดว่าอะไรเร็วที่สุดด้วยการทำงานเฉพาะบนเครื่องนั้น ๆ และแม้กระนั้นก็อาจมีการเปลี่ยนแปลงด้วยการปรับปรุงซอฟต์แวร์และการใช้งานเมื่อเวลาผ่านไป

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


เครื่องวัด CPU หมายถึงอะไร: รายงานทุกครั้งที่ไม่ได้ใช้งานด้ายที่ไม่ได้ใช้งาน ทั้งเธรดแบบลอจิคัลที่กำหนดให้กับคอร์จะไม่ได้ใช้งานแม้ว่างานจริงที่ทำกับหนึ่งในนั้นอาจมีขนาดเล็ก เวลาที่ใช้กับไปป์ไลน์ติดอยู่สองสามรอบจนกว่าผลลัพธ์จะพร้อมหน่วยความจำถูกนำมาใช้การดำเนินการปรมาณูไม่พอใจ ฯลฯ ก็ไม่ทำให้เธรดถูกจัดวางเป็น "ไม่พร้อม" ดังนั้นจึงจะไม่ว่าง และเวลายังคงแสดงว่าไม่ใช้งาน การรอ RAM จะไม่แสดงเป็นว่าง มีเพียงบางอย่างเช่น I / O ที่จะทำให้บล็อกเธรดและหยุดการชาร์จเวลาเข้าหามัน โดยทั่วไประบบปฏิบัติการ mutex จะทำเช่นนั้นแต่ด้วยการเพิ่มขึ้นของระบบมัลติคอร์ที่ไม่เป็นที่แน่นอนอีกต่อไปเนื่องจาก "spinlock" จะไม่ทำให้เธรดกลับไปอยู่บนชั้นวาง

ดังนั้นซีพียูเมตร 100% ไม่ได้หมายความว่าทุกอย่างจะราบรื่นหาก CPU มักติดค้างอยู่เพื่อรอหน่วยความจำ จำนวนแกนประมวลผลแบบลอจิคัลที่น้อยลงแสดง 90% เป็นไปได้มากที่จะทำงานให้เสร็จมากขึ้นเนื่องจากจะเสร็จสิ้นการบดตัวเลขและตอนนี้กำลังรอแผ่นดิสก์อยู่

ดังนั้นไม่ต้องกังวลกับตัววัด CPU ดูที่ความคืบหน้าจริงทำเท่านั้น


23

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

ในรายละเอียดเพิ่มเติม HT จะดำเนินการบนซิลิกอนในวิธีที่ลดเวลาที่โปรเซสเซอร์ใช้งานว่างเมื่อบริบทจำเป็นต้องเปลี่ยนหรือการคาดคะเนสาขาล้มเหลว สิ่งนี้ทำให้ง่ายต่อการเข้าถึงการใช้งานหน่วยการประมวลผล 100% ง่ายกว่าด้วยเทคนิคระบบปฏิบัติการที่บริสุทธิ์ HT มีวิวัฒนาการมาตั้งแต่การเปิดตัวและมีการขนานกันมากขึ้นกับชิปที่ทันสมัยกว่าชิปที่เราใช้เมื่อ 10 ปีที่แล้ว

มีโปรไฟล์การดำเนินการสองโปรไฟล์ที่จะส่งผลต่อจุดที่คุณสมัครเป็นสมาชิกที่เหมาะสมที่สุด:

  • ระยะเวลาดำเนินการนาน หากพนักงานของคุณทำงานเป็นเวลาหลายนาทีหรือหลายชั่วโมงก่อนที่จะรีไซเคิลเช่นงานการแสดงผลขนาดใหญ่หรือการสร้างแบบจำลองสภาพแวดล้อมคุณจะได้รับประสิทธิภาพการทำงานแบบ Single-Core ที่มีประสิทธิภาพมากขึ้นต่อคนงาน นี่จะลดอัตราส่วนของคุณ
  • ระยะเวลาดำเนินการสั้น หากคนงานของคุณวนรอบเป็นวินาทีหรือนาทีเล็ก ๆ เช่นเธรดของเว็บแอพค่าใช้จ่ายที่เกี่ยวข้องในการเปิดกระบวนการใหม่หมายถึงอัตราส่วนของคุณจะสูงขึ้น

ไม่กี่นาที คุณหมายถึงไม่กี่นาที?
Ismael Miguel

ค่อนข้างมาก 1 ถึง 5 หรือมากกว่านั้น ที่ 120 วินาทีต่อคนงานด้วยคนงาน 18 คนคุณจะต้องเปลี่ยนคนใหม่ทุก ๆ 7ish วินาที มีหลายสิ่งที่เกิดขึ้นกับที่ตั้งของแคช
sysadmin1138

1
คุณไม่ได้รับมัน .. คุณกำลังพูดว่า "นาทีเล็ก ๆ " ในจุดที่ 2 ของคุณ นาทีมักจะมี "ขนาด" ที่เหมือนกันซึ่งก็คือ 60 วินาที บางครั้ง 61 วินาที
Ismael Miguel

4

คุณควรเห็นทั้ง 36 คอร์ทำงานที่ 100% โดยสมมติว่าซอฟต์แวร์สามารถทำเช่นนั้นได้ (ซึ่งไม่สำคัญ - การกำหนดตารางเวลาอาจยุ่งยากกับหลายคอร์นั้นดังนั้นจึงสามารถยอมรับได้ต่ำกว่า 100%)

เห็นได้ชัดว่าเมื่อคุณ "แยก" แร่ด้วย hyperthreading ความหมายของ 200% นั้นไม่ใช่ "2x100% - ทำงานเสร็จแล้ว แต่สิ่งนี้ไม่สามารถมองเห็นได้จากการวัดใด ๆ (ซึ่งมาจากการใช้งาน CPU และไม่มีแนวคิดเกี่ยวกับการทำงาน) งานที่ทำเสร็จแล้วขึ้นอยู่กับว่างานอยู่ที่ใด - มากกว่า 1.5 x งานที่ไม่มีเธรดไฮเปอร์จะต้องใช้เวลาส่วนใหญ่


3

วิธีการนำไฮเปอร์เธรดมาใช้นั้นแตกต่างกันไปตาม CPU เฉพาะ จาก Nehalem ไปยัง Skylake Intel ได้ลดอัตราส่วนคงที่ (เช่น: 50/50) ไปป์ไลน์ที่ใช้ร่วมกันอย่างมีนัยสำคัญมุ่งหน้าไปยังโครงสร้างที่ใช้ร่วมกันแบบไดนามิค

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

เป็นไปได้อย่างไร? ประเด็นสำคัญที่ต้องทำความเข้าใจคือ CPU ไม่ได้แสดงคอร์ฟิสิคัลและคอร์เสมือนเป็นคอร์ที่เท่ากัน แต่จะเปิดเผยสิ่งหลังในลักษณะที่มากกว่าตัวกำหนดเวลาลินุกซ์สามารถหลีกเลี่ยงการกำหนดเวลาได้หากมีฟิสิคัลคอร์อื่น ๆ กล่าวอีกนัยหนึ่งมันใช้แกนประมวลผลทางกายภาพทั้งหมดก่อนแล้วจึงเริ่มใช้แกนเสมือนจริง

ซึ่งหมายความว่าโดยทั่วไปแล้ว HyperThreading เป็นคุณสมบัติที่มีค่ามาก (โปรเซสเซอร์อื่น ๆ เช่น Power8 ใช้เทคนิค SMT ที่ลึกกว่า) และเพื่อเพิ่มปริมาณงานที่คุณควรเปิดใช้งานให้โหลด CPU ด้วยเธรดอย่างน้อยหนึ่งเธรดต่อแกนเสมือนหรือฟิสิคัล สำหรับตัวอย่างที่ใช้งานได้จริงเพื่อดึงประสิทธิภาพเต็มรูปแบบจาก CPU 18-core คุณควรใช้อย่างน้อย 36 เธรด

มีข้อยกเว้นสองประการ:

  1. หากสิ่งที่คุณต้องการคือลดเวลาในการตอบสนองจากชุดเธรดที่ จำกัด (โดยที่เธรด <ฟิสิคัลคอร์) คุณสามารถปิดใช้งาน HT
  2. CPU เก่ามาก (Pentium4 และ Nehalem มีขนาดเล็กลง) มีกฎพาร์ติชันที่ยืดหยุ่นซึ่งบังคับให้ CPU แยกทรัพยากรสำคัญหลายอย่างที่อัตราส่วน 50/50 โดยแยกจากสถานะ / โหลดของเธรดที่สองอย่างอิสระ ในกรณีนี้คุณต้องทำการเปรียบเทียบกรณีการใช้งานของคุณเพื่อให้แน่ใจว่าปริมาณงานที่เพิ่มเข้ามานั้นคุ้มค่ากับประสิทธิภาพเธรดเดี่ยวที่ลดลงอย่างมาก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.