Cette semaine, je vous présente docker-iops, une solution idéale pour réaliser des benchmarks rapides sur les performances en IOPS d’une baie de stockage et tester son fonctionnement de manière simple et efficace.
J’ai découvert cette petite perle en cherchant une solution facile à installer et à désinstaller, donc testable sur une multitude d’environnements I/O différents. Et franchement, ça fait carrément le taff, comme on dit ! Un excellent complément à iPerf (toujours aussi excellent) pour les tests de charge réseau.
Quelques exemples concrets récupérés au boulot lors de tests sur une nouvelle baie TLC de chez HPE (une Alletra P10k) :
- Le premier test « latency » permet de test les latences moyennes avec ioping
- Le second « rand-rw-iops » vous permet de tester la baie avec blocks de 4K en lecture et écriture (80/20
- Enfin, le dernier test est un exemple de test de lecture séquentielle (en mode bourrin donc ^^) sur 4 jobs simultanés (4 process)
Voici les 3 commandes que j’ai utilisé …
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
docker run --rm -v /datas/bench/iops:/iops/data tooldockers/iops \ ioping -c 20 /iops/data docker run --rm -v /datas:/iops/data tooldockers/iops \ --randrepeat=1 \ --ioengine=libaio \ --direct=1 \ --gtod_reduce=1 \ --name=seq-read \ --filename=seq-read \ --bs=128k \ --iodepth=256 \ --size=100m \ --readwrite=read \ --runtime=600 \ --time_based \ --numjobs=8 \ --group_reporting docker run --rm -v /datas:/iops/data tooldockers/iops \ --randrepeat=1 \ --ioengine=libaio \ --direct=1 \ --gtod_reduce=1 \ --name=test \ --filename=testfile \ --bs=4k \ --iodepth=64 \ --size=4G \ --readwrite=randrw \ --rwmixread=75 |
et le résultat ensuite…
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
root@expgraf-slt01:/datas/bench# ./latency.sh 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=1 time=253.9 us (warmup) 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=2 time=371.3 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=3 time=336.4 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=4 time=378.1 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=5 time=334.9 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=6 time=285.5 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=7 time=266.6 us (fast) 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=8 time=313.0 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=9 time=332.2 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=10 time=366.9 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=11 time=426.0 us (slow) 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=12 time=272.5 us (fast) 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=13 time=245.8 us (fast) 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=14 time=272.6 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=15 time=270.3 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=16 time=265.3 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=17 time=332.1 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=18 time=288.6 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=19 time=324.7 us 4 KiB <<< /iops/data (ext4 /dev/sdb1): request=20 time=482.8 us (slow) --- /iops/data (ext4 /dev/sdb1) ioping statistics --- 19 requests completed in 6.17 ms, 76 KiB read, 3.08 k iops, 12.0 MiB/s generated 20 requests in 19.0 s, 80 KiB, 1 iops, 4.21 KiB/s min/avg/max/mdev = 245.8 us / 324.5 us / 482.8 us / 59.4 us root@expgraf-slt01:/datas/bench# ./rand-rw-iops.sh test: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64 fio-3.16 Starting 1 process test: Laying out IO file (1 file / 4096MiB) test: (groupid=0, jobs=1): err= 0: pid=13: Fri Mar 27 14:09:19 2026 read: IOPS=63.0k, BW=250MiB/s (262MB/s)(3070MiB/12281msec) bw ( KiB/s): min=169160, max=275624, per=99.96%, avg=255884.96, stdev=27577.10, samples=24 iops : min=42290, max=68906, avg=63971.21, stdev=6894.26, samples=24 write: IOPS=21.4k, BW=83.5MiB/s (87.6MB/s)(1026MiB/12281msec); 0 zone resets bw ( KiB/s): min=56976, max=91880, per=99.98%, avg=85529.46, stdev=9407.86, samples=24 iops : min=14244, max=22970, avg=21382.33, stdev=2351.95, samples=24 cpu : usr=6.62%, sys=45.34%, ctx=112377, majf=0, minf=8 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0% issued rwts: total=785920,262656,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=64 Run status group 0 (all jobs): READ: bw=250MiB/s (262MB/s), 250MiB/s-250MiB/s (262MB/s-262MB/s), io=3070MiB (3219MB), run=12281-12281msec WRITE: bw=83.5MiB/s (87.6MB/s), 83.5MiB/s-83.5MiB/s (87.6MB/s-87.6MB/s), io=1026MiB (1076MB), run=12281-12281msec root@expgraf-slt01:/datas/bench# ./seq-read-iops.sh seq-read: (g=0): rw=read, bs=(R) 128KiB-128KiB, (W) 128KiB-128KiB, (T) 128KiB-128KiB, ioengine=libaio, iodepth=256 ... fio-3.16 Starting 4 processes seq-read: Laying out IO file (1 file / 100MiB) seq-read: (groupid=0, jobs=4): err= 0: pid=14: Fri Mar 27 14:11:40 2026 read: IOPS=29.4k, BW=3674MiB/s (3853MB/s)(431GiB/120017msec) bw ( MiB/s): min= 2394, max= 4957, per=99.97%, avg=3672.94, stdev=195.53, samples=960 iops : min=19158, max=39660, avg=29383.39, stdev=1564.19, samples=960 cpu : usr=0.73%, sys=7.54%, ctx=569459, majf=0, minf=32795 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwts: total=3527736,0,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=256 Run status group 0 (all jobs): READ: bw=3674MiB/s (3853MB/s), 3674MiB/s-3674MiB/s (3853MB/s-3853MB/s), io=431GiB (462GB), run=120017-120017msec |
Il y a plein d’arguments au déclenchement du conteneur. Je vous laisse découvrir ça 😉
Bonne semaine !
