#benchmark #disk #operating-systems #file-exists #cli

app simple-disk-benchmark

A simple disk benchmark tool

5 releases

0.1.4 Mar 19, 2024
0.1.3 Aug 2, 2023
0.1.2 Aug 1, 2023
0.1.1 Jul 31, 2023
0.1.0 Jul 31, 2023

#96 in Filesystem

Download history 1/week @ 2024-02-22 1/week @ 2024-02-29 11/week @ 2024-03-07 156/week @ 2024-03-14 25/week @ 2024-03-21 8/week @ 2024-03-28 1/week @ 2024-04-04

70 downloads per month

MIT license

135KB
1.5K SLoC

simple-disk-benchmark

A simple disk benchmark tool.

Alt text

Operating Systems

Currently, macOS and Linux are tested. Windows may work but is not tested. Development is on macOS.

Installation

cargo install simple-disk-benchmark

Usage

A simple disk benchmark tool

Usage: simple-disk-benchmark [OPTIONS] [FILE]

Arguments:
  [FILE]  File to use for benchmarking. If this file exists it will be deleted [default: testfile.dat]

Options:
  -s, --size <FILESIZE>         Size of the file to use for benchmarking [default: 1GB]
  -b, --blocksize <BLOCK_SIZE>  Size of the blocks to read/write [default: 128MB]
  -c, --cycles <CYCLES>         Number of test cycles to run [default: 10]
  -m, --mode <MODE>             Types of test to run: read, write or all [default: all] [possible values: all, read, write]
  -r, --random-seek             Seek to a random position in the file before each read/write
      --no-create               Do not create the test file, the file must already exist
      --no-delete               Do not delete the test file after the test
      --no-progress             Do not display progress bar
      --no-disable-cache        Do not disable the file system cache
      --no-close-file           Do not close the file after each cycle
  -X, --no-chart                Do not display a bar chart of the run timings
  -j, --export-json <FILE>      Export the timing summary statistics and timings of individual runs as JSON to the given FILE. The output time unit is always seconds
      --export-log <FILE>       Export the log to the given FILE
  -d, --dry-run                 Do not actually perform benchmarks to the disk (file is still created and/or deleted)
  -v, --verbose...              Increase logging verbosity
  -q, --quiet...                Decrease logging verbosity
  -h, --help                    Print help
  -V, --version                 Print version

Methodology

Specify the path to a file to use for benchmarking. If the file exists, it will be deleted. You can specify paths on other drives by using the full path to the file (e.g. /Volumes/MyDrive/testfile.dat).

The benchmark tool will create a file of the specified size and then run the specified number of cycles. Each cycle will read or write the multiple blocks of a specified size to the file.

On macOS, the file is opened and F_NO_CACHE and F_GLOBAL_NOCACHE are both set on the file descriptor. This will bypass the file system cache and write directly to the disk. On Linux, the O_DIRECT flag is used to achieve the same result.

TODO

  • Separate file creation from opening for runs.
  • Display volume info in the preamble.
  • Better output - display timing info as well as rates.
  • Multithreaded benchmarking option.
  • Test on Windows.
  • Put on homebrew.
  • More documentation.
  • Run test coverage.
  • Borrow CPU time stuff from hyperfine.
  • Fuzz the StyleSheet code.
  • Random seeks instead of just sequential.
  • Use random bytes instead of zeros for writes
  • Use a better ByteSize replacement.
  • Add a --no-delete option to keep the file around after the benchmark.
  • Output data to JSON.
  • Output data to CSV. Won't do this. Use JSON and pipe to jq or csvkit.
  • Find out what's going on with all the dead_code false positives.
  • Sort out pub/mod stuff.

License

MIT License. See LICENSE file.

Dependencies

~9–20MB
~251K SLoC