Docker容器的IO基准

【编者的话】本文主要介绍Docker容器IO基准的创建与测试。

本周我需要一个快速而且简单的IO基准工具,因此决定创建一个Docker 容器来实现我的目标。Docker 容器它本身是比较简单的,在你闲暇的时候就可以使用。Docker 容器基于Ubuntu的最新版本,安装FIO包,并从我的网站抓取一个简单的测试文件来生成负载和基准测试结果。

Dockerfile

1 # FIO benchmark on Ubuntu:latest
2 
3 FROM ubuntu:latest
4 MAINTAINER Chris Mutchler <chris@virtualelephant.com>
5 
6 RUN apt-get update
7 RUN apt-get -y install fio wget
8 RUN wget http://virtualelephant.com/wp-content/uploads/2015/10/threads.txt
9 
10 CMD [ "/bin/bash" ]

一旦Docker镜像上传到我的repo, 我就会创建一个简单的JSON文件来部置容器到我的Mesos集群。

iobench.json

{
"container": {
"type": "DOCKER",
"docker": {
  "image": "chrismutchler/iobench"
}    
},
"id": "iobench",
"instances": 1,
"cpus": 0.25,
"mem": 256,
"uris": [],
"cmd": "while true; do date; /usr/bin/fio /threads.txt; sleep 10; done"
}  

如上所示,Docker容器将继续无限地运行FIO测试,直到这个应用程序在这次马拉松式的测试中被杀死。该应用程序也可以扩展到跨多个apache Mesos节点上运行,它们各自独立运行FIO测试。运行任何类型的负载或者在您的环境中做基准测试时要小心,它可能有不利影响。

通过命令行在Marathon启动应用程序是很简单的。

# curl -A POST http://mesos.local.domain:8080/v2/apps -d @iobench.json -H "Content-Type: application/json"

我曾用这个测试在我的环境中创建一个嘈杂的邻居的问题去测试VMware Storage IO Control (SIOC)的设置,它非常适合这个角色的工作。一旦应用程序已经被启动,它的结果可以下载或者在Mesos 用户界面查看,通过选择’沙盒’,然后就会有STDOUT (标准输出)日志文件。为了理解FIO对于IO 基准做了些什么,请阅读Ben Martin的博客,FIO测试文件来是从那里拷贝的。

stdout

--container="mesos-20151009-234723-2583865536-5050-2901-S1.c0052620-2322-4d12-aa49-1e3b24402f50" --docker="docker" --help="false" --initialize_driver_logging="true" --logbufsecs="0" --logging_level="INFO" --mapped_directory="/mnt/mesos/sandbox" --quiet="false" --sandbox_directory="/tmp/mesos/slaves/20151009-234723-2583865536-5050-2901-S1/frameworks/20151009-234723-2583865536-5050-2901-0001/executors/iobench.cb93c618-6eea-11e5-9209-0050569a4da8/runs/c0052620-2322-4d12-aa49-1e3b24402f50" --stop_timeout="0ns"
--container="mesos-20151009-234723-2583865536-5050-2901-S1.c0052620-2322-4d12-aa49-1e3b24402f50" --docker="docker" --help="false" --initialize_driver_logging="true" --logbufsecs="0" --logging_level="INFO" --mapped_directory="/mnt/mesos/sandbox" --quiet="false" --sandbox_directory="/tmp/mesos/slaves/20151009-234723-2583865536-5050-2901-S1/frameworks/20151009-234723-2583865536-5050-2901-0001/executors/iobench.cb93c618-6eea-11e5-9209-0050569a4da8/runs/c0052620-2322-4d12-aa49-1e3b24402f50" --stop_timeout="0ns"
Registered docker executor on dhcp2-157.local.domain
Starting task iobench.cb93c618-6eea-11e5-9209-0050569a4da8
Sat Oct 10 01:04:40 UTC 2015
bgwriter: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=32
queryA: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=mmap, iodepth=1
queryB: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=mmap, iodepth=1
bgupdater: (g=0): rw=randrw, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=16
fio-2.1.3
Starting 4 processes
bgwriter: Laying out IO file(s) (1 file(s) / 256MB)
queryA: Laying out IO file(s) (1 file(s) / 256MB)
queryB: Laying out IO file(s) (1 file(s) / 256MB)
bgupdater: Laying out IO file(s) (1 file(s) / 32MB)

bgwriter: (groupid=0, jobs=1): err= 0: pid=8: Sat Oct 10 01:05:32 2015
write: io=262144KB, bw=11578KB/s, iops=2894, runt= 22641msec
slat (usec): min=16, max=4713.1K, avg=334.93, stdev=20011.69
clat (usec): min=9, max=4750.2K, avg=10711.15, stdev=112034.10
 lat (usec): min=75, max=4750.6K, avg=11048.59, stdev=113823.09
clat percentiles (msec):
 |  1.00th=[    3],  5.00th=[    3], 10.00th=[    3], 20.00th=[    6],
 | 30.00th=[    6], 40.00th=[    7], 50.00th=[    7], 60.00th=[    7],
 | 70.00th=[    8], 80.00th=[    8], 90.00th=[    9], 95.00th=[    9],
 | 99.00th=[   16], 99.50th=[   31], 99.90th=[  947], 99.95th=[ 1582],
 | 99.99th=[ 4752]
bw (KB  /s): min=    5, max=39208, per=100.00%, avg=15073.13, stdev=7536.85
lat (usec) : 10=0.01%, 100=0.01%, 250=0.01%, 500=0.01%, 750=0.01%
lat (usec) : 1000=0.01%
lat (msec) : 2=0.05%, 4=12.47%, 10=85.23%, 20=1.46%, 50=0.34%
lat (msec) : 250=0.05%, 500=0.19%, 750=0.05%, 1000=0.05%, 2000=0.05%
lat (msec) : >=2000=0.05%
cpu          : usr=2.60%, sys=8.83%, ctx=126969, majf=0, minf=26
IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.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.1%, 64=0.0%, >=64=0.0%
 issued    : total=r=0/w=65536/d=0, short=r=0/w=0/d=0
queryA: (groupid=0, jobs=1): err= 0: pid=9: Sat Oct 10 01:05:32 2015
read : io=262144KB, bw=12106KB/s, iops=3026, runt= 21654msec
clat (usec): min=26, max=4713.2K, avg=322.55, stdev=20018.65
 lat (usec): min=26, max=4713.2K, avg=322.77, stdev=20018.66
clat percentiles (usec):
 |  1.00th=[   31],  5.00th=[   71], 10.00th=[   77], 20.00th=[  115],
 | 30.00th=[  126], 40.00th=[  155], 50.00th=[  159], 60.00th=[  165],
 | 70.00th=[  183], 80.00th=[  207], 90.00th=[  253], 95.00th=[  314],
 | 99.00th=[  724], 99.50th=[ 1012], 99.90th=[ 2576], 99.95th=[ 4384],
 | 99.99th=[272384]
bw (KB  /s): min=    7, max=24840, per=67.92%, avg=16686.43, stdev=7338.70
lat (usec) : 50=4.04%, 100=11.27%, 250=74.04%, 500=8.29%, 750=1.42%
lat (usec) : 1000=0.45%
lat (msec) : 2=0.36%, 4=0.09%, 10=0.03%, 20=0.01%, 50=0.01%
lat (msec) : 100=0.01%, 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%
lat (msec) : 2000=0.01%, >=2000=0.01%
cpu          : usr=2.93%, sys=7.36%, ctx=131487, majf=65536, minf=31
IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.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.0%
 issued    : total=r=65536/w=0/d=0, short=r=0/w=0/d=0
queryB: (groupid=0, jobs=1): err= 0: pid=10: Sat Oct 10 01:05:32 2015
read : io=262144KB, bw=11910KB/s, iops=2977, runt= 22010msec
clat (usec): min=27, max=4714.3K, avg=325.85, stdev=20020.01
 lat (usec): min=27, max=4714.3K, avg=326.11, stdev=20020.01
clat percentiles (usec):
 |  1.00th=[   32],  5.00th=[   72], 10.00th=[   82], 20.00th=[  117],
 | 30.00th=[  139], 40.00th=[  155], 50.00th=[  159], 60.00th=[  169],
 | 70.00th=[  187], 80.00th=[  213], 90.00th=[  262], 95.00th=[  318],
 | 99.00th=[  700], 99.50th=[  980], 99.90th=[ 2608], 99.95th=[ 4768],
 | 99.99th=[272384]
bw (KB  /s): min=    2, max=23384, per=65.75%, avg=16152.90, stdev=6882.55
lat (usec) : 50=2.90%, 100=9.19%, 250=76.15%, 500=9.50%, 750=1.34%
lat (usec) : 1000=0.43%
lat (msec) : 2=0.32%, 4=0.09%, 10=0.03%, 20=0.01%, 50=0.01%
lat (msec) : 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%, 2000=0.01%
lat (msec) : >=2000=0.01%
cpu          : usr=3.81%, sys=6.74%, ctx=131493, majf=65536, minf=30
IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.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.0%
 issued    : total=r=65536/w=0/d=0, short=r=0/w=0/d=0
bgupdater: (groupid=0, jobs=1): err= 0: pid=11: Sat Oct 10 01:05:32 2015
read : io=16416KB, bw=3611.1KB/s, iops=902, runt=  4545msec
slat (usec): min=81, max=285023, avg=520.41, stdev=5536.65
clat (usec): min=1, max=2841, avg= 5.40, stdev=80.88
 lat (usec): min=115, max=285031, avg=528.39, stdev=5537.20
clat percentiles (usec):
 |  1.00th=[    2],  5.00th=[    2], 10.00th=[    2], 20.00th=[    2],
 | 30.00th=[    2], 40.00th=[    2], 50.00th=[    2], 60.00th=[    2],
 | 70.00th=[    2], 80.00th=[    3], 90.00th=[    3], 95.00th=[    3],
 | 99.00th=[    3], 99.50th=[    6], 99.90th=[ 1448], 99.95th=[ 2384],
 | 99.99th=[ 2832]
bw (KB  /s): min= 2096, max= 4472, per=14.60%, avg=3587.00, stdev=1065.00
write: io=16352KB, bw=3597.9KB/s, iops=899, runt=  4545msec
slat (usec): min=74, max=254089, avg=489.47, stdev=3971.19
clat (usec): min=1, max=2233, avg= 5.13, stdev=66.52
 lat (usec): min=77, max=254096, avg=497.09, stdev=3971.57
clat percentiles (usec):
 |  1.00th=[    2],  5.00th=[    2], 10.00th=[    2], 20.00th=[    2],
 | 30.00th=[    2], 40.00th=[    2], 50.00th=[    2], 60.00th=[    2],
 | 70.00th=[    2], 80.00th=[    3], 90.00th=[    3], 95.00th=[    3],
 | 99.00th=[    3], 99.50th=[    5], 99.90th=[ 1256], 99.95th=[ 1816],
 | 99.99th=[ 2224]
bw (KB  /s): min= 2024, max= 4504, per=28.58%, avg=3514.88, stdev=1085.81
lat (usec) : 2=0.04%, 4=99.26%, 10=0.24%, 50=0.18%, 100=0.04%
lat (usec) : 250=0.06%, 500=0.02%, 750=0.01%, 1000=0.01%
lat (msec) : 2=0.07%, 4=0.06%
cpu          : usr=8.30%, sys=4.71%, ctx=16460, majf=0, minf=25
IO depths    : 1=99.8%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.0%, >=64=0.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.0%
 issued    : total=r=4104/w=4088/d=0, short=r=0/w=0/d=0

Run status group 0 (all jobs):
READ: io=540704KB, aggrb=24566KB/s, minb=3611KB/s, maxb=12106KB/s, mint=4545msec, maxt=22010msec
WRITE: io=278496KB, aggrb=12300KB/s, minb=3597KB/s, maxb=11578KB/s, mint=4545msec, maxt=22641msec

Disk stats (read/write):
dm-2: ios=135188/67188, merge=0/0, ticks=39356/28285, in_queue=67640, util=97.96%, aggrios=135217/70245, aggrmerge=0/0, aggrticks=1492/4673, aggrin_queue=6169, aggrutil=15.06%
dm-0: ios=135217/70245, merge=0/0, ticks=1492/4673, in_queue=6169, util=15.06%, aggrios=0/0, aggrmerge=0/0, aggrticks=0/0, aggrin_queue=0, aggrutil=0.00%
loop1: ios=0/0, merge=0/0, ticks=0/0, in_queue=0, util=0.00%
loop0: ios=0/0, merge=0/0, ticks=0/0, in_queue=0, util=0.00% 

如果你想抓取Docker镜像,并且用它满足你个人的需求,你可以从Docker Hub上拉取下来:

# docker pull chrismutchler/iobench

我接下来即将编译的小Docker 容器的其中之一是一个网页流量生成器--过去,我已经用过所有种类的流量测试应用程序,但是在Docker容器内部能够运行一个测试,并且通过Mesos 集成器扩展它将会简化事情,甚至更多!
分享!

原文链接:Docker Container for IO Benchmarking(翻译:黄雅静)

docker

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: