มีวิธีที่เชื่อถือได้ในการบอกจำนวนเวลาของ I / O หรือไม่


2

ฉันกำลังกำหนดรหัสบางเวลาและฉันต้องการที่จะบอกว่าเวลาที่ใช้ไปเป็นเพราะการอ่านข้อมูลจากดิสก์ ฉันไม่เชื่อผลลัพธ์ที่timeให้ฉัน ตัวอย่างเช่นฉันมีไฟล์ 1.3GB และถ้าฉันเรียกใช้wcฉันจะได้รับ

time wc largefile.file 
  50000000  150000000 1316665179 largefile.file

real    0m26.835s
user    0m18.363s
sys     0m0.495s

อาจไม่ได้ใช้เวลา <0.5 วินาทีในการอ่านไฟล์จากฮาร์ดไดรฟ์เก่าของฉัน

มีวิธีการที่เชื่อถือได้ในการบอกเวลาเท่าไรที่เป็นเพราะ I / O หรือไม่?


timeรายละเอียดเพิ่มเติมสำหรับเหตุผลที่ผมไม่เห็นว่าการตีความ ถ้าฉันทำ

time cat largefile.file > /dev/null

real    0m24.230s
user    0m0.060s
sys     0m1.473s

ถ้าอย่างนั้นก็เป็นการดึงดูดที่จะบอกว่าประมาณ 22.5 วินาทีใช้เวลาใน I / O แต่wcตัวเลขจากด้านบนบอกเป็นนัยว่ามันคือ 8 วินาที ตัวเลขทั้งสองนี้ไม่สอดคล้องกัน


1
ดีกว่าทำซ้ำการวัด 2 ขณะรีบูตก่อนแต่ละอัน หากไฟล์นั้นอยู่ในหน่วยความจำเพียงบางส่วนการวัดนั้นจะเป็นเท็จ
harrymc

@harrymc ฉันเพิ่งทำไปsync && sudo bash -c 'echo 3 > /proc/sys/vm/drop_caches'ก่อนและได้ผลเหมือนกัน มันไม่ใช่เอฟเฟ็กต์แคชเนื่องจากเวลาโดยรวมเหมือนกัน
Lembik

การซิงค์ไม่ได้ล้างแคชหน่วยความจำ - เพียงแค่ให้แน่ใจว่าบล็อกที่ทำเครื่องหมายว่าสกปรกถูกเขียนไปยังดิสก์
harrymc

@harrymc ตกลง แต่ถ้าคุณไม่ทำการซิงค์เวลาประมาณ 0 วินาที
Lembik

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

คำตอบ:


2

sys หมายถึงเวลา cpu ที่ใช้ในเคอร์เนล แต่คุณต้องการเวลารอ io

Googling เพิ่มคำตอบสแต็กการแลกเปลี่ยนอีกรายการหนึ่งชี้ไปที่ " ต่อกระบวนการ iowait จาก / proc / $ pid / stat " (และอาจต้องรันโปรแกรมภายใต้ดีบักเกอร์และตั้งจุดพักบนexit()/ _exit()ดังนั้นคุณสามารถอ่าน iowait ก่อนที่กระบวนการจะหายไป?)

บ่อยครั้งที่ฉันคำนวณโดยการลบเวลา cpu (user + sys) จากเรียลไทม์ นั่นถือว่ากระบวนการไม่รอสิ่งที่คุณไม่นับเป็น "IO"


ขอบคุณ. ฉันเพิ่มบางคำถามเพื่อแสดงความสับสนของฉัน การลบเวลา cpu (ผู้ใช้ + sys) จากเรียลไทม์ไม่ได้ให้คำตอบที่สอดคล้องกัน
Lembik

จุดดี. ฉันสามารถบอกได้ว่าทำไมมันไม่: IO สามารถเกิดขึ้น "ในพื้นหลัง" ในขณะที่กระบวนการยังคงใช้ซีพียู เวลานั้นถูกนับเป็นเวลา cpu ไม่ใช่ io-wait หวังว่าโปรแกรมเมอร์ส่วนใหญ่เข้าใจการเขียนพื้นหลัง (ดู fsync) หรือที่รู้จักว่าการเขียนกลับ ประวัติความเป็นมาอ่านเกิดขึ้นเนื่องจากการอ่านล่วงหน้า บางทีเราอาจจะได้รับสิ่งที่เราต้องการโดยการเรียกใช้งานบนระบบไม่ได้ใช้งาน (ฮ่า) และกำลังมองหาที่อ่าน / vmstat -dเขียนมิลลิวินาทีฟิลด์ใน
sourcejedi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.