ทำไมไม่อ่านจาก / dev / ศูนย์นับเป็น IO_RBYTES


25

ฉันกำลังล้างฮาร์ดไดรฟ์ในระบบปฏิบัติการ Linux 4.x บางตัวโดยใช้คำสั่งนี้:

sudo sh -c 'pv -pterb /dev/zero > /dev/sda'

และฉันเปิดอีก tty และเริ่มsudo htopและสังเกตเห็นสิ่งนี้:

  PID USER      PRI  NI CPU%   RES   SHR   IO_RBYTES   IO_WBYTES S   TIME+  Command
 4598 root       20   0 15.5  1820  1596        4096    17223823 D  1:14.11 pv -pterb /dev/zero

ค่าสำหรับIO_WBYTESดูเหมือนค่อนข้างปกติ แต่IO_RBYTESยังคงอยู่ที่ 4 KiB และไม่เคยเปลี่ยนแปลง

ฉันรันโปรแกรมอื่นสองสามตัวอย่างเช่น

dd if=/dev/zero of=/dev/zero
cat /dev/zero > /dev/zero

และรู้สึกประหลาดใจที่จะเห็นไม่มีของพวกเขาสร้างจำนวนมากหรือIO_RBYTESIO_WBYTES

ฉันคิดว่านี่ไม่เฉพาะเจาะจงกับโปรแกรมใด ๆ แต่ทำไมไม่อ่าน/dev/zeroและเขียนให้/dev/{zero,null}นับเป็น I / O ไบต์


5
ฉันอยากรู้ว่าทำไมคุณคิดว่าพวกเขาควรนับเป็น I / O
marcelm

1
@marcelm ฉันคิดว่าอินพุต / เอาต์พุตใด ๆ ควรนับเป็น I / O รวมถึงไฟล์ R / W เครือข่าย I / O และอื่น ๆ อีกมากมาย
iBug

แต่การดำเนินการเหล่านั้นดำเนินการ I / O กับฮาร์ดแวร์ (ดิสก์และการ์ดเครือข่ายตามลำดับ) และต้องเดินทางผ่านบัส I / O บางตัว (เช่น PCI-express) ซึ่งทั้งหมดนี้อาจเป็นคอขวดที่สำคัญ เขียนไปพูด/dev/nullไม่ต้องเชื่อมต่อกับฮาร์ดแวร์ดังกล่าวและไม่อุดตันรถเมล์ I / O นำไปมาก จะอ่าน / เขียนไปยัง / จากหน่วยความจำด้วย I / O หรือไม่ แน่นอนว่าไม่มีการวิเคราะห์อย่างหนักสำหรับสิ่งเหล่านี้และทุกอย่างขึ้นอยู่กับมุมมองที่คุณใช้ในสิ่งเหล่านี้และมุมมองที่เป็นประโยชน์ต่อคุณ
marcelm

1
หมายเหตุความคิดเห็นแรกของฉันมีจุดประสงค์เพื่อกระตุ้นให้คุณ (และคนอื่น ๆ ) คิดเกี่ยวกับมุมมองเหล่านั้นและค้นหาสาเหตุที่คุณรับมุมมองของคุณ ฉันไม่ได้ตั้งใจที่จะบอกว่าคุณผิด ฉันไม่คิดว่าสถานการณ์จะเป็นขาวดำ แต่โดยส่วนตัวแล้วฉันจะสนใจสถิติ I / O ของฮาร์ดแวร์จริงมากขึ้น (ซึ่งอาจเป็นคอขวด) มากกว่า/dev/{null,zero}(ซึ่งโดยปกติจะไม่ใช่คอขวด) นั่นเป็นเพียงมุมมองของฉัน :)
มีนาคม marcelm

1
@marcelm แต่ตอนแรกฉันคิดว่ามีread(2)และwrite(2)นับเป็น I / O ซึ่งสมเหตุสมผลมากในแง่ของตัวเอง
iBug

คำตอบ:


54

มันนับเป็น I / O แต่ไม่ใช่ชนิดที่วัดโดยเขตข้อมูลที่คุณกำลังดู

ในhtop, IO_RBYTESและIO_WBYTESแสดงread_bytesและwrite_bytesเขตข้อมูลจาก/proc/<pid>/ioและเขตข้อมูลเหล่านั้นวัดไบต์ที่ไปผ่านชั้นบล็อก /dev/zeroไม่เกี่ยวข้องกับเลเยอร์บล็อกดังนั้นอ่านจากมันไม่ปรากฏขึ้นที่นั่น

หากต้องการดู I / O จาก/dev/zeroคุณต้องดูที่rcharและwcharฟิลด์ใน/proc/<pid>/ioซึ่งปรากฏhtopเป็นRCHARและWCHAR:

rchar : อ่านตัวอักษร

จำนวนไบต์ที่งานนี้ทำให้อ่านจากหน่วยเก็บข้อมูล นี่เป็นเพียงผลรวมของไบต์ที่กระบวนการนี้ส่งผ่านไปread(2)และการเรียกของระบบที่คล้ายกัน ซึ่งรวมถึงสิ่งต่าง ๆ เช่นเทอร์มินัล I / O และไม่ได้รับผลกระทบจากการที่ต้องใช้ฟิสิคัลดิสก์ I / O จริงหรือไม่ (การอ่านอาจได้รับความพึงพอใจจาก pagecache)

wchar : ตัวอักษรเขียน

จำนวนไบต์ที่งานนี้ก่อให้เกิดหรือจะทำให้เขียนลงดิสก์ คำเตือนที่คล้ายกันมีผลกับที่นี่เช่นเดียวกับ rchar

ดูman 5 procและman 1 htopสำหรับรายละเอียด


ดังนั้นจึงเป็นrcharและwcharนับว่าไบต์จากการโทรไปยังread(2)และwrite(2)ใช่มั้ย?
iBug

ใช่ถูกแล้ว.
Stephen Kitt

9
พูดคุยเกี่ยวกับความเข้าใจผิดเกี่ยวกับการใช้ถ้อยคำรายละเอียดของrchar ทุกอย่างที่ผ่านมาread()แน่นอนที่สุดไม่ใช่ "อ่านจากที่เก็บ "!
ilkkachu

2
@ilkkachu โดยstorageพวกเขาหมายถึง "ใด ๆ รถเมล์สายที่เป็นไปได้" โดยไม่คำนึงว่าการจัดเก็บข้อมูลในคำถามคือจริงหรือเสมือนหรือ mmap'd หรือซ็อกเก็ตเสมือนหรือในแคช L1 - มันนอกอะไรของหน่วยความจำที่แมปของโปรแกรมที่รวมถึงแชร์
แมว
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.