Changes

Jump to: navigation, search

IO accounting

4,748 bytes added, 12:58, 27 December 2006
no edit summary
This page describes how IO activity of VE processes is accounted. This feature is available since OpenVZ kernels version <code>028test008</code>

== New resources ==
The following resources are accounted:
; read bytes
: is the amount of bytes read by tasks. Reads are always synchronous in kernel so this type of resources is the easiest one

; dirty bytes
: is the amount of bytes that were dirty since VE start, i.e. data that isn't yet flushed to disk. This type of resources is accounted using [[RSS_fractions_accounting|page beancounters]] and the context the page was dirtied by is determined like this:
* if page is mapped it's "mapper" is used as this may happen in any context (unmapping of page under memory pressure)
* if page is not mapped - current BC is used as this can happen during usual write (writev) only

; written bytes
: is the amount of bytes flushed to disk. The beancounter to charge this to is the one the page was dirtied by

; canceled bytes
: is the amount of bytes that were dirty but weren't flushed to disk

; missed bytes
: is the amount of bytes that were dirtied but the context (beancounter) wasn't saved due to lack of memory

== Proc interface ==
=== General information ===
As it was described in [[BC proc entries|another artice]] each beancounter has it's own <code>/proc/bc/$BCID</code> directory where subsystems add their entries. IO accounting adds <code>ioacct</code> entry to show IO information. This entry contains the following information:
<pre>
# cat /proc/bc/101/ioacct
read 24330240
write 598016
dirty 622592
cancel 24576
missed 0
...
</pre>

Note that <code>dirty</code> is not the size of dirty data at the moment but is the size of dirty data seen so far.

=== Debugging information ===
When <code>CONFIG_UBC_DEBUG_IO</code> is on <code>/proc/bc/ioacct_debug</code> is added. This entry contains a snapshot of current dirty pages with its beancounter in system. E.g.
<pre>
# cat /proc/bc/ioacct_debug
Races: io 0 anon 0 clean 0 missed 0
pb page flg cnt mcnt pb_list page_pb mapping ub
f7a4a520 e c17cfc68 Dawl 2 0 00000000 f7a4a521 c3870168 0
f7a15ce0 e c17d034c Dawl 2 0 00000000 f7a15ce1 c3870168 0
f72e4680 e c1083364 Dawl 2 0 00000000 f72e4681 c3870168 0
f72e4800 e c1083388 Dawl 2 0 00000000 f72e4801 c3870168 0
f7a15dc0 e c17d0010 Dawl 2 0 00000000 f7a15dc1 c3870168 0
</pre>

== Auxiliary information ==
Along with VFS IO activity the following information is gathered
; sync counts
: The number of <code>sync(2)</code>, <code>fsync(2)</code>, <code>fdatasync(2)</code> and <code>sync_file_range</code> is accounted.
<pre>
# cat /proc/bc/101/ioacct
...
syncs_total 0
fsyncs_total 0
fdatasyncs_total 10
range_syncs_total 0
syncs_active 0
fsyncs_active 0
fdatasyncs_active 0
range_syncs_active 0
</pre>
<code>_active</code> suffix refers to the number of operations in progress.

; write/read calls counts
: Then number of <code>read(2)</code>, <code>readv(2)</code>, <code>write(2)</code>, <code>writev(2)</code> etc and the number of bytes passed is also accounted.
<pre>
# cat /proc/bc/101/ioacct
...
vfs_reads 24491
vfs_read_chars 2616512
vfs_writes 380
vfs_write_chars 30064899102
</pre>

; number of page beancounters pinned by IO
: This is the number of page beancounters that save information about page dirtier. This is actually the number of dirty pages within beancounter at the moment.
<pre>
# cat /proc/bc/0/ioacct
...
write 598016
dirty 622592
...
io_pbs 0
# dd if=/dev/zero of=tmp bs=512 count=40
# cat /proc/bc/0/ioacct
...
write 598016
dirty 643072
...
io_pbs 5
# sync
# cat /proc/bc/0/ioacct
...
write 618496
dirty 643072
...
io_pbs 0
</pre>

Navigation menu