Update size/io_size descriptions
[fio.git] / HOWTO
diff --git a/HOWTO b/HOWTO
index aaa46f801bd22d5ba113dc8726bafaf41d13858c..8da5527a3edb6cbfd408f497260651d99c633be0 100644 (file)
--- a/HOWTO
+++ b/HOWTO
@@ -253,7 +253,20 @@ machine.
 
 This section describes in details each parameter associated with a job.
 Some parameters take an option of a given type, such as an integer or
-a string. The following types are used:
+a string. Anywhere a numeric value is required, an arithmetic expression
+may be used, provided it is surrounded by parentheses. Supported operators
+are:
+
+       addition (+)
+       subtraction (-)
+       multiplication (*)
+       division (/)
+       modulus (%)
+       exponentiation (^)
+
+For time values in expressions, units are microseconds by default. This is
+different than for time values not in expressions (not enclosed in
+parentheses). The following types are used:
 
 str    String. This is a sequence of alpha characters.
 time   Integer with possible time suffix. In seconds unless otherwise
@@ -379,7 +392,7 @@ rw=str              Type of io pattern. Accepted values are:
                For certain types of io the result may still be skewed a bit,
                since the speed may be different. It is possible to specify
                a number of IO's to do before getting a new offset, this is
-               one by appending a ':<nr>' to the end of the string given.
+               done by appending a ':<nr>' to the end of the string given.
                For a random read, it would look like 'rw=randread:8' for
                passing in an offset modifier with a value of 8. If the
                suffix is used with a sequential IO pattern, then the value
@@ -426,12 +439,6 @@ randseed=int       Seed the random number generators based on this seed value, to
                If not set, the random sequence depends on the randrepeat
                setting.
 
-use_os_rand=bool Fio can either use the random generator supplied by the OS
-               to generator random offsets, or it can use it's own internal
-               generator (based on Tausworthe). Default is to use the
-               internal generator, which is often of better quality and
-               faster.
-
 fallocate=str  Whether pre-allocation is performed when laying down files.
                Accepted values are:
 
@@ -455,23 +462,26 @@ fadvise_hint=bool By default, fio will use fadvise() to advise the kernel
 
 size=int       The total size of file io for this job. Fio will run until
                this many bytes has been transferred, unless runtime is
-               limited by other options (such as 'runtime', for instance).
-               Unless specific nrfiles and filesize options are given,
-               fio will divide this size between the available files
-               specified by the job. If not set, fio will use the full
-               size of the given files or devices. If the files do not
-               exist, size must be given. It is also possible to give
-               size as a percentage between 1 and 100. If size=20% is
-               given, fio will use 20% of the full size of the given
-               files or devices.
-
+               limited by other options (such as 'runtime', for instance,
+               or increased/decreased by 'io_size'). Unless specific nrfiles
+               and filesize options are given, fio will divide this size
+               between the available files specified by the job. If not set,
+               fio will use the full size of the given files or devices.
+               If the files do not exist, size must be given. It is also
+               possible to give size as a percentage between 1 and 100. If
+               size=20% is given, fio will use 20% of the full size of the
+               given files or devices.
+
+io_size=int
 io_limit=int   Normally fio operates within the region set by 'size', which
                means that the 'size' option sets both the region and size of
                IO to be performed. Sometimes that is not what you want. With
                this option, it is possible to define just the amount of IO
                that fio should do. For instance, if 'size' is set to 20G and
-               'io_limit' is set to 5G, fio will perform IO within the first
-               20G but exit when 5G have been done.
+               'io_size' is set to 5G, fio will perform IO within the first
+               20G but exit when 5G have been done. The opposite is also
+               possible - if 'size' is set to 20G, and 'io_size' is set to
+               40G, then fio will do 40G of IO within the 0..20G region.
 
 filesize=int   Individual file sizes. May be a range, in which case fio
                will select sizes for files at random within the given range
@@ -554,7 +564,7 @@ bssplit=str Sometimes you want even finer grained control of the
                while having 90% 4k writes and 10% 8k writes, you would
                specify:
 
-               bssplit=2k/50:4k/50,4k/90,8k/10
+               bssplit=2k/50:4k/50,4k/90:8k/10
 
 blocksize_unaligned
 bs_unaligned   If this option is given, any byte size value within bsrange
@@ -587,9 +597,12 @@ scramble_buffers=bool      If refill_buffers is too costly and the target is
 buffer_compress_percentage=int If this is set, then fio will attempt to
                provide IO buffer content (on WRITEs) that compress to
                the specified level. Fio does this by providing a mix of
-               random data and zeroes. Note that this is per block size
-               unit, for file/disk wide compression level that matches
-               this setting, you'll also want to set refill_buffers.
+               random data and a fixed pattern. The fixed pattern is either
+               zeroes, or the pattern specified by buffer_pattern. If the
+               pattern option is used, it might skew the compression ratio
+               slightly. Note that this is per block size unit, for file/disk
+               wide compression level that matches this setting, you'll also
+               want to set refill_buffers.
 
 buffer_compress_chunk=int      See buffer_compress_percentage. This
                setting allows fio to manage how big the ranges of random
@@ -823,7 +836,9 @@ number_ios=int      Fio will normally perform IOs until it has exhausted the size
                time (or hits an error condition). With this setting, the
                range/size can be set independently of the number of IOs to
                perform. When fio reaches this number, it will exit normally
-               and report status.
+               and report status. Note that this does not extend the amount
+               of IO that will be done, it will only stop fio if this
+               condition is met before other end-of-job criteria.
 
 fsync=int      If writing to a file, issue a sync of the dirty data
                for every number of blocks given. For example, if you give
@@ -1307,6 +1322,21 @@ verify_backlog_batch=int Control how many blocks fio will verify
                if verify_backlog_batch is larger than verify_backlog, some
                blocks will be verified more than once.
 
+verify_state_save=bool When a job exits during the write phase of a verify
+               workload, save its current state. This allows fio to replay
+               up until that point, if the verify state is loaded for the
+               verify read phase. The format of the filename is, roughly,
+               <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
+               client/server connection.
+
+verify_state_load=bool If a verify termination trigger was used, fio stores
+               the current write state of each thread. This can be used at
+               verification time so that fio knows how far it should verify.
+               Without this information, fio will run a full verification
+               pass, according to the settings in the job file used.
+
 stonewall
 wait_for_previous Wait for preceding jobs in the job file to exit, before
                starting this one. Can be used to insert serialization
@@ -1625,7 +1655,9 @@ that defines them is selected.
                address.
 
 [netsplice] port=int
-[net] port=int The TCP or UDP port to bind to or connect to.
+[net] port=int The TCP or UDP port to bind to or connect to. If this is used
+with numjobs to spawn multiple instances of the same job type, then this will
+be the starting port number since fio will use a range of ports.
 
 [netsplice] interface=str
 [net] interface=str  The IP address of the network interface used to send or
@@ -1657,6 +1689,7 @@ that defines them is selected.
 [net] listen   For TCP network connections, tell fio to listen for incoming
                connections rather than initiating an outgoing connection. The
                hostname must be omitted if this option is used.
+
 [net] pingpong Normaly a network writer will just continue writing data, and
                a network reader will just consume packages. If pingpong=1
                is set, a writer will send its normal payload to the reader,
@@ -1669,6 +1702,10 @@ that defines them is selected.
                single reader when multiple readers are listening to the same
                address.
 
+[net] window_size      Set the desired socket buffer size for the connection.
+
+[net] mss      Set the TCP maximum segment size (TCP_MAXSEG).
+
 [e4defrag] donorname=str
                File will be used as a block donor(swap extents between files)
 [e4defrag] inplace=int
@@ -1962,3 +1999,81 @@ An unit work is defined as touching a full page of unsigned characters. Mean
 and standard deviation of time to complete an unit work is reported in "unit
 work" section. Options can be chosen to report detailed percpu idleness or
 overall system idleness by aggregating percpu stats.
+
+
+10.0 Verification and triggers
+------------------------------
+Fio is usually run in one of two ways, when data verification is done. The
+first is a normal write job of some sort with verify enabled. When the
+write phase has completed, fio switches to reads and verifies everything
+it wrote. The second model is running just the write phase, and then later
+on running the same job (but with reads instead of writes) to repeat the
+same IO patterns and verify the contents. Both of these methods depend
+on the write phase being completed, as fio otherwise has no idea how much
+data was written.
+
+With verification triggers, fio supports dumping the current write state
+to local files. Then a subsequent read verify workload can load this state
+and know exactly where to stop. This is useful for testing cases where
+power is cut to a server in a managed fashion, for instance.
+
+A verification trigger consists of two things:
+
+1) Storing the write state of each job
+2) Executing a trigger command
+
+The write state is relatively small, on the order of hundreds of bytes
+to single kilobytes. It contains information on the number of completions
+done, the last X completions, etc.
+
+A trigger is invoked either through creation ('touch') of a specified
+file in the system, or through a timeout setting. If fio is run with
+--trigger-file=/tmp/trigger-file, then it will continually check for
+the existence of /tmp/trigger-file. When it sees this file, it will
+fire off the trigger (thus saving state, and executing the trigger
+command).
+
+For client/server runs, there's both a local and remote trigger. If
+fio is running as a server backend, it will send the job states back
+to the client for safe storage, then execute the remote trigger, if
+specified. If a local trigger is specified, the server will still send
+back the write state, but the client will then execute the trigger.
+
+10.1 Verification trigger example
+---------------------------------
+Lets say we want to run a powercut test on the remote machine 'server'.
+Our write workload is in 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:
+
+server# fio --server
+
+and on the client, we'll fire off the workload:
+
+localbox$ fio --client=server --trigger-file=/tmp/my-trigger --trigger-remote="bash -c \"echo b > /proc/sysrq-triger\""
+
+We set /tmp/my-trigger as the trigger file, and we tell fio to execute
+
+echo b > /proc/sysrq-trigger
+
+on the server once it has received the trigger and sent us the write
+state. This will work, but it's not _really_ cutting power to the server,
+it's merely abruptly rebooting it. If we have a remote way of cutting
+power to the server through IPMI or similar, we could do that through
+a local trigger command instead. Lets assume we have a script that does
+IPMI reboot of a given hostname, ipmi-reboot. On localbox, we could
+then have run fio with a local trigger instead:
+
+localbox$ fio --client=server --trigger-file=/tmp/my-trigger --trigger="ipmi-reboot server"
+
+For this case, fio would wait for the server to send us the write state,
+then execute 'ipmi-reboot server' when that happened.
+
+10.1 Loading verify state
+-------------------------
+To load store write state, read verification job file must contain
+the verify_state_load option. If that is set, fio will load the previously
+stored state. For a local fio run this is done by loading the files directly,
+and on a client/server run, the server backend will ask the client to send
+the files over and load them from there.