ทำไม 1 ใน 24 ซีพียูของฉันถูกตรึงที่ 100%


12

ฉันมีระบบ HP ProLiant DL380 G7 โดยใช้ซีพียู 6-core 2 ตัวพร้อมด้วย Hyper-threading ที่เปิดใช้งานรวม 24 CPU แบบลอจิคัล (ตามที่เห็นใน Windows)

เมื่อเรียกใช้แอปพลิเคชันของเราการใช้งาน CPU ของระบบโดยรวมนั้นดี แต่หนึ่งใน 24 CUPs ได้รับการตรึงไว้ที่ 100%: ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข:นี่คือข้อมูล PerfMon สำหรับกระบวนการของระบบในช่วงเวลานี้และสำหรับตัวประมวลผลที่มีการใช้ประโยชน์สูง: ป้อนคำอธิบายรูปภาพที่นี่

เป็นเรื่องปกติหรือไม่ ถ้าไม่มีวิธีระบุว่ากระบวนการใดที่ใช้ CPU แบบลอจิคัลนั้น Windows PerfMon, ResMon, Task Manager และ Process Explorer ไม่มีความช่วยเหลือนอกเหนือจากการระบุว่า CPU อยู่ที่ 100%


29
ฉันเดาว่าคงเป็นเพราะมีการใช้งานกระบวนการ
HopelessN00b

1
คุณรู้หรือไม่ว่าคุณสามารถโฮเวอร์เหนือกราฟและรับคำใบ้บอกคุณว่ากระบวนการใดใช้ซีพียูตัวประมวลผลมากที่สุด!
Lieven Keersmaekers

ฉันจะสงสัยเดลต้าขัดจังหวะ 100k คุณควรโพสต์ภาพหน้าจอรายการกระบวนการ Process Explorer ที่เราสามารถเห็นสิ่งที่มันพูดสำหรับสิ่งต่าง ๆ เช่นระบบ, DPCs, อินเตอร์รัปต์
Gabe

@RyanRies; "แอปพลิเคชัน" ของเราประกอบด้วยบริการ. NET WCF หลายตัวที่ยังมี WebSphere MQ และซอฟต์แวร์การตรวจสอบบุคคลที่สาม
Patrick Cuff

2
มันค่อนข้างแพงในการย้ายโปรเซสจากซีพียูหนึ่งไปยังอีกซีพียูเมื่อเทียบกับการกำหนดไว้ในซีพียูเดียวกันดังนั้นหากกระบวนการต้องการซีพียูจริงๆแล้วระบบปฏิบัติการมักจะไม่ต้องการย้ายมัน
Michael Hampton

คำตอบ:


11

ดังที่คนอื่น ๆ ชี้ไปแล้วเราสามารถเห็นได้จากสกรีนช็อตนั้นว่า CPU ที่ทำงานอย่างหนักนั้นใช้เวลาทั้งหมดในโหมดเคอร์เนล (สีแดง)

ใช้ Powershell ในฐานะผู้ดูแลระบบให้พิมพ์:

Get-Process | Select Name, PrivilegedProcessorTime | `
Sort-Object PrivilegedProcessorTime -Descending

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

เปิด Process Explorer เลือกตั้งค่าเซิร์ฟเวอร์สัญลักษณ์ของคุณ ตรวจสอบให้แน่ใจว่าคุณใช้งานด้วยการยกระดับ UAC แบบเต็ม คลิกขวาที่ระบบ "กระบวนการ" และไปที่คุณสมบัติ จากนั้นไปที่แท็บเธรด เรียงลำดับเธรดตามการใช้งาน CPU เธรดที่ทำให้เกิดการทำงานของโหมดเคอร์เนลทั้งหมดควรอยู่ที่นี่ หากคุณดูโมดูลที่อยู่ในรายการที่อยู่เริ่มต้นควรให้เบาะแสเกี่ยวกับงานที่เกี่ยวข้อง ตัวอย่างเช่นถ้าเป็น NDIS.sys นั่นคือไดรเวอร์ของอินเทอร์เฟซเครือข่าย หากคุณตั้งค่าเซิร์ฟเวอร์สัญลักษณ์คุณควรเห็นชื่อของฟังก์ชั่นภายในโมดูล (ยกเว้นกรณีที่ไม่ใช่ของ Microsoft) คุณจะเห็นออฟเซ็ตตัวเลขจากที่อยู่เริ่มต้นของโมดูล

หรือใช้ Xperf จาก Windows Performance Toolkit เพื่อขัดจังหวะส่วนกำหนดค่า DPC ฯลฯ

xperf -on PROC_THREAD+LOADER+DPC+INTERRUPT

และหยุดการบันทึกด้วย xperf -d logfile.etl

Xperf แทนที่เครื่องมือ Kernrate เก่าและสามารถนำข้อมูลที่มีรายละเอียดมากมาให้คุณ

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

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


IIRC มันเป็นพฤติกรรมมาตรฐานสำหรับระบบปฏิบัติการที่ใช้ CPU เพียงตัวเดียวในการจัดการกับการขัดจังหวะของฮาร์ดแวร์ ...
Massimo

1
@Massimo นี่อาจเป็นกรณีที่มีระบบปฏิบัติการเก่า แต่ไม่มีอีกแล้ว CPU ทุกตัวได้รับตารางตัวอธิบายอินเทอร์รัปต์ของตัวเองและโปรเซสเซอร์ทุกตัวมี IRQL ของตัวเอง หาก CPU ตัวใดตัวหนึ่งติดอยู่ที่ IRQL สูงด้วยเหตุผลบางอย่าง (นั่นคือการให้บริการอินเตอร์รัปต์แล้ว) มันจะไม่สามารถรับอินเทอร์รัปต์ในระดับเดียวกันหรือต่ำกว่าได้ดังนั้น Windows จะมอบอินเทอร์รัปต์ให้กับโปรเซสเซอร์อื่น จนกว่า CPU จะพร้อมใช้งาน แม้แต่ตัวนับ (วัตถุที่มีชื่อเสียงในการทำงานบน CPU0 เท่านั้น) มีอัลกอริทึมการเลือกโปรเซสเซอร์ในขณะนี้
Ryan Ries

แต่ใช่นี่อาจเป็นเรื่องง่ายเหมือนการเรียกใช้แอปแบบดั้งเดิมหรือแอปที่เขียนไม่ดีซึ่งไม่น่าพอใจและทำให้ตึกระฟ้าจำนวนมาก อินเทอร์รัปต์มักจะต้องเริ่มต้นและจบลงบน CPU ตัวเดียวกันซึ่งถูกเรียกว่า ... แต่โดยปกติแล้วแม้แต่แอพพลิเคชั่นแบบเธรดเดียวก็จะได้รับ "โหลดบาลานซ์" ระหว่างแกนในขณะที่มันทำงาน ... ความสัมพันธ์กัน.
Ryan Ries

@RyanRies; ฉันติดตั้ง Windows Performance Toolkit บนระบบและใช้ Windows Performance Recorder; คำสั่ง xperf ด้านบนยังคงให้ข้อผิดพลาด CPU สูงดูเหมือนว่ามาจาก: กระบวนการ - ระบบ; โมดูล - ntoskrnl.exe; กระทู้ - เฟส 1 เริ่มต้น; ฟังก์ชั่น - KeZeroPages มันเกิดขึ้นเมื่อแอพทำงานเท่านั้นฉันคิดว่า (หวังว่า) ฉันมีพอที่จะนำกลับไปให้นักพัฒนา แต่ฉันก็สนใจในความคิดใด ๆ ที่คุณอาจมี
Patrick Cuff

23

แสดงคอลัมน์ "เวลา CPU" ในแท็บ "รายละเอียด" ใน "ตัวจัดการงาน" และมองหากระบวนการที่มีการนับเวลา CPU ที่เพิ่มขึ้นอย่างต่อเนื่อง นั่นคือกระบวนการของคุณ ควรใช้ CPU ประมาณ 4.17% อย่างต่อเนื่อง


10

ดูเหมือนว่าจะเป็นเวลาเคอร์เนลทั้งหมดอาจเป็นอินเตอร์รัปต์พวกเขาอาจได้รับการจัดการโดย CPU เดียวเท่านั้น


+1 - มันดูเหมือนว่าเวลาเคอร์เนลใช่ไหม
Evan Anderson

จะปรากฏภายใต้กระบวนการ "ระบบ" หรือไม่ ข้อมูล PerfMon ที่เรารวบรวมระหว่างการทดสอบรันมี CPU 100% สำหรับกระบวนการ "ระบบ"
Patrick Cuff

ใช่ฉันคิดว่าจะตกอยู่ภายใต้ระบบ (ถ้ามันอยู่ในรายการทั้งหมด ... )
MichelZ

6
นั่นอาจเป็นข้อผิดพลาดของไดรเวอร์หรือฮาร์ดแวร์ที่ไม่ดีที่โต้ตอบกับไดรเวอร์โดยไม่มีข้อผิดพลาดในการกู้คืนหรือไม่ หรืออาจเป็นซอฟต์แวร์ที่เรียกใช้เคอร์เนลในวงที่แคบ
Zan Lynx

1
@MichelZ กระบวนการของผู้ใช้ที่ทำให้การเรียกใช้เครือข่าย (ซึ่งรวมถึง I / O ชนิดใด ๆ ) จะมีลักษณะเช่นนั้น
reirab

6

ค้นหากระบวนการที่มีการใช้งาน CPU อย่างต่อเนื่อง ~ 4% (= 1/24 ของ CPU ที่มีทั้งหมด) นั่นควรจะเป็น CPU ตัวเดียวที่ใช้อย่างต่อเนื่อง

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