--- /dev/null
+import contextlib
+import logging
+import radosbench
+import time
+import copy
+import gevent
+
+log = logging.getLogger(__name__)
+
+@contextlib.contextmanager
+def task(ctx, config):
+ """
+ Run multibench
+
+ The config should be as follows:
+
+ multibench:
+ time: <seconds to run total>
+ segments: <number of concurrent benches>
+ radosbench: <config for radosbench>
+
+ example:
+
+ tasks:
+ - ceph:
+ - multibench:
+ clients: [client.0]
+ time: 360
+ - interactive:
+ """
+ log.info('Beginning multibench...')
+ assert isinstance(config, dict), \
+ "please list clients to run on"
+
+ def run_one(num):
+ start = time.time()
+ benchcontext = copy.copy(config.get('radosbench'))
+ iterations = 0
+ while time.time() - start < int(config.get('time', 600)):
+ log.info("Starting iteration %s of segment %s"%(iterations, num))
+ benchcontext['pool'] = str(num) + "-" + str(iterations)
+ with radosbench.task(ctx, benchcontext):
+ time.sleep()
+ iterations += 1
+ log.info("Starting %s threads"%(str(config.get('segments', 3)),))
+ segments = [
+ gevent.spawn(run_one, i)
+ for i in range(0, int(config.get('segments', 3)))]
+
+ try:
+ yield
+ finally:
+ [i.get() for i in segments]
radosbench:
clients: [client list]
time: <seconds to run>
+ pool: <pool to use>
example:
id_ = role[len(PREFIX):]
(remote,) = ctx.cluster.only(role).remotes.iterkeys()
+ if config.get('pool', 'data') is not "data":
+ proc = remote.run(
+ args=[
+ "/bin/sh", "-c",
+ " ".join(['LD_LIBRARY_PATH=/tmp/cephtest/binary/usr/local/lib',
+ '/tmp/cephtest/enable-coredump',
+ '/tmp/cephtest/binary/usr/local/bin/ceph-coverage',
+ '/tmp/cephtest/archive/coverage',
+ '/tmp/cephtest/binary/usr/local/bin/rados',
+ '-c', '/tmp/cephtest/ceph.conf',
+ '-k', '/tmp/cephtest/data/{role}.keyring'.format(role=role),
+ '--name', role,
+ 'mkpool', str(config.get('pool', 'data'))
+ ]),
+ ],
+ logger=log.getChild('radosbench.{id}'.format(id=id_)),
+ stdin=run.PIPE,
+ wait=False
+ )
+ run.wait([proc])
+
proc = remote.run(
args=[
"/bin/sh", "-c",
'-c', '/tmp/cephtest/ceph.conf',
'-k', '/tmp/cephtest/data/{role}.keyring'.format(role=role),
'--name', role,
- '-p' , 'data',
+ '-p' , str(config.get('pool', 'data')),
'bench', str(config.get('time', 360)), 'write',
]),
],
finally:
log.info('joining radosbench')
run.wait(radosbench.itervalues())
+
+ if config.get('pool', 'data') is not "data":
+ proc = remote.run(
+ args=[
+ "/bin/sh", "-c",
+ " ".join(['LD_LIBRARY_PATH=/tmp/cephtest/binary/usr/local/lib',
+ '/tmp/cephtest/enable-coredump',
+ '/tmp/cephtest/binary/usr/local/bin/ceph-coverage',
+ '/tmp/cephtest/archive/coverage',
+ '/tmp/cephtest/binary/usr/local/bin/rados',
+ '-c', '/tmp/cephtest/ceph.conf',
+ '-k', '/tmp/cephtest/data/{role}.keyring'.format(role=role),
+ '--name', role,
+ 'rmpool', str(config.get('pool', 'data'))
+ ]),
+ ],
+ logger=log.getChild('radosbench.{id}'.format(id=id_)),
+ stdin=run.PIPE,
+ wait=False
+ )
+ run.wait([proc])