e7db/diskmark

By e7db

Updated 11 months ago

A fio-based docker container to benchmark your disks, similar to what CrystalDiskMark does.

Image
Databases & Storage

10K+

docker-diskmark docker-image

A fio-based disk benchmark docker container, similar to what CrystalDiskMark does.

Basic Usage

docker pull e7db/diskmark
docker run -it --rm e7db/diskmark

Docker DiskMark

Profiles

The container contains two different test profiles:

  • Default profile:
    • Sequential 1M Q8T1
    • Sequential 1M Q1T1
    • Random 4K Q32T1
    • Random 4K Q1T1
  • NVMe profile:
    • Sequential 1M Q8T1
    • Sequential 128K Q32T1
    • Random 4K Q32T16
    • Random 4K Q1T1

Advanced usage

Find below a table listing all the different parameters you can use with the container:

ParameterTypeDefaultDescription
PROFILEEnvironmentautoThe profile to apply:
- auto to try and autoselect the best one based on the used drive detection,
- default, best suited for hard disk drives,
- nvme, best suited for NMVe SSD drives.
JOBEnvironmentA custom job to use: details below in the Custom job section.
This parameter overrides the PROFILE parameter.
IOEnvironmentdirectThe drive access mode:
- direct for synchronous I/O,
- buffered for asynchronous I/O.
DATAEnvironmentrandomThe test data:
- random to use random data,
- 0x00 to fill with 0 (zero) values.
SIZEEnvironment1GThe size of the test file in bytes.
WARMUPEnvironment0When set to 1, use a warmup phase, thus preparing the test file with fallocate, using either random data or zero values as set by DATA.
RUNTIMEEnvironment5sThe test duration for each job.
LOOPSEnvironmentThe number of test loops performed on the test file.
This parameter overrides the RUNTIME parameter.
/diskVolumeThe target path to benchmark.

By default, a 1 GB test file is used, with a 5 seconds duration for each test, reading and writing random bytes on the disk where Docker is installed.

With parameters

For example, you can use a 4 GB file, looping each test twice, but after a warmup phase, and writting only zeros instead of random data.
You can achieve this using the following command:

docker run -it --rm -e SIZE=4G -e WARMUP=1 -e LOOPS=2 -e DATA=0x00 e7db/diskmark
Force profile

A detection of your disk is tried, so the benchmark uses the appropriate profile, default or nvme.
In the event that the detection fails, yielding "Unknown", or returns the wrong profile, you can force the use of either of the profiles:

docker run -it --rm -e PROFILE=nvme e7db/diskmark
Custom job

You can run a custom single job using the JOB parameter.
The job expression must follow a specific format, such as follows: RND4KQ32T16.
It is composed of 4 parts:

  • RND or SEQ, for random or sequential access
  • xxK or xxM, where xx is the block size, and K or M is the unit (Kilobytes or Megabytes)
  • Qyy, where yy is the queue depth
  • Tzz, where zz is the number of threads

In the previous example RND4KQ32T16, the job uses random accesses, with a block size of 4K, a queue depth of 32, and 16 threads.

Construct your custom chain, then run the benchmark using the following command:

docker run -it --rm -e JOB=RND4KQ32T16 e7db/diskmark
Specific disk

By default, the benchmark runs on the disk where Docker is installed, using a Docker volume mounted on the /disk path inside the container.
To run the benchmark on a different disk, use a path belonging to that disk, and mount it as the /disk volume:

docker run -it --rm -v /path/to/specific/disk:/disk e7db/diskmark

Docker Pull Command

docker pull e7db/diskmark