]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | """ |
2 | Rados benchmarking | |
3 | """ | |
4 | import contextlib | |
5 | import logging | |
6 | ||
7 | from teuthology.orchestra import run | |
8 | from teuthology import misc as teuthology | |
9 | ||
10 | log = logging.getLogger(__name__) | |
11 | ||
12 | @contextlib.contextmanager | |
13 | def task(ctx, config): | |
14 | """ | |
15 | Run radosbench | |
16 | ||
17 | The config should be as follows: | |
18 | ||
19 | radosbench: | |
20 | clients: [client list] | |
21 | time: <seconds to run> | |
22 | pool: <pool to use> | |
23 | size: write size to use | |
224ce89b | 24 | objectsize: object size to use |
7c673cae FG |
25 | unique_pool: use a unique pool, defaults to False |
26 | ec_pool: create an ec pool, defaults to False | |
224ce89b | 27 | create_pool: create pool, defaults to True |
7c673cae FG |
28 | erasure_code_profile: |
29 | name: teuthologyprofile | |
30 | k: 2 | |
31 | m: 1 | |
224ce89b | 32 | crush-failure-domain: osd |
7c673cae | 33 | cleanup: false (defaults to true) |
224ce89b | 34 | type: <write|seq|rand> (defaults to write) |
7c673cae FG |
35 | example: |
36 | ||
37 | tasks: | |
38 | - ceph: | |
39 | - radosbench: | |
40 | clients: [client.0] | |
41 | time: 360 | |
42 | - interactive: | |
43 | """ | |
44 | log.info('Beginning radosbench...') | |
45 | assert isinstance(config, dict), \ | |
46 | "please list clients to run on" | |
47 | radosbench = {} | |
48 | ||
49 | testdir = teuthology.get_testdir(ctx) | |
50 | manager = ctx.managers['ceph'] | |
224ce89b | 51 | runtype = config.get('type', 'write') |
7c673cae FG |
52 | |
53 | create_pool = config.get('create_pool', True) | |
54 | for role in config.get('clients', ['client.0']): | |
55 | assert isinstance(role, basestring) | |
56 | PREFIX = 'client.' | |
57 | assert role.startswith(PREFIX) | |
58 | id_ = role[len(PREFIX):] | |
59 | (remote,) = ctx.cluster.only(role).remotes.iterkeys() | |
60 | ||
61 | if config.get('ec_pool', False): | |
62 | profile = config.get('erasure_code_profile', {}) | |
63 | profile_name = profile.get('name', 'teuthologyprofile') | |
64 | manager.create_erasure_code_profile(profile_name, profile) | |
65 | else: | |
66 | profile_name = None | |
67 | ||
68 | cleanup = [] | |
69 | if not config.get('cleanup', True): | |
70 | cleanup = ['--no-cleanup'] | |
71 | ||
72 | pool = config.get('pool', 'data') | |
73 | if create_pool: | |
74 | if pool != 'data': | |
75 | manager.create_pool(pool, erasure_code_profile_name=profile_name) | |
76 | else: | |
77 | pool = manager.create_pool_with_unique_name(erasure_code_profile_name=profile_name) | |
78 | ||
224ce89b WB |
79 | osize = config.get('objectsize', 0) |
80 | if osize is 0: | |
81 | objectsize = [] | |
82 | else: | |
83 | objectsize = ['-o', str(osize)] | |
84 | size = ['-b', str(config.get('size', 4<<20))] | |
85 | # If doing a reading run then populate data | |
86 | if runtype != "write": | |
87 | proc = remote.run( | |
88 | args=[ | |
89 | "/bin/sh", "-c", | |
90 | " ".join(['adjust-ulimits', | |
91 | 'ceph-coverage', | |
92 | '{tdir}/archive/coverage', | |
93 | 'rados', | |
94 | '--no-log-to-stderr', | |
95 | '--name', role] | |
96 | + size + objectsize + | |
97 | ['-p' , pool, | |
98 | 'bench', str(60), "write", "--no-cleanup" | |
99 | ]).format(tdir=testdir), | |
100 | ], | |
101 | logger=log.getChild('radosbench.{id}'.format(id=id_)), | |
102 | wait=True | |
103 | ) | |
104 | size = [] | |
105 | objectsize = [] | |
106 | ||
7c673cae FG |
107 | proc = remote.run( |
108 | args=[ | |
109 | "/bin/sh", "-c", | |
110 | " ".join(['adjust-ulimits', | |
111 | 'ceph-coverage', | |
112 | '{tdir}/archive/coverage', | |
113 | 'rados', | |
114 | '--no-log-to-stderr', | |
224ce89b WB |
115 | '--name', role] |
116 | + size + objectsize + | |
117 | ['-p' , pool, | |
118 | 'bench', str(config.get('time', 360)), runtype, | |
7c673cae FG |
119 | ] + cleanup).format(tdir=testdir), |
120 | ], | |
121 | logger=log.getChild('radosbench.{id}'.format(id=id_)), | |
122 | stdin=run.PIPE, | |
123 | wait=False | |
124 | ) | |
125 | radosbench[id_] = proc | |
126 | ||
127 | try: | |
128 | yield | |
129 | finally: | |
224ce89b | 130 | timeout = config.get('time', 360) * 30 + 300 |
7c673cae FG |
131 | log.info('joining radosbench (timing out after %ss)', timeout) |
132 | run.wait(radosbench.itervalues(), timeout=timeout) | |
133 | ||
134 | if pool is not 'data' and create_pool: | |
135 | manager.remove_pool(pool) |