genfio: Splitting gen_template in 2 parts
[fio.git] / HOWTO
diff --git a/HOWTO b/HOWTO
index 8073240ef14074b5007bafa4296b913f1951f647..4fd025126925eb6fd75910608530b8f8c20ba27f 100644 (file)
--- a/HOWTO
+++ b/HOWTO
@@ -9,6 +9,7 @@ Table of contents
 6. Normal output
 7. Terse output
 8. Trace file format
+9. CPU idleness profiling
 
 1.0 Overview and history
 ------------------------
@@ -284,6 +285,32 @@ filename=str       Fio normally makes up a filename based on the job name,
                stdin or stdout. Which of the two depends on the read/write
                direction set.
 
+filename_format=str
+               If sharing multiple files between jobs, it is usually necessary
+               to  have fio generate the exact names that you want. By default,
+               fio will name a file based on the default file format
+               specification of jobname.jobnumber.filenumber. With this
+               option, that can be customized. Fio will recognize and replace
+               the following keywords in this string:
+
+               $jobname
+                       The name of the worker thread or process.
+
+               $jobnum
+                       The incremental number of the worker thread or
+                       process.
+
+               $filenum
+                       The incremental number of the file for that worker
+                       thread or process.
+
+               To have dependent jobs share a set of files, this option can
+               be set to have fio generate filenames that are shared between
+               the two. For instance, if testfiles.$filenum is specified,
+               file number 4 for any job will be named testfiles.4. The
+               default of $jobname.$jobnum.$filenum will be used if
+               no other format specifier is given.
+
 opendir=str    Tell fio to recursively add any file it can find in this
                directory and down the file system tree.
 
@@ -301,11 +328,6 @@ lockfile=str       Fio defaults to not locking any files before it does
                                        same time, but writes get exclusive
                                        access.
 
-               The option may be post-fixed with a lock batch number. If
-               set, then each thread/process may do that amount of IOs to
-               the file before giving up the lock. Since lock acquisition is
-               expensive, batching the lock/unlocks will speed up IO.
-
 readwrite=str
 rw=str         Type of io pattern. Accepted values are:
 
@@ -409,7 +431,7 @@ filesize=int        Individual file sizes. May be a range, in which case fio
 fill_device=bool
 fill_fs=bool   Sets size to something really large and waits for ENOSPC (no
                space left on device) as the terminating condition. Only makes
-                sense with sequential write. For a read workload, the mount
+               sense with sequential write. For a read workload, the mount
                point will be filled first then IO started on the result. This
                option doesn't make sense if operating on a raw device node,
                since the size of that is already known by the file system.
@@ -546,6 +568,8 @@ ioengine=str        Defines how the job issues io to the file. The following
 
                        vsync   Basic readv(2) or writev(2) IO.
 
+                       psyncv  Basic preadv(2) or pwritev(2) IO.
+
                        libaio  Linux native asynchronous io. Note that Linux
                                may only support queued behaviour with
                                non-buffered IO (set direct=1 or buffered=0).
@@ -744,6 +768,17 @@ random_distribution=str:float      By default, fio will use a completely uniform
                random_distribution=zipf:1.2 as the option. If a non-uniform
                model is used, fio will disable use of the random map.
 
+percentage_random=int  For a random workload, set how big a percentage should
+               be random. This defaults to 100%, in which case the workload
+               is fully random. It can be set from anywhere from 0 to 100.
+               Setting it to 0 would make the workload fully sequential. Any
+               setting in between will result in a random mix of sequential
+               and random IO, at the given percentages.
+       
+percentage_sequential=int      See percentage_random. It is guaranteed that
+               they add up to 100. The later setting has priority, each
+               will adjust the other.
+
 norandommap    Normally fio will cover every block of the file when doing
                random IO. If this option is given, fio will just get a
                new random offset without looking at past io history. This
@@ -775,7 +810,7 @@ random_generator=str        Fio supports the following engines for generating
                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.
-               
+
 nice=int       Run the job with the given nice value. See man nice(2).
 
 prio=int       Set the io priority value of this job. Linux limits us to
@@ -795,11 +830,15 @@ thinktime_spin=int
                to sleeping for the rest of the period specified by
                thinktime.
 
-thinktime_blocks
+thinktime_blocks=int
                Only valid if 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.
+               after every block. This effectively makes any queue depth
+               setting redundant, since no more than 1 IO will be queued
+               before we have to complete it and do our thinktime. In
+               other words, this setting effectively caps the queue depth
+               if the latter is larger.
 
 rate=int       Cap the bandwidth used by this job. The number is in bytes/sec,
                the normal suffix rules apply. You can use rate=500k to limit
@@ -1197,7 +1236,7 @@ write_lat_log=str Same as write_bw_log, except that this option stores io
 
                write_lat_log=foo
 
-               The actual log names will be foo_slat.log, foo_slat.log,
+               The actual log names will be foo_slat.log, foo_clat.log,
                and foo_lat.log. This helps fio_generate_plot fine the logs
                automatically.
 
@@ -1219,22 +1258,19 @@ log_avg_msec=int By default, fio will log an entry in the iops, latency,
 lockmem=int    Pin down the specified amount of memory with mlock(2). Can
                potentially be used instead of removing memory or booting
                with less memory to simulate a smaller amount of memory.
+               The amount specified is per worker.
 
 exec_prerun=str        Before running this job, issue the command specified
-               through system(3).
+               through system(3). Output is redirected in a file called
+               jobname.prerun.txt.
 
 exec_postrun=str After the job completes, issue the command specified
-                though system(3).
+                though system(3). Output is redirected in a file called
+                jobname.postrun.txt.
 
 ioscheduler=str        Attempt to switch the device hosting the file to the specified
                io scheduler before running.
 
-cpuload=int    If the job is a CPU cycle eater, attempt to use the specified
-               percentage of CPU cycles.
-
-cpuchunks=int  If the job is a CPU cycle eater, split the load into
-               cycles of the given time. In microseconds.
-
 disk_util=bool Generate disk utilization statistics, if the platform
                supports it. Defaults to on.
 
@@ -1394,6 +1430,11 @@ that defines them is selected.
                enabled when polling for a minimum of 0 events (eg when
                iodepth_batch_complete=0).
 
+[cpu] cpuload=int Attempt to use the specified percentage of CPU cycles.
+
+[cpu] cpuchunks=int Split the load into cycles of the given time. In
+               microseconds.
+
 [netsplice] hostname=str
 [net] hostname=str The host name or IP address to use for TCP or UDP based IO.
                If the job is a TCP listener or UDP reader, the hostname is not
@@ -1402,6 +1443,9 @@ that defines them is selected.
 [netsplice] port=int
 [net] port=int The TCP or UDP port to bind to or connect to.
 
+[netsplice] nodelay=bool
+[net] nodelay=bool     Set TCP_NODELAY on TCP connections.
+
 [netsplice] protocol=str
 [netsplice] proto=str
 [net] protocol=str
@@ -1575,6 +1619,9 @@ util=             The disk utilization. A value of 100% means we kept the disk
 
 It is also possible to get fio to dump the current output while it is
 running, without terminating the job. To do that, send fio the USR1 signal.
+You can also get regularly timed dumps by using the --status-interval
+parameter, or by creating a file in /tmp named fio-dump-status. If fio
+sees this file, it will unlink it and dump the current output status.
 
 
 7.0 Terse output
@@ -1693,3 +1740,18 @@ write      Write 'length' bytes beginning from 'offset'
 sync       fsync() the file
 datasync   fdatasync() the file
 trim       trim the given file from the given 'offset' for 'length' bytes
+
+
+9.0 CPU idleness profiling
+--------------------------
+In some cases, we want to understand CPU overhead in a test. For example,
+we test patches for the specific goodness of whether they reduce CPU usage.
+fio implements a balloon approach to create a thread per CPU that runs at
+idle priority, meaning that it only runs when nobody else needs the cpu.
+By measuring the amount of work completed by the thread, idleness of each
+CPU can be derived accordingly.
+
+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.