Tại sao không đọc từ / dev / zero được tính là IO_RBYTES?


25

Tôi đang dọn sạch ổ cứng trên một số HĐH Linux 4.x bằng lệnh này:

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

Và tôi đã mở một tty khác và bắt đầu sudo htopvà nhận thấy điều này:

  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

Giá trị cho IO_WBYTEScó vẻ khá bình thường, nhưng IO_RBYTESvẫn ở mức 4 KiB và không bao giờ thay đổi.

Tôi đã chạy một vài chương trình khác, ví dụ

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

và đã rất ngạc nhiên khi thấy không ai trong số họ tạo ra nhiều IO_RBYTEShay IO_WBYTES.

Tôi nghĩ rằng điều này không cụ thể cho bất kỳ chương trình nào, nhưng tại sao không đọc /dev/zerovà ghi để /dev/{zero,null}tính là byte I / O?


5
Tôi tò mò, tại sao bạn nghĩ họ nên tính là I / O?
marcelm

1
@marcelm Tôi nghĩ rằng bất kỳ đầu vào / đầu ra nào cũng nên được tính là I / O, bao gồm tệp R / W, I / O mạng và nhiều thứ khác.
iBug

nhưng các hoạt động đó thực hiện I / O cho phần cứng (đĩa và card mạng tương ứng) và phải di chuyển qua một số bus I / O (như PCI-express), tất cả đều có thể là một nút cổ chai đáng kể. Viết, nói rằng, /dev/nullcuối cùng không can thiệp vào phần cứng như vậy và không làm tắc nghẽn xe buýt I / O. Thực hiện đến cùng cực; đọc / ghi vào / từ bộ nhớ cũng là I / O? Tất nhiên, không có sự phân định khó khăn cho những điều này, và tất cả phụ thuộc vào quan điểm của bạn trong những điều này, và quan điểm đó hữu ích như thế nào đối với bạn.
marcelm

1
Lưu ý, nhận xét đầu tiên của tôi nhằm khiêu khích bạn (và những người khác) suy nghĩ về những quan điểm đó và tìm hiểu lý do tại sao bạn đưa ra quan điểm của mình. Tôi không có ý ám chỉ bạn sai; Tôi thậm chí không nghĩ rằng tình hình là đen trắng. Nhưng về mặt cá nhân, tôi sẽ quan tâm nhiều hơn đến thống kê I / O đối với phần cứng thực tế (rất có thể là nút cổ chai) so với /dev/{null,zero}(thường không phải là nút cổ chai). Đó chỉ là quan điểm của tôi thôi :)
marcelm

1
@marcelm Nhưng ban đầu tôi nghĩ rằng bất kỳ read(2)write(2)được tính là I / O, điều này rất hợp lý theo nghĩa riêng của nó.
iBug

Câu trả lời:


54

Chúng được tính là I / O, nhưng không phải là loại được đo bởi các lĩnh vực bạn đang xem.

Trong htop, IO_RBYTESIO_WBYTEShiển thị read_byteswrite_bytescác lĩnh vực từ /proc/<pid>/io, và những lĩnh vực đo lường byte mà đi qua các lớp khối. /dev/zerokhông liên quan đến lớp khối, vì vậy các lần đọc từ nó không hiển thị ở đó.

Để xem I / O từ /dev/zero, bạn cần nhìn vào rcharwcharcác trường trong /proc/<pid>/iođó hiển thị htopdưới dạng RCHARWCHAR:

rchar : ký tự đọc

Số lượng byte mà tác vụ này đã gây ra được đọc từ bộ lưu trữ. Đây chỉ đơn giản là tổng số byte mà quá trình này truyền đến read(2)và các hệ thống tương tự gọi. Nó bao gồm những thứ như I / O đầu cuối và không bị ảnh hưởng bởi liệu I / O đĩa vật lý thực tế có được yêu cầu hay không (việc đọc có thể đã được thỏa mãn từ pagecache).

wchar : ký tự viết

Số lượng byte mà tác vụ này đã gây ra hoặc sẽ được ghi vào đĩa. Hãy cẩn thận tương tự áp dụng ở đây như với rchar.

Xem man 5 procman 1 htopđể biết chi tiết.


Vì vậy, nó rcharwcharđếm byte từ các cuộc gọi đến read(2)write(2), phải không?
iBug

Vâng đúng vậy.
Stephen Kitt

9
Nói về phrasing gây hiểu lầm trên mô tả của rchar . Tất cả mọi thứ thông qua read()chắc chắn không phải là "đọc từ lưu trữ "!
ilkkachu

2
@ilkkachu bởi storagehọ có nghĩa là "bất kỳ dòng xe buýt có thể tưởng tượng", bất kể việc lưu trữ trong câu hỏi là vật lý hay ảo hoặc mmap'd hoặc một ổ cắm ảo hoặc trong bộ nhớ cache L1 - nó chỉ là bất cứ điều gì ngoài bộ nhớ ánh xạ của chương trình bao gồm chia sẻ
mèo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.