ทุกคนสามารถอธิบายได้อย่างแม่นยำว่า IOWait คืออะไร


194

เท่าที่ฉันได้อ่านเกี่ยวกับ iowait มันยังคงเป็นปริศนาสำหรับฉัน

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

อะไรคือเครื่องมือที่เหมาะสมในการวิเคราะห์ว่ากระบวนการใดที่รอคอย IO อย่างแน่นอน

และอะไรคือวิธีลดเวลารอของ IO?


และไอโออิทที่สูงคืออะไร?
Muhamed Huseinbašić

คำตอบ:


99

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

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

อะไรคือเครื่องมือที่เหมาะสมในการวิเคราะห์ว่ากระบวนการใดที่รอคอย IO อย่างแน่นอน

เครื่องมือบางอย่างที่คุณอาจพบว่ามีประโยชน์

  • iostatเพื่อตรวจสอบเวลาให้บริการของดิสก์ของคุณ
  • iotop (หากเคอร์เนลของคุณรองรับ) เพื่อตรวจสอบการแยกคำขอ IO ต่อกระบวนการ
  • straceเพื่อดูการทำงานจริงที่ออกโดยกระบวนการ

และอะไรคือวิธีลดเวลารอของ IO?

  • ให้แน่ใจว่าคุณมีหน่วยความจำกายภาพฟรีดังนั้นระบบปฏิบัติการสามารถแคชบล็อกดิสก์ในหน่วยความจำ
  • ทำให้การใช้งานดิสก์ระบบไฟล์ของคุณต่ำกว่า 80% เพื่อหลีกเลี่ยงการกระจายตัวมากเกินไป
  • ปรับแต่งระบบไฟล์ของคุณ
  • ใช้ตัวควบคุมอาร์เรย์ที่แบตเตอรี่สำรอง
  • เลือกขนาดบัฟเฟอร์ที่ดีเมื่อดำเนินการกับ io

6
อย่าลืม "ตรวจสอบให้แน่ใจว่าที่เก็บข้อมูลแบ็คเอนด์ของคุณเร็วพอที่จะรองรับการโหลด I / O ของคุณ"
jgoldschrafe

1
@ Dave Cheney และเมื่อกระบวนการของฉันไม่ได้ใช้งานนั่นเป็นเพราะกำลังรอ IO ดังนั้นความแตกต่างระหว่าง IOWait และว่างคืออะไร
ctrl-alt-delor

4
เมื่ออยู่ใน IOwait กระบวนการจะอยู่ใน "Uninterruptible sleep" ซึ่งหมายความว่าไม่สามารถฆ่าได้เพื่อหลีกเลี่ยงความเสี่ยงของการทำลายข้อมูลในดิสก์ กระบวนการว่างเปล่าปกติไม่ได้ทำอะไรเลยดังนั้นจึงมีความเสี่ยงน้อยกว่าที่จะฆ่ามัน
mveroone

1
ยิ่งไปกว่านั้นหมายความว่า IO ของคุณช้าเกินไป "ทำให้เซิร์ฟเวอร์เร็วขึ้น" จะแตกต่างกันไม่ว่าคุณจะมี CPU จำกัด หรือ CPU ของคุณกำลังหิวโหยเพราะมีคนตัดสินใจว่าแผ่นดิสก์โน้ตบุ๊กที่ช้านั้นเพียงพอที่จะเรียกใช้เซิร์ฟเวอร์ฐานข้อมูลและการโหลด IO ทำให้ CPU ใช้เพียง 2% ของสิ่งที่ทำได้ ทำให้ IO บ้าคลั่ง
TomTom

OMG ฉันไม่อยากเชื่อเลยว่าคำตอบ 3 อันดับแรกที่นี่ผิดไป คำตอบด้านล่างโดย haridsv นั้นถูกต้อง cpu ไม่มี "รอ" เพื่อให้ io ดำเนินการให้เสร็จสิ้น ใช่ io บางส่วนสามารถบล็อกได้ - บ่อยครั้งมีเหตุผลที่ดีสำหรับสิ่งนี้และในบางสถานการณ์ io ทั้งหมดสามารถบล็อกได้ แต่คุณยังสามารถเห็น iowait ที่เกิดขึ้นสำหรับการดำเนินการแบบอะซิงโครนัสอย่างสมบูรณ์
symcbean

47

คำถามเก่า ๆ เพิ่งถูกกระแทก แต่รู้สึกว่าคำตอบที่มีอยู่ไม่เพียงพอ

นิยาม & คุณสมบัติของ IOWait

IOWait (มักจะมีป้ายกำกับ%waอยู่ด้านบน) เป็นหมวดย่อยของว่าง ( %idleโดยปกติจะแสดงเป็นว่างทั้งหมดยกเว้นหมวดหมู่ย่อยที่กำหนดไว้) หมายถึง CPU ไม่ได้ทำอะไร ดังนั้นตราบใดที่ยังมีกระบวนการอื่นที่ CPU สามารถประมวลผลได้ก็จะทำเช่นนั้น นอกจากนี้ไม่ได้ใช้งานผู้ใช้ระบบ iowait ฯลฯ เป็นการวัดที่เกี่ยวกับ CPU กล่าวอีกนัยหนึ่งคุณสามารถคิดว่า iowait เป็นเวลาว่างที่เกิดจากการรอคอย io

แม่นยำ, iowait คือเวลาที่ใช้ในการรับและจัดการกับการขัดจังหวะฮาร์ดแวร์เป็นเปอร์เซ็นต์ของเห็บตัวประมวลผล ขัดจังหวะซอฟต์แวร์มักจะ labled %siแยกเป็น

ความสำคัญและความเข้าใจผิดที่อาจเกิดขึ้น

IOWait มีความสำคัญเพราะมักจะเป็นตัวชี้วัดสำคัญที่จะรู้ว่าคุณมีปัญหาคอขวดใน IO หรือไม่ แต่การขาด iowait ไม่ได้แปลว่าแอปพลิเคชันของคุณไม่ได้มีปัญหาคอขวดใน IO พิจารณาสองแอปพลิเคชันที่ทำงานบนระบบ หากโปรแกรม 1 มีปัญหาคอขวดอย่างหนักและโปรแกรม 2 เป็นผู้ใช้ CPU หนัก CPU %user + %systemอาจยังคงมีลักษณะเช่น ~ 100% และสอดคล้องกัน iowait จะแสดง 0 แต่นั่นเป็นเพราะโปรแกรม 2 นั้นเข้มข้นและค่อนข้างจะไม่พูดอะไรเลย โปรแกรม 1 เพราะทั้งหมดนี้มาจากมุมมองของ CPU

เครื่องมือในการตรวจหา IOWait

ดูโพสต์โดย Dave Cheney และ Xerxes

แต่ยังเป็นที่เรียบง่ายจะแสดงในtop%wa

ลด IOWait

นอกจากนี้ขณะนี้เราเกือบเข้าสู่ปี 2556 นอกเหนือจากที่คนอื่นพูดแล้วตัวเลือกของอุปกรณ์เก็บข้อมูล IO ที่ยอดเยี่ยมนั้นมีราคาไม่แพงเช่น SSD SSD นั้นยอดเยี่ยม !!!


35

iowait

iowaitเป็นเวลาที่หน่วยประมวลผล / ประมวลผลกำลังรอ (เช่นอยู่ในสถานะไม่ได้ใช้งานและไม่ได้อะไร ) ในระหว่างที่มีในความเป็นจริงเป็นดิสก์ที่โดดเด่นการร้องขอ I / O

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

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

เครื่องมือ

  • sar(จากsysstatแพ็คเกจมีให้ในเครื่องส่วนใหญ่ * ระวัง)
  • iostat
  • sarface(ส่วนหน้าถึงsar)

7
โปรดทราบว่าการพูดอย่างเคร่งครัดคำจำกัดความของเวลารอ I / O นั้นจะใช้งานได้กับระบบตัวประมวลผลเดียวเท่านั้น จำเป็นต้องได้รับการปรับปรุงให้ดีขึ้นสำหรับระบบหลายโปรเซสเซอร์: veithen.blogspot.be/2013/11/iowait-linux.html
Andreas Veithen

ขอบเขตiowaitมีผลต่อLoad Averageอะไร? บอกว่า 100 กระทู้รอเครือข่าย LA จะครบ 100 ไหม
Ivan Balashov

32

ฉันพบคำอธิบายและตัวอย่างจากลิงค์นี้มีประโยชน์มาก: "iowait" คืออะไร? . BTW เพื่อความสมบูรณ์ I / O ที่นี่หมายถึงดิสก์ I / O แต่อาจรวม I / O บนดิสก์ที่เมาท์เครือข่าย (เช่น nfs) ตามที่อธิบายไว้ในโพสต์นี้

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

เพื่อสรุปในหนึ่งประโยค 'iowait' คือเปอร์เซ็นต์ของเวลาที่ CPU ไม่ทำงานและมี I / O อย่างน้อยหนึ่งรายการ

CPU แต่ละตัวสามารถอยู่ในสถานะหนึ่งในสี่สถานะ: user, sys, idle, iowait

ฉันสงสัยว่าเกิดอะไรขึ้นเมื่อระบบมีกระบวนการอื่นพร้อมที่จะทำงานในขณะที่กระบวนการหนึ่งกำลังรอ I / O ด้านล่างอธิบายว่า:

หาก CPU ไม่ได้ใช้งานเคอร์เนลจะพิจารณาว่าขณะนี้มี I / O อย่างน้อยหนึ่งรายการที่กำลังดำเนินการกับโลคัลดิสก์หรือดิสก์ที่ติดตั้งแบบรีโมต (NFS) ซึ่งเริ่มต้นจาก CPU นั้น หากมีอยู่ตัวนับ 'iowait' จะถูกเพิ่มขึ้นทีละตัว หากไม่มี I / O อยู่ระหว่างดำเนินการซึ่งเริ่มจาก CPU ตัวนับ 'idle' จะเพิ่มขึ้นทีละตัว

และนี่คือตัวอย่าง:

สมมติว่ามีสองโปรแกรมที่ทำงานบน CPU หนึ่งคือโปรแกรม 'dd' ที่อ่านจากดิสก์ อีกโปรแกรมหนึ่งคือไม่มี I / O แต่ใช้เวลา 100% ในการทำงานด้านคอมพิวเตอร์ ตอนนี้สมมติว่ามีปัญหากับระบบย่อย I / O และฟิสิคัล I / O นั้นกำลังใช้เวลามากกว่าหนึ่งวินาทีจึงจะเสร็จสมบูรณ์ เมื่อใดก็ตามที่โปรแกรม 'dd' นอนหลับในขณะที่รอ I / Os ให้เสร็จสมบูรณ์โปรแกรมอื่นก็สามารถทำงานบน CPU นั้นได้ เมื่อการขัดจังหวะนาฬิกาเกิดขึ้นจะมีโปรแกรมที่ทำงานในโหมดผู้ใช้หรือโหมดระบบเสมอ ดังนั้นค่า% idle และ% iowait จะเป็น 0 แม้ว่า iowait จะเป็น 0 ในตอนนี้นั่นไม่ได้หมายความว่าไม่มีปัญหา I / O เพราะเห็นได้ชัดว่ามีค่าถ้า I / O ทางกายภาพใช้เวลาหนึ่งวินาทีเพื่อทำให้เสร็จสมบูรณ์

ข้อความแบบเต็มคือการอ่านที่คุ้มค่า นี่คือมิเรอร์ของหน้านี้ในกรณีที่มันลงไป


1

สำหรับ Solaris ฉันใช้ DTrace เพื่อดูว่ากระบวนการกำลังทำอะไรถ้าฉันต้องการดูการทำงานของ I / O ที่กำลังทำงานอยู่ สำหรับ Linux นั้นมีโปรแกรมที่คล้ายกันที่เรียกว่าsystemtapซึ่งให้ระดับการเปิดรับที่คล้ายกับเคอร์เนลและการเรียกใช้กระบวนการ

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


0

การทำงานแบบ IO ชนิดใดขึ้นอยู่กับแอพพลิเคชั่นและการตั้งค่าของคุณ

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

เพื่อลดเวลา IO ให้ซื้อหน่วยความจำเพิ่มและเร็วขึ้นรับดิสก์เร็วขึ้นจัดเรียงข้อมูลดิสก์ที่คุณมี

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


โอเคดังนั้น iowait ถึงเวลาที่ใช้ในการบล็อก IO หรือไม่
Peter Krumins

ตัวอย่างเช่นถ้าฉันเลือก select () หรือสำรวจ () และบล็อกมันดังนั้นเวลาที่รอจนกว่าตัวอธิบายจะพร้อมใช้งานจะเป็นเวลา iowait หรือไม่
Peter Krumins

ฉันคิดว่านั่นจะเป็นของ SO เนื่องจากดูเหมือนคำถามการเขียนโปรแกรม
Jeremy French

Peteris - ใช่นั่นเป็นวิธีที่ดีในการคิด
user2278

0

การใช้ ps aux สามารถพิมพ์กระบวนการ STAT
ถ้า stat เป็น D หรือ Ds กระบวนการอยู่ใน Uninterruptible sleep (โดยปกติ IO)
เมื่อกระบวนการเข้าสู่ Uninterruptible sleep, nr_iowait ของ runqueue จะถูกเพิ่มและหาก nr_iowait> 0 เวลาว่างของ cpu ถึง iowait

vmstat ยังแสดงจำนวนโปรเซสบล็อกที่
r: จำนวนโปรเซสที่รอเวลารัน
b: จำนวนกระบวนการในโหมดสลีป

http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/

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