HOWTO: add OpenBSD to direct I/O unsupported platform
[fio.git] / HOWTO
diff --git a/HOWTO b/HOWTO
index 27bee2c0065f7d40d855ed4b214a077dd68c61b0..3a720c35b68e59d948921689ac56b6c2bfc7e95d 100644 (file)
--- a/HOWTO
+++ b/HOWTO
@@ -54,7 +54,7 @@ Command line options
 
 .. option:: --debug=type
 
-       Enable verbose tracing of various fio actions.  May be ``all`` for all types
+       Enable verbose tracing `type` of various fio actions.  May be ``all`` for all types
        or individual types separated by a comma (e.g. ``--debug=file,mem`` will
        enable file and memory debugging).  Currently, additional logging is
        available for:
@@ -104,16 +104,13 @@ Command line options
 
        Write output to file `filename`.
 
-.. option:: --output-format=type
+.. option:: --output-format=format
 
-       Set the reporting format to `normal`, `terse`, `json`, or `json+`.  Multiple
+       Set the reporting `format` to `normal`, `terse`, `json`, or `json+`.  Multiple
        formats can be selected, separated by a comma.  `terse` is a CSV based
        format.  `json+` is like `json`, except it adds a full dump of the latency
        buckets.
 
-.. option:: --runtime
-       Limit run time to runtime seconds.
-
 .. option:: --bandwidth-log
 
        Generate aggregate bandwidth logs.
@@ -128,9 +125,9 @@ Command line options
        **Deprecated**, use :option:`--output-format` instead to select multiple
        formats.
 
-.. option:: --terse-version=type
+.. option:: --terse-version=version
 
-       Set terse version output format (default 3, or 2 or 4 or 5).
+       Set terse `version` output format (default 3, or 2 or 4 or 5).
 
 .. option:: --version
 
@@ -156,8 +153,8 @@ Command line options
 
 .. option:: --enghelp=[ioengine[,command]]
 
-       List all commands defined by :option:`ioengine`, or print help for `command`
-       defined by :option:`ioengine`.  If no :option:`ioengine` is given, list all
+       List all commands defined by `ioengine`, or print help for `command`
+       defined by `ioengine`.  If no `ioengine` is given, list all
        available ioengines.
 
 .. option:: --showcmd=jobfile
@@ -217,7 +214,7 @@ Command line options
 
 .. option:: --max-jobs=nr
 
-       Set the maximum number of threads/processes to support.
+       Set the maximum number of threads/processes to support to `nr`.
 
 .. option:: --server=args
 
@@ -230,12 +227,12 @@ Command line options
 
 .. option:: --client=hostname
 
-       Instead of running the jobs locally, send and run them on the given host or
-       set of hosts.  See `Client/Server`_ section.
+       Instead of running the jobs locally, send and run them on the given `hostname`
+       or set of `hostname`s.  See `Client/Server`_ section.
 
 .. option:: --remote-config=file
 
-       Tell fio server to load this local file.
+       Tell fio server to load this local `file`.
 
 .. option:: --idle-prof=option
 
@@ -252,27 +249,27 @@ Command line options
 
 .. option:: --inflate-log=log
 
-       Inflate and output compressed log.
+       Inflate and output compressed `log`.
 
 .. option:: --trigger-file=file
 
-       Execute trigger cmd when file exists.
+       Execute trigger command when `file` exists.
 
-.. option:: --trigger-timeout=t
+.. option:: --trigger-timeout=time
 
-       Execute trigger at this time.
+       Execute trigger at this `time`.
 
-.. option:: --trigger=cmd
+.. option:: --trigger=command
 
-       Set this command as local trigger.
+       Set this `command` as local trigger.
 
-.. option:: --trigger-remote=cmd
+.. option:: --trigger-remote=command
 
-       Set this command as remote trigger.
+       Set this `command` as remote trigger.
 
 .. option:: --aux-path=path
 
-       Use this path for fio state generated files.
+       Use this `path` for fio state generated files.
 
 Any parameters following the options will be assumed to be job files, unless
 they match a job file parameter. Multiple job files can be listed and each job
@@ -296,8 +293,8 @@ override a *global* section parameter, and a job file may even have several
 *global* sections if so desired. A job is only affected by a *global* section
 residing above it.
 
-The :option:`--cmdhelp` option also lists all options. If used with an `option`
-argument, :option:`--cmdhelp` will detail the given `option`.
+The :option:`--cmdhelp` option also lists all options. If used with a `command`
+argument, :option:`--cmdhelp` will detail the given `command`.
 
 See the `examples/` directory for inspiration on how to write job files.  Note
 the copyright and license requirements currently apply to `examples/` files.
@@ -505,19 +502,19 @@ Parameter types
        prefixes.  To specify power-of-10 decimal values defined in the
        International System of Units (SI):
 
-               * *Ki* -- means kilo (K) or 1000
-               * *Mi* -- means mega (M) or 1000**2
-               * *Gi* -- means giga (G) or 1000**3
-               * *Ti* -- means tera (T) or 1000**4
-               * *Pi* -- means peta (P) or 1000**5
+               * *K* -- means kilo (K) or 1000
+               * *M* -- means mega (M) or 1000**2
+               * *G* -- means giga (G) or 1000**3
+               * *T* -- means tera (T) or 1000**4
+               * *P* -- means peta (P) or 1000**5
 
        To specify power-of-2 binary values defined in IEC 80000-13:
 
-               * *k* -- means kibi (Ki) or 1024
-               * *M* -- means mebi (Mi) or 1024**2
-               * *G* -- means gibi (Gi) or 1024**3
-               * *T* -- means tebi (Ti) or 1024**4
-               * *P* -- means pebi (Pi) or 1024**5
+               * *Ki* -- means kibi (Ki) or 1024
+               * *Mi* -- means mebi (Mi) or 1024**2
+               * *Gi* -- means gibi (Gi) or 1024**3
+               * *Ti* -- means tebi (Ti) or 1024**4
+               * *Pi* -- means pebi (Pi) or 1024**5
 
        With :option:`kb_base`\=1024 (the default), the unit prefixes are opposite
        from those specified in the SI and IEC 80000-13 standards to provide
@@ -576,6 +573,8 @@ Parameter types
 **float_list**
        A list of floating point numbers, separated by a ':' character.
 
+With the above in mind, here follows the complete list of fio job parameters.
+
 
 Units
 ~~~~~
@@ -622,9 +621,6 @@ Units
                Bit based.
 
 
-With the above in mind, here follows the complete list of fio job parameters.
-
-
 Job description
 ~~~~~~~~~~~~~~~
 
@@ -848,7 +844,7 @@ Target file/device
 
                **sequential**
                        Finish one file before moving on to the next. Multiple files can
-                       still be open depending on 'openfiles'.
+                       still be open depending on :option:`openfiles`.
 
                **zipf**
                        Use a *Zipf* distribution to decide what file to access.
@@ -951,7 +947,7 @@ I/O type
 .. option:: direct=bool
 
        If value is true, use non-buffered I/O. This is usually O_DIRECT. Note that
-       ZFS on Solaris doesn't support direct I/O.  On Windows the synchronous
+       OpenBSD and ZFS on Solaris don't support direct I/O.  On Windows the synchronous
        ioengines don't support direct I/O.  Default: false.
 
 .. option:: atomic=bool
@@ -1168,9 +1164,9 @@ I/O type
 
        Make every `N-th` write a barrier write.
 
-.. option:: sync_file_range=str:val
+.. option:: sync_file_range=str:int
 
-       Use :manpage:`sync_file_range(2)` for every `val` number of write
+       Use :manpage:`sync_file_range(2)` for every `int` number of write
        operations. Fio will track range of writes that have happened since the last
        :manpage:`sync_file_range(2)` call. `str` can currently be one or more of:
 
@@ -1240,9 +1236,9 @@ I/O type
                                Zoned random distribution
 
        When using a **zipf** or **pareto** distribution, an input value is also
-       needed to define the access pattern. For **zipf**, this is the `zipf
+       needed to define the access pattern. For **zipf**, this is the `Zipf
        theta`. For **pareto**, it's the `Pareto power`. Fio includes a test
-       program, :command:`genzipf`, that can be used visualize what the given input
+       program, :command:`fio-genzipf`, that can be used visualize what the given input
        values will yield in terms of hit rates.  If you wanted to use **zipf** with
        a `theta` of 1.2, you would use ``random_distribution=zipf:1.2`` as the
        option. If a non-uniform model is used, fio will disable use of the random
@@ -1253,10 +1249,10 @@ I/O type
        access that should fall within what range of the file or device. For
        example, given a criteria of:
 
-       * 60% of accesses should be to the first 10%
-       * 30% of accesses should be to the next 20%
-       * 8% of accesses should be to the next 30%
-       * 2% of accesses should be to the next 40%
+               * 60% of accesses should be to the first 10%
+               * 30% of accesses should be to the next 20%
+               * 8% of accesses should be to the next 30%
+               * 2% of accesses should be to the next 40%
 
        we can define that through zoning of the random accesses. For the above
        example, the user would do::
@@ -1296,21 +1292,20 @@ I/O type
 
 .. option:: random_generator=str
 
-       Fio supports the following engines for generating
-       I/O offsets for random I/O:
+       Fio supports the following engines for generating I/O offsets for random I/O:
 
                **tausworthe**
-                       Strong 2^88 cycle random number generator
+                       Strong 2^88 cycle random number generator.
                **lfsr**
-                       Linear feedback shift register generator
+                       Linear feedback shift register generator.
                **tausworthe64**
-                       Strong 64-bit 2^258 cycle random number generator
+                       Strong 64-bit 2^258 cycle random number generator.
 
        **tausworthe** is a strong random number generator, but it requires tracking
        on the side if we want to ensure that blocks are only read or written
-       once. **LFSR** guarantees that we never generate the same offset twice, and
+       once. **lfsr** guarantees that we never generate the same offset twice, and
        it's also less computationally expensive. It's not a true random generator,
-       however, though for I/O purposes it's typically good enough. **LFSR** only
+       however, though for I/O purposes it's typically good enough. **lfsr** only
        works with single block sizes, not with workloads that use multiple block
        sizes. If used with such a workload, fio may read or write some blocks
        multiple times. The default value is **tausworthe**, unless the required
@@ -1393,7 +1388,7 @@ Block size
        typically won't work with direct I/O, as that normally requires sector
        alignment.
 
-.. option:: bs_is_seq_rand
+.. option:: bs_is_seq_rand=bool
 
        If this option is set, fio will use the normal read,write blocksize settings
        as sequential,random blocksize settings instead. Any random read or write
@@ -1530,6 +1525,7 @@ Buffers and memory
 
                **cudamalloc**
                        Use GPU memory as the buffers for GPUDirect RDMA benchmark.
+                       The :option:`ioengine` must be `rdma`.
 
        The area allocated is a function of the maximum allowed bs size for the job,
        multiplied by the I/O depth given. Note that for **shmhuge** and
@@ -1548,7 +1544,7 @@ Buffers and memory
        should point there. So if it's mounted in :file:`/huge`, you would use
        `mem=mmaphuge:/huge/somefile`.
 
-.. option:: iomem_align=int
+.. option:: iomem_align=int, mem_align=int
 
        This indicates the memory alignment of the I/O memory buffers.  Note that
        the given alignment is applied to the first I/O unit buffer, if using
@@ -1683,8 +1679,8 @@ I/O engine
                        SCSI generic sg v3 I/O. May either be synchronous using the SG_IO
                        ioctl, or if the target is an sg character device we use
                        :manpage:`read(2)` and :manpage:`write(2)` for asynchronous
-                       I/O. Requires filename option to specify either block or character
-                       devices.
+                       I/O. Requires :option:`filename` option to specify either block or
+                       character devices.
 
                **null**
                        Doesn't transfer any data, just pretends to.  This is mainly used to
@@ -1707,8 +1703,8 @@ I/O engine
                        Doesn't transfer any data, but burns CPU cycles according to the
                        :option:`cpuload` and :option:`cpuchunks` options. Setting
                        :option:`cpuload`\=85 will cause that job to do nothing but burn 85%
-                       of the CPU. In case of SMP machines, use :option:`numjobs`
-                       =<no_of_cpu> to get desired CPU usage, as the cpuload only loads a
+                       of the CPU. In case of SMP machines, use :option:`numjobs`=<nr_of_cpu>
+                       to get desired CPU usage, as the cpuload only loads a
                        single CPU at the desired rate. A job never finishes unless there is
                        at least one non-cpuio job.
 
@@ -1741,7 +1737,7 @@ I/O engine
                **ftruncate**
                        I/O engine that sends :manpage:`ftruncate(2)` operations in response
                        to write (DDIR_WRITE) events. Each ftruncate issued sets the file's
-                       size to the current block offset. Block size is ignored.
+                       size to the current block offset. :option:`blocksize` is ignored.
 
                **e4defrag**
                        I/O engine that does regular EXT4_IOC_MOVE_EXT ioctls to simulate
@@ -1763,7 +1759,7 @@ I/O engine
                        defines engine specific options.
 
                **libhdfs**
-                       Read and write through Hadoop (HDFS).  The :file:`filename` option
+                       Read and write through Hadoop (HDFS).  The :option:`filename` option
                        is used to specify host,port of the hdfs name-node to connect.  This
                        engine interprets offsets a little differently.  In HDFS, files once
                        created cannot be modified so random writes are not possible. To
@@ -1802,8 +1798,8 @@ I/O engine specific parameters
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 In addition, there are some parameters which are only valid when a specific
-ioengine is in use. These are used identically to normal parameters, with the
-caveat that when used on the command line, they must come after the
+:option:`ioengine` is in use. These are used identically to normal parameters,
+with the caveat that when used on the command line, they must come after the
 :option:`ioengine` that defines them is selected.
 
 .. option:: userspace_reap : [libaio]
@@ -1821,7 +1817,7 @@ caveat that when used on the command line, they must come after the
 
 .. option:: hipri_percentage : [pvsync2]
 
-       When hipri is set this determines the probability of a pvsync2 IO being high
+       When hipri is set this determines the probability of a pvsync2 I/O being high
        priority. The default is 100%.
 
 .. option:: cpuload=int : [cpuio]
@@ -1837,18 +1833,16 @@ caveat that when used on the command line, they must come after the
 
        Detect when I/O threads are done, then exit.
 
-.. option:: hostname=str : [netsplice] [net]
-
-       The hostname or IP address to use for TCP or UDP based I/O.  If the job is
-       a TCP listener or UDP reader, the hostname is not used and must be omitted
-       unless it is a valid UDP multicast address.
-
 .. option:: namenode=str : [libhdfs]
 
        The hostname or IP address of a HDFS cluster namenode to contact.
 
 .. option:: port=int
 
+   [libhdfs]
+
+               The listening port of the HFDS cluster namenode.
+
    [netsplice], [net]
 
                The TCP or UDP port to bind to or connect to. If this is used with
@@ -1856,9 +1850,11 @@ caveat that when used on the command line, they must come after the
                this will be the starting port number since fio will use a range of
                ports.
 
-   [libhdfs]
+.. option:: hostname=str : [netsplice] [net]
 
-               the listening port of the HFDS cluster namenode.
+       The hostname or IP address to use for TCP or UDP based I/O.  If the job is
+       a TCP listener or UDP reader, the hostname is not used and must be omitted
+       unless it is a valid UDP multicast address.
 
 .. option:: interface=str : [netsplice] [net]
 
@@ -1873,9 +1869,7 @@ caveat that when used on the command line, they must come after the
 
        Set TCP_NODELAY on TCP connections.
 
-.. option:: protocol=str : [netsplice] [net]
-
-.. option:: proto=str : [netsplice] [net]
+.. option:: protocol=str, proto=str : [netsplice] [net]
 
        The network protocol to use. Accepted values are:
 
@@ -1892,7 +1886,7 @@ caveat that when used on the command line, they must come after the
 
        When the protocol is TCP or UDP, the port must also be given, as well as the
        hostname if the job is a TCP listener or UDP reader. For unix sockets, the
-       normal filename option should be used and the port is invalid.
+       normal :option:`filename` option should be used and the port is invalid.
 
 .. option:: listen : [netsplice] [net]
 
@@ -1931,7 +1925,7 @@ caveat that when used on the command line, they must come after the
        **0**
                Default. Preallocate donor's file on init.
        **1**
-               Allocate space immediately inside defragment event,     and free right
+               Allocate space immediately inside defragment event, and free right
                after event.
 
 .. option:: clustername=str : [rbd]
@@ -1963,7 +1957,7 @@ caveat that when used on the command line, they must come after the
 
 .. option:: chunk_size : [libhdfs]
 
-       the size of the chunk to use for each file.
+       The size of the chunk to use for each file.
 
 
 I/O depth
@@ -2030,6 +2024,21 @@ I/O depth
        16 requests, it will let the depth drain down to 4 before starting to fill
        it again.
 
+.. option:: serialize_overlap=bool
+
+       Serialize in-flight I/Os that might otherwise cause or suffer from data races.
+       When two or more I/Os are submitted simultaneously, there is no guarantee that
+       the I/Os will be processed or completed in the submitted order. Further, if
+       two or more of those I/Os are writes, any overlapping region between them can
+       become indeterminate/undefined on certain storage. These issues can cause
+       verification to fail erratically when at least one of the racing I/Os is
+       changing data and the overlapping region has a non-zero size. Setting
+       ``serialize_overlap`` tells fio to avoid provoking this behavior by explicitly
+       serializing in-flight I/Os that have a non-zero overlap. Note that setting
+       this option can reduce both performance and the `:option:iodepth` achieved.
+       Additionally this option does not work when :option:`io_submit_mode` is set to
+       offload. Default: false.
+
 .. option:: io_submit_mode=str
 
        This option controls how fio submits the I/O to the I/O engine. The default
@@ -2063,10 +2072,10 @@ I/O rate
 .. option:: thinktime_blocks=int
 
        Only valid if :option:`thinktime` is set - control how many blocks to issue,
-       before waiting `thinktime` usecs. If not set, defaults to 1 which will make
-       fio wait `thinktime` usecs after every block. This effectively makes any
+       before waiting :option:`thinktime` usecs. If not set, defaults to 1 which will make
+       fio wait :option:`thinktime` usecs after every block. This effectively makes any
        queue depth setting redundant, since no more than 1 I/O will be queued
-       before we have to complete it and do our thinktime. In other words, this
+       before we have to complete it and do our :option:`thinktime`. In other words, this
        setting effectively caps the queue depth if the latter is larger.
 
 .. option:: rate=int[,int][,int]
@@ -2166,7 +2175,7 @@ I/O replay
        replay, the file needs to be turned into a blkparse binary data file first
        (``blkparse <device> -o /dev/null -d file_for_fio.bin``).
 
-.. option:: replay_no_stall=int
+.. option:: replay_no_stall=bool
 
        When replaying I/O with :option:`read_iolog` the default behavior is to
        attempt to respect the timestamps within the log and replay them with the
@@ -2487,7 +2496,7 @@ Verification
 
 .. option:: verifysort_nr=int
 
-   Pre-load and sort verify blocks for a read workload.
+       Pre-load and sort verify blocks for a read workload.
 
 .. option:: verify_offset=int
 
@@ -2571,7 +2580,7 @@ Verification
        state is loaded for the verify read phase. The format of the filename is,
        roughly::
 
-       <type>-<jobname>-<jobindex>-verify.state.
+               <type>-<jobname>-<jobindex>-verify.state.
 
        <type> is "local" for a local run, "sock" for a client/server socket
        connection, and "ip" (192.168.0.1, for instance) for a networked
@@ -2595,7 +2604,7 @@ Verification
 
 .. option:: trim_backlog=int
 
-       Verify that trim/discarded blocks are returned as zeros.
+       Trim after this number of blocks are written.
 
 .. option:: trim_backlog_batch=int
 
@@ -2605,7 +2614,6 @@ Verification
 
        Enable experimental verification.
 
-
 Steady state
 ~~~~~~~~~~~~
 
@@ -2680,7 +2688,7 @@ Measurements and reporting
        all jobs in a file will be part of the same reporting group, unless
        separated by a :option:`stonewall`.
 
-.. option:: stats
+.. option:: stats=bool
 
        By default, fio collects and shows final output results for all jobs
        that run. If this option is set to 0, then fio will ignore it in
@@ -2708,8 +2716,8 @@ Measurements and reporting
                write_lat_log=foo
 
        The actual log names will be :file:`foo_slat.x.log`, :file:`foo_clat.x.log`,
-       and :file:`foo_lat.x.log`, where `x` is the index of the job (1..N, where N
-       is the number of jobs). This helps :command:`fio_generate_plot` find the
+       and :file:`foo_lat.x.log`, where `x` is the index of the job (`1..N`, where `N`
+       is the number of jobs). This helps :command:`fio_generate_plots` find the
        logs automatically. If :option:`per_job_logs` is false, then the filename
        will not include the job index.  See `Log File Formats`_.
 
@@ -2718,7 +2726,7 @@ Measurements and reporting
        Same as :option:`write_lat_log`, but writes I/O completion latency
        histograms. If no filename is given with this option, the default filename
        of :file:`jobname_clat_hist.x.log` is used, where `x` is the index of the
-       job (1..N, where `N` is the number of jobs). Even if the filename is given,
+       job (`1..N`, where `N` is the number of jobs). Even if the filename is given,
        fio will still append the type of log.  If :option:`per_job_logs` is false,
        then the filename will not include the job index. See `Log File Formats`_.
 
@@ -2726,7 +2734,7 @@ Measurements and reporting
 
        Same as :option:`write_bw_log`, but writes IOPS. If no filename is given
        with this option, the default filename of :file:`jobname_type.x.log` is
-       used,where `x` is the index of the job (1..N, where `N` is the number of
+       used, where `x` is the index of the job (`1..N`, where `N` is the number of
        jobs). Even if the filename is given, fio will still append the type of
        log. If :option:`per_job_logs` is false, then the filename will not include
        the job index. See `Log File Formats`_.
@@ -2763,7 +2771,7 @@ Measurements and reporting
        you instead want to log the maximum value, set this option to 1. Defaults to
        0, meaning that averaged values are logged.
 
-.. option:: log_offset=int
+.. option:: log_offset=bool
 
        If this is set, the iolog options will include the byte offset for the I/O
        entry as well as the other data values. Defaults to 0 meaning that
@@ -2841,7 +2849,7 @@ Measurements and reporting
 .. option:: disable_slat=bool
 
        Disable measurements of submission latency numbers. See
-       :option:`disable_slat`.
+       :option:`disable_lat`.
 
 .. option:: disable_bw_measurement=bool, disable_bw=bool
 
@@ -2945,7 +2953,7 @@ other tools.
 To view a profile's additional options use :option:`--cmdhelp` after specifying
 the profile.  For example::
 
-$ fio --profile=act --cmdhelp
+       $ fio --profile=act --cmdhelp
 
 Act profile options
 ~~~~~~~~~~~~~~~~~~~
@@ -2969,7 +2977,7 @@ Act profile options
 .. option:: threads-per-queue=int
        :noindex:
 
-       Number of read IO threads per device.  Default: 8.
+       Number of read I/O threads per device.  Default: 8.
 
 .. option:: read-req-num-512-blocks=int
        :noindex:
@@ -2992,7 +3000,7 @@ Tiobench profile options
 .. option:: size=str
        :noindex:
 
-       Size in MiB
+       Size in MiB.
 
 .. option:: block=int
        :noindex:
@@ -3095,9 +3103,9 @@ are readers and 11--20 are writers.
 The other values are fairly self explanatory -- number of threads currently
 running and doing I/O, the number of currently open files (f=), the estimated
 completion percentage, the rate of I/O since last check (read speed listed first,
-then write speed and optionally trim speed) in terms of bandwidth and IOPS, and time to completion for the current
-running group. It's impossible to estimate runtime of the following groups (if
-any).
+then write speed and optionally trim speed) in terms of bandwidth and IOPS,
+and time to completion for the current running group. It's impossible to estimate
+runtime of the following groups (if any).
 
 ..
        Example output was based on the following:
@@ -3122,9 +3130,9 @@ group) the output looks like::
             | 99.99th=[78119]
           bw (  KiB/s): min=  532, max=  686, per=0.10%, avg=622.87, stdev=24.82, samples=  100
           iops        : min=   76, max=   98, avg=88.98, stdev= 3.54, samples=  100
-           lat (usec) : 250=0.04%, 500=64.11%, 750=4.81%, 1000=2.79%
-           lat (msec) : 2=4.16%, 4=1.84%, 10=4.90%, 20=11.33%, 50=5.37%
-           lat (msec) : 100=0.65%
+         lat (usec)   : 250=0.04%, 500=64.11%, 750=4.81%, 1000=2.79%
+         lat (msec)   : 2=4.16%, 4=1.84%, 10=4.90%, 20=11.33%, 50=5.37%
+         lat (msec)   : 100=0.65%
          cpu          : usr=0.27%, sys=0.18%, ctx=12072, majf=0, minf=21
          IO depths    : 1=85.0%, 2=13.1%, 4=1.8%, 8=0.1%, 16=0.0%, 32=0.0%, >=64=0.0%
             submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
@@ -3163,6 +3171,10 @@ writes in the example above).  In the order listed, they denote:
                complete is basically just CPU time (I/O has already been done, see slat
                explanation).
 
+**lat**
+               Total latency. Same names as slat and clat, this denotes the time from
+               when fio created the I/O unit to completion of the I/O operation.
+
 **bw**
                Bandwidth statistics based on samples. Same names as the xlat stats,
                but also includes the number of samples taken (**samples**) and an
@@ -3174,6 +3186,14 @@ writes in the example above).  In the order listed, they denote:
 **iops**
                IOPS statistics based on samples. Same names as bw.
 
+**lat (nsec/usec/msec)**
+               The distribution of I/O completion latencies. This is the time from when
+               I/O leaves fio and when it gets completed. Unlike the separate
+               read/write/trim sections above, the data here and in the remaining
+               sections apply to all I/Os for the reporting group. 250=0.04% means that
+               0.04% of the I/Os completed in under 250us. 500=64.11% means that 64.11%
+               of the I/Os required 250 to 499us for completion.
+
 **cpu**
                CPU usage. User and system time, along with the number of context
                switches this thread went through, usage of system and user time, and
@@ -3204,12 +3224,10 @@ writes in the example above).  In the order listed, they denote:
                The number of read/write/trim requests issued, and how many of them were
                short or dropped.
 
-**IO latencies**
-               The distribution of I/O completion latencies. This is the time from when
-               I/O leaves fio and when it gets completed.  The numbers follow the same
-               pattern as the I/O depths, meaning that 2=1.6% means that 1.6% of the
-               I/O completed within 2 msecs, 20=12.8% means that 12.8% of the I/O took
-               more than 10 msecs, but less than (or equal to) 20 msecs.
+**IO latency**
+               These values are for `--latency-target` and related options. When
+               these options are engaged, this section describes the I/O depth required
+               to meet the specified latency target.
 
 ..
        Example output was based on the following:
@@ -3237,7 +3255,7 @@ For each data direction it prints:
 **run**
                The smallest and longest runtimes of the threads in this group.
 
-And finally, the disk statistics are printed. They will look like this::
+And finally, the disk statistics are printed. This is Linux specific. They will look like this::
 
   Disk stats (read/write):
     sda: ios=16398/16511, merge=30/162, ticks=6853/819634, in_queue=826487, util=100.00%
@@ -3288,7 +3306,7 @@ field was introduced or whether it's specific to some terse version):
 
     ::
 
-       terse version, fio version [v3], jobname, groupid, error
+        terse version, fio version [v3], jobname, groupid, error
 
     READ status::
 
@@ -3297,8 +3315,8 @@ field was introduced or whether it's specific to some terse version):
         Completion latency: min, max, mean, stdev (usec)
         Completion latency percentiles: 20 fields (see below)
         Total latency: min, max, mean, stdev (usec)
-       Bw (KiB/s): min, max, aggregate percentage of total, mean, stdev, number of samples [v5]
-       IOPS [v5]: min, max, mean, stdev, number of samples
+        Bw (KiB/s): min, max, aggregate percentage of total, mean, stdev, number of samples [v5]
+        IOPS [v5]: min, max, mean, stdev, number of samples
 
     WRITE status:
 
@@ -3309,12 +3327,12 @@ field was introduced or whether it's specific to some terse version):
         Completion latency: min, max, mean, stdev (usec)
         Completion latency percentiles: 20 fields (see below)
         Total latency: min, max, mean, stdev (usec)
-       Bw (KiB/s): min, max, aggregate percentage of total, mean, stdev, number of samples [v5]
-       IOPS [v5]: min, max, mean, stdev, number of samples
+        Bw (KiB/s): min, max, aggregate percentage of total, mean, stdev, number of samples [v5]
+        IOPS [v5]: min, max, mean, stdev, number of samples
 
     TRIM status [all but version 3]:
 
-       Fields are similar to READ/WRITE status.
+        Fields are similar to READ/WRITE status.
 
     CPU usage::
 
@@ -3334,10 +3352,8 @@ field was introduced or whether it's specific to some terse version):
 
     Disk utilization [v3]::
 
-        Disk name, Read ios, write ios,
-        Read merges, write merges,
-        Read ticks, write ticks,
-        Time spent in queue, disk utilization percentage
+        disk name, read ios, write ios, read merges, write merges, read ticks, write ticks,
+        time spent in queue, disk utilization percentage
 
     Additional Info (dependent on continue_on_error, default off)::
 
@@ -3350,17 +3366,17 @@ field was introduced or whether it's specific to some terse version):
 Completion latency percentiles can be a grouping of up to 20 sets, so for the
 terse output fio writes all of them. Each field will look like this::
 
-       1.00%=6112
+        1.00%=6112
 
 which is the Xth percentile, and the `usec` latency associated with it.
 
-For disk utilization, all disks used by fio are shown. So for each disk there
+For `Disk utilization`, all disks used by fio are shown. So for each disk there
 will be a disk utilization section.
 
 Below is a single line containing short names for each of the fields in the
 minimal output v3, separated by semicolons::
 
-       terse_version_3;fio_version;jobname;groupid;error;read_kb;read_bandwidth;read_iops;read_runtime_ms;read_slat_min;read_slat_max;read_slat_mean;read_slat_dev;read_clat_min;read_clat_max;read_clat_mean;read_clat_dev;read_clat_pct01;read_clat_pct02;read_clat_pct03;read_clat_pct04;read_clat_pct05;read_clat_pct06;read_clat_pct07;read_clat_pct08;read_clat_pct09;read_clat_pct10;read_clat_pct11;read_clat_pct12;read_clat_pct13;read_clat_pct14;read_clat_pct15;read_clat_pct16;read_clat_pct17;read_clat_pct18;read_clat_pct19;read_clat_pct20;read_tlat_min;read_lat_max;read_lat_mean;read_lat_dev;read_bw_min;read_bw_max;read_bw_agg_pct;read_bw_mean;read_bw_dev;write_kb;write_bandwidth;write_iops;write_runtime_ms;write_slat_min;write_slat_max;write_slat_mean;write_slat_dev;write_clat_min;write_clat_max;write_clat_mean;write_clat_dev;write_clat_pct01;write_clat_pct02;write_clat_pct03;write_clat_pct04;write_clat_pct05;write_clat_pct06;write_clat_pct07;write_clat_pct08;write_clat_pct09;write_clat_pct10;write_clat_pct11;write_clat_pct12;write_clat_pct13;write_clat_pct14;write_clat_pct15;write_clat_pct16;write_clat_pct17;write_clat_pct18;write_clat_pct19;write_clat_pct20;write_tlat_min;write_lat_max;write_lat_mean;write_lat_dev;write_bw_min;write_bw_max;write_bw_agg_pct;write_bw_mean;write_bw_dev;cpu_user;cpu_sys;cpu_csw;cpu_mjf;cpu_minf;iodepth_1;iodepth_2;iodepth_4;iodepth_8;iodepth_16;iodepth_32;iodepth_64;lat_2us;lat_4us;lat_10us;lat_20us;lat_50us;lat_100us;lat_250us;lat_500us;lat_750us;lat_1000us;lat_2ms;lat_4ms;lat_10ms;lat_20ms;lat_50ms;lat_100ms;lat_250ms;lat_500ms;lat_750ms;lat_1000ms;lat_2000ms;lat_over_2000ms;disk_name;disk_read_iops;disk_write_iops;disk_read_merges;disk_write_merges;disk_read_ticks;write_ticks;disk_queue_time;disk_util
+        terse_version_3;fio_version;jobname;groupid;error;read_kb;read_bandwidth;read_iops;read_runtime_ms;read_slat_min;read_slat_max;read_slat_mean;read_slat_dev;read_clat_min;read_clat_max;read_clat_mean;read_clat_dev;read_clat_pct01;read_clat_pct02;read_clat_pct03;read_clat_pct04;read_clat_pct05;read_clat_pct06;read_clat_pct07;read_clat_pct08;read_clat_pct09;read_clat_pct10;read_clat_pct11;read_clat_pct12;read_clat_pct13;read_clat_pct14;read_clat_pct15;read_clat_pct16;read_clat_pct17;read_clat_pct18;read_clat_pct19;read_clat_pct20;read_tlat_min;read_lat_max;read_lat_mean;read_lat_dev;read_bw_min;read_bw_max;read_bw_agg_pct;read_bw_mean;read_bw_dev;write_kb;write_bandwidth;write_iops;write_runtime_ms;write_slat_min;write_slat_max;write_slat_mean;write_slat_dev;write_clat_min;write_clat_max;write_clat_mean;write_clat_dev;write_clat_pct01;write_clat_pct02;write_clat_pct03;write_clat_pct04;write_clat_pct05;write_clat_pct06;write_clat_pct07;write_clat_pct08;write_clat_pct09;write_clat_pct10;write_clat_pct11;write_clat_pct12;write_clat_pct13;write_clat_pct14;write_clat_pct15;write_clat_pct16;write_clat_pct17;write_clat_pct18;write_clat_pct19;write_clat_pct20;write_tlat_min;write_lat_max;write_lat_mean;write_lat_dev;write_bw_min;write_bw_max;write_bw_agg_pct;write_bw_mean;write_bw_dev;cpu_user;cpu_sys;cpu_csw;cpu_mjf;cpu_minf;iodepth_1;iodepth_2;iodepth_4;iodepth_8;iodepth_16;iodepth_32;iodepth_64;lat_2us;lat_4us;lat_10us;lat_20us;lat_50us;lat_100us;lat_250us;lat_500us;lat_750us;lat_1000us;lat_2ms;lat_4ms;lat_10ms;lat_20ms;lat_50ms;lat_100ms;lat_250ms;lat_500ms;lat_750ms;lat_1000ms;lat_2000ms;lat_over_2000ms;disk_name;disk_read_iops;disk_write_iops;disk_read_merges;disk_write_merges;disk_read_ticks;write_ticks;disk_queue_time;disk_util
 
 
 JSON+ output
@@ -3381,7 +3397,7 @@ Also included with fio is a Python script `fio_jsonplus_clat2csv` that takes
 json+ output and generates CSV-formatted latency data suitable for plotting.
 
 The latency durations actually represent the midpoints of latency intervals.
-For details refer to stat.h.
+For details refer to :file:`stat.h`.
 
 
 Trace file format
@@ -3401,7 +3417,7 @@ Each line represents a single I/O action in the following format::
 
        rw, offset, length
 
-where `rw=0/1` for read/write, and the offset and length entries being in bytes.
+where `rw=0/1` for read/write, and the `offset` and `length` entries being in bytes.
 
 This format is not supported in fio versions >= 1.20-rc3.
 
@@ -3423,15 +3439,15 @@ The file management format::
 
     filename action
 
-The filename is given as an absolute path. The action can be one of these:
+The `filename` is given as an absolute path. The `action` can be one of these:
 
 **add**
-               Add the given filename to the trace.
+               Add the given `filename` to the trace.
 **open**
-               Open the file with the given filename. The filename has to have
+               Open the file with the given `filename`. The `filename` has to have
                been added with the **add** action before.
 **close**
-               Close the file with the given filename. The file has to have been
+               Close the file with the given `filename`. The file has to have been
                opened before.
 
 
@@ -3514,8 +3530,8 @@ will then execute the trigger.
 Verification trigger example
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Let's say we want to run a powercut test on the remote machine 'server'.  Our
-write workload is in :file:`write-test.fio`. We want to cut power to 'server' at
+Let's say we want to run a powercut test on the remote Linux machine 'server'.
+Our write workload is in :file:`write-test.fio`. We want to cut power to 'server' at
 some point during the run, and we'll run this test from the safety or our local
 machine, 'localbox'. On the server, we'll start the fio backend normally::
 
@@ -3565,7 +3581,7 @@ and IOPS. The logs share a common format, which looks like this:
 on the type of log, it will be one of the following:
 
     **Latency log**
-               Value is latency in usecs
+               Value is latency in nsecs
     **Bandwidth log**
                Value is in KiB/sec
     **IOPS log**
@@ -3602,7 +3618,7 @@ Under Test" while being controlled by a client on another machine.
 
 Start the server on the machine which has access to the storage DUT::
 
-       fio --server=args
+       fio --server=args
 
 where `args` defines what fio listens to. The arguments are of the form
 ``type,hostname`` or ``IP,port``. *type* is either ``ip`` (or ip4) for TCP/IP