40

I'm creating a plugin for Munin to monitor stats of named processes. One of the sources of information would be /proc/[pid]/io. But I have a hard time finding out what the difference is between rchar/wchar and read_bytes/written_bytes.

They are not the same, as they provide different values. What do they represent?

Ciro Santilli OurBigBook.com
  • 347,512
  • 102
  • 1,199
  • 985
Kvisle
  • 698
  • 1
  • 5
  • 12
  • Hope you don't mind the changes, some (me in particular) are not familiar with minority projects, less so those in ancient languages ;) – Matt Joiner Sep 03 '10 at 08:19
  • 1
    I can live with that, but it's not that small, really. I consider it well deployed. – Kvisle Sep 04 '10 at 11:27

1 Answers1

72

While the proc manpage is woefully behind (and so are most manpages/documentation on anything not relating to cookie-cutter user-space development), this stuff is fortunately documented completely in the Linux kernel source under Documentation/filesystems/proc.rst. Here are the relevant bits:

rchar
-----

I/O counter: chars read
The number of bytes which this task has caused to be read from storage. This
is simply the sum of bytes which this process passed to read() and pread().
It includes things like tty IO and it is unaffected by whether or not actual
physical disk IO was required (the read might have been satisfied from
pagecache)


wchar
-----

I/O counter: chars written
The number of bytes which this task has caused, or shall cause to be written
to disk. Similar caveats apply here as with rchar.


read_bytes
----------

I/O counter: bytes read
Attempt to count the number of bytes which this process really did cause to
be fetched from the storage layer. Done at the submit_bio() level, so it is
accurate for block-backed filesystems. <please add status regarding NFS and
CIFS at a later time>


write_bytes
-----------

I/O counter: bytes written
Attempt to count the number of bytes which this process caused to be sent to
the storage layer. This is done at page-dirtying time.
Community
  • 1
  • 1
Matt Joiner
  • 112,946
  • 110
  • 377
  • 526
  • cancelled_write_bytes --------------------- The big inaccuracy here is truncate. If a process writes 1MB to a file and then deletes the file, it will in fact perform no writeout. But it will have been accounted as having caused 1MB of write. In other words: The number of bytes which this process caused to not happen, by truncating pagecache. A task can cause "negative" IO too. If this task truncates some dirty pagecache, some IO which another task has been accounted for (in its write_bytes) will not be happening. We _could_ just subtract that from the truncating task's write_bytes... – Massimo Sep 04 '18 at 16:19
  • 1
    It's important to know that IO done via the use of memmap will not be displayed in those counter and there's currently no way to easily measure such access – Kiwy Oct 05 '18 at 12:25