CPU รู้ได้อย่างไรว่ามี IO ค้างอยู่


17

ฉันดูiowaitคุณสมบัติที่แสดงในเอาต์พุตยูทิลิตี้ด้านบนดังที่แสดงด้านล่าง

top - 07:30:58 up  3:37,   1 user,  load average: 0.00, 0.01, 0.05
Tasks:  86 total,   1 running,   85 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

iowait มีการกำหนดโดยทั่วไปดังนี้:

"เป็นเวลาที่ CPU ไม่ได้ใช้งานและมีบาง IO ค้างอยู่"

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

ในกรณีที่มีคำขอ IO ซีพียูที่ทำให้กระบวนการอยู่ในโหมดสลีปจะรับผิดชอบในการติดตามiowaitเวลา ซีพียูอื่น ๆ จะรายงานในเวลาเดียวกับเวลาว่างเมื่อสิ้นสุดการใช้งานจริง ๆ สมมติฐานนี้ถูกต้องหรือไม่

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


3
"กระบวนการทำงานบน CPU ตัวเดียว" ไม่ได้จริงๆ เธรดรันบนแกน CPU เดียว แต่กระบวนการที่ทันสมัยมีหลายเธรดและ CPU ที่ทันสมัยมีหลายคอร์
MSalters

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

1
มีสิ่งที่เรียกว่า (IRQ) เป็น แต่มันเป็นฮาร์ดแวร์อาจจะมากขึ้นกว่าที่เรามีความสนใจใน.
mathreadler

คำตอบ:


33

CPU ไม่รู้สิ่งใด ๆ ตัวกำหนดตารางเวลาทำ

คำจำกัดความที่คุณพูดค่อนข้างทำให้เข้าใจผิด procfs(5)manpageปัจจุบันมีคำจำกัดความที่แม่นยำยิ่งขึ้นโดยมี caveats:

iowait (ตั้งแต่ Linux 2.5.41)

(5) เวลาที่รอ I / O ให้เสร็จสมบูรณ์ ค่านี้ไม่น่าเชื่อถือด้วยเหตุผลดังต่อไปนี้:

  1. CPU จะไม่รอ I / O ให้เสร็จสมบูรณ์ iowaitเป็นเวลาที่งานกำลังรอ I / O ให้เสร็จสมบูรณ์ เมื่อ CPU เข้าสู่สถานะว่างสำหรับงานค้าง I / O งานอื่นจะถูกกำหนดเวลาไว้ใน CPU นี้

  2. บน CPU แบบมัลติคอร์ภารกิจที่รอ I / O ให้เสร็จสมบูรณ์ไม่ได้ทำงานบน CPU ใด ๆ ดังนั้นiowaitCPU แต่ละตัวจึงยากต่อการคำนวณ

  3. ค่าในฟิลด์นี้อาจลดลงในเงื่อนไขบางประการ

iowaitพยายามวัดเวลาที่ใช้รอ I / O โดยทั่วไป มันไม่ได้ถูกติดตามโดยซีพียูที่เฉพาะเจาะจงและไม่สามารถเป็นได้ (จุด 2 ด้านบน - ซึ่งตรงกับสิ่งที่คุณสงสัย) มันวัดต่อ CPU แม้ว่าเท่าที่จะทำได้

ตัวกำหนดเวลางาน“ รู้” มีรอ I / O เพราะรู้ว่ามันระงับงานที่กำหนดเพราะรอ I / O นี่คือการติดตามต่องานในin_iowaitด้านของtask_struct; คุณสามารถค้นหาin_iowaitในแกนกำหนดการเพื่อดูวิธีการตั้งค่าติดตามและล้างข้อมูล บทความล่าสุดของ Brendan Gregg เกี่ยวกับค่าเฉลี่ยการโหลด Linuxรวมถึงข้อมูลพื้นฐานที่เป็นประโยชน์ iowaitรายการใน/proc/statซึ่งเป็นสิ่งที่จะสิ้นสุดลงในtop, จะเพิ่มขึ้นทุกครั้งที่มีเห็บจับเวลาคิดและกระบวนการปัจจุบัน“กับ” CPU ไม่ได้ใช้งาน; คุณสามารถดูนี้โดยการมองหาaccount_idle_timeในซีพียูรหัสการติดตามเวลาการจัดตารางเวลาของ

ดังนั้นคำจำกัดความที่แม่นยำยิ่งขึ้นก็คือ“ เวลาที่ใช้ใน CPU นี้รอ I / O เมื่อไม่มีอะไรดีไปกว่านี้” ...

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