Structure of results

Structure of results

Single host

The single-host case is described in some detail at: http://pbench.example.com/#sec-12-1.

Here is what a fio run looks like (with most of the files and lower-level subdirs elided):

.
|-- fio__2014-11-12_13:17:24
|   |-- 1-read-4KiB
|   |   |-- fio.cmd
|   |   |-- fio.job
|   |   |-- result.txt
|   |   |-- sysinfo
|   |   |   |   ....
|   |   |   |-- lstopo.txt
|   |   |   |-- sosreport-a.foo.example.com-pbench-20141112131825.tar.xz
|   |   |   `-- sosreport-a.foo.example.com-pbench-20141112131825.tar.xz.md5
|   |   `-- tools-default
|   |       |-- cmds
|   |       |   |-- iostat.cmd
|   |       |   |-- pbench-iostat-postprocess.cmd
|   |       |   |-- pbench-iostat-postprocess-output.txt
|   |       |   |-- pbench-iostat-start.cmd
|   |       |   |-- pbench-iostat-stop.cmd
|   |       |   |-- ... similar entries for the other tools
|   |       |   `-- sar.cmd
|   |       |-- iostat
|   |       |   |-- device_mapper-average.txt
|   |       |   |-- device_mapper.html
|   |       |   |-- device_mapper.js
|   |       |   |-- disk-average.txt
|   |       |   |-- disk.html
|   |       |   `-- disk.js
|   |       |-- iostat.txt
|   |       |-- ... similar entries for the other tools
|   |       `-- sar.txt
|   |-- 2-read-64KiB
|   |   |-- fio.cmd
|   |   |-- fio.job
|   |   |-- result.txt
|   |   |-- sysinfo
|   |   |   |-- ...
|   |   |   |-- lstopo.txt
|   |   |   |-- sosreport-a.foo.example.com-pbench-20141112131938.tar.xz
|   |   |   `-- sosreport-a.foo.example.com-pbench-20141112131938.tar.xz.md5
|   |   `-- tools-default
|   |       |-- cmds
|   |       |   |-- iostat.cmd
|   |       |   |-- pbench-iostat-postprocess.cmd
|   |       |   |-- pbench-iostat-postprocess-output.txt
|   |       |   |-- pbench-iostat-start.cmd
|   |       |   |-- pbench-iostat-stop.cmd
|   |       |   |-- ...
|   |       |   `-- sar.cmd
|   |       |-- iostat
|   |       |   |-- device_mapper-average.txt
|   |       |   |-- device_mapper.html
|   |       |   |-- device_mapper.js
|   |       |   |-- disk-average.txt
|   |       |   |-- disk.html
|   |       |   `-- disk.js
|   |       |-- iostat.txt
|   |       |-- ...
|   |-- 3-read-1024KiB
|   |   |-- ...
|   |-- 4-randread-4KiB
|   |   |-- ...
|   |-- 5-randread-64KiB
|   |   |-- ...
|   |-- 6-randread-1024KiB
|   |   |-- ...
|   `-- fio-summary.txt
|-- pbench.log
|-- tmp
`-- tools.default

140 directories, 1011 files

There are 6 “iterations” and each iteration corresponds to a subdirectory of the main directory fio__<timestamp>. Each iteration contains a few files (fio.cmd, result.txt, etc.) and two subdirs: one for sysinfo (including the collected sosreport) and one for the tools collection data (tools-$group). The latter contains a cmds subdirectory with files describing the various commands used to start, stop each tool, postprocess its output, as well as the actual command to run the tool (e.g. iostat.cmd), a file containing the raw output from the tool (e.g. iostat.txt) and a subdirectory (e.g. iostat) where the data reductions and turning the data into a d3-compatible JSON format and producing an HTML page happen. The set of data reductions is tool dependent, but the suffixes are fixes (.txt, .js and .html).

Multiple hosts

One registers tools on each remote by hand. Assuming that you are sitting on the host that acts as the orchestrator for the benchmark run (where one might or might not run tools - in the following I’m assuming that tools are run on the orchestrator, but skipping the local register-tool-set would only run tools on the remotes), then one might proceed as follows:

register-tool-set
for remote in $remotes ;do
    register-tool-set --remote $remote
done

for iter in $iterations ;do
   ts=$(date +....)
   dir=/var/lib/pbench/...

   start-tools --dir=$dir

   <run the benchmark>

   stop-tools --dir= $dir
   postprocess-tools --dir=$dir
done

where the run directory may be more than a single level below /var/lib/pbench and may have various components specified through –config, the “iteration” name (which may also be thought of as the name of the experiment - that makes more sense in some cases), a timestamp and anything else that one might think of to disambiguate this experiment from the next one.

The results structure on the orchestrator and on each remote is exactly the same as in the single host case. But in this case, postprocess-tools pulls the remote data and creates subdirs for each remote under the sysinfo branch of the local hosts tree and also under the tools-$group branch. That way, each remote’s results are spread over various subdirs of the local host and the local host is treated specially. It might make more sense to have a structure like this instead (exp1 == iter1 etc. if you prefer to think of them as iterations of a single experiment, rather than as separate experiments):

benchmark__TS/
|-- benchmark.txt
|-- exp1
|   |-- exp1.txt
|   |-- host1
|   |   |-- bench.cmd
|   |   |-- bench.job
|   |   |-- result.txt
|   |   |-- sysinfo
|   |   `-- tools-default
|   |-- host2
|   `-- host3
|-- exp2
|   |-- exp2.txt
|   |-- host1
|   |   |-- bench.cmd
|   |   |-- bench.job
|   |   |-- result.txt
|   |   |-- sysinfo
|   |   `-- tools-default
|   |-- host2
|   `-- host3
`-- exp3
    |-- exp3.txt
    |-- host1
    |   |-- bench.cmd
    |   |-- bench.job
    |   |-- result.txt
    |   |-- sysinfo
    |   `-- tools-default
    |-- host2
    `-- host3

18 directories, 13 files

where the hosts are treated symmetrically. Any benchmark data that are gathered on each host (remote or local) are under the subdirectory for that host. Benchmark data that are “global” in some sense are under the “expN” subdirectory, and there might be a summary describing the set of experiments in the top-level directory.

I think this structure accommodates Archit’s and Peter’s concerns and is fairly easy to implement: it only requires simple changes to postprocess-tools. A thornier problem is the already existing base of results, but it could be fixed up once and for all with a bit of scripting (although that remains to be proved).

The question is whether it imposes artificial limits that are going to get in our way later, but I cannot think of any (although that may be a lack of imagination on my part).