Docker-based fio benchmarking - Part One
Why Docker-based fio benchmarking
fio is a flexible I/O tester which generates I/O and measure I/O performance on the target storage system. In the case we want to run the fio workload on the cloud deployments, we can containerize fio. Also we can encapsulate necessary packages in the docker image so that it can be easily deployed to avoid package dependency.
There are ready-to-use fio docker image online if you search with google. In this article, we discuss how to create a docker image which consumes a python script to run fio workload.
Build docker image with Dockerfile
Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image. Using docker build users can create an automated build that executes several command-line instructions in succession.
The following is Dockerfile we are going to use to build the docker image.
$ cat Dockerfile
FROM python:3-alpine
RUN apk add --no-cache \
fio==3.28-r1 \
sudo \
lsblk \
util-linux \
procps
COPY perfbench/perfbench.py /
COPY perfbench/run.sh /
ENTRYPOINT [ "/run.sh" ]
We use Alpine Linux which is a security-oriented, lightweight Linux distribution based on musl libc and busybox. Since we need python support, we leverge the official python:3-alpine image which is based on Alpine Linux.
We install the latest supported fio-3.28 to the docker image. And we install packages like sudo, lsblk, util-linux and procps which are needed by the python script. We copy the python script and wrapper shell script to the root directory. The run.sh script will be run once the container is started in order to run fio benchmark.
The following is the run.sh script.
$ cat perfbench/run.sh
#!/bin/sh
[ -z "$FIO_DATA_DIR" ] && echo "FIO_DATA_DIR variable is required." && exit 1;
[ -z "$FIO_LOG_DIR" ] && echo "FIO_LOG_DIR variable is required." && exit 1;
[ ! -d "$FIO_DATA_DIR" ] && echo "The data directory $FIO_DATA_DIR does not exist." && exit 1;
[ ! -d "$FIO_LOG_DIR" ] && echo "The result directory $FIO_LOG_DIR does not exit." && exit 1;
echo "Running fio benchmark on directory $FIO_DATA_DIR"
python perfbench.py --dir $FIO_DATA_DIR --logdir $FIO_LOG_DIR
Now, we can build the docker image with the Dockerfile.
$ docker build -t perfbench .
Sending build context to Docker daemon 19.46kB
Step 1/5 : FROM python:3-alpine
Step 2/5 : RUN apk add --no-cache fio==3.28-r1 sudo lsblk util-linux procps
Step 3/5 : COPY perfbench/perfbench.py /
Step 4/5 : COPY perfbench/run.sh /
Step 5/5 : ENTRYPOINT /run.sh
Successfully built 9c0957911607
Successfully tagged perfbench:latest
$ docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
perfbench latest f63e13d57991 32 minutes ago 60MB
python 3-alpine c7100ae3ac4d 2 weeks ago 48.7MB
Run fio benchmark with docker
Use the following command to run fio benchmark. Note that we have defined the fio benchmark logic in the customized python script consumed by the container.
$ docker run --rm --privileged -v /data:/data -e FIO_DATA_DIR=/data -e FIO_LOG_DIR=/data/result perfbench
Note that the option “–privileged” is to allow the python script in the container to drop cache in this case. The same purpose can also be approached with the following method. Then we can do “echo 3 > drop_caches” in the container to drop cache.
$ docker run --rm -v /proc/sys/vm/drop_caches:/drop_caches -v /data:/data -e FIO_DATA_DIR=/data -e FIO_RESULT_DIR=/data/result perfbench
Reference
- https://docs.docker.com/engine/reference/builder/
- https://alpinelinux.org/
- https://hub.docker.com/_/alpine
- https://pkgs.alpinelinux.org/packages
- https://docs.docker.com/engine/reference/commandline/run/
- https://hub.docker.com/_/python
- https://stackoverflow.com/questions/51875802/docker-containers-drop-cache-without-root-other-options