mirror of
https://github.com/ceph/ceph
synced 2025-02-20 09:27:35 +00:00
Merge pull request #30591 from xiexingguo/wip-balancer-throttler
mgr/balancer: upmap_max_iterations -> upmap_max_optimizations; behave as it is per pool Reviewed-by: Sage Weil <sage@redhat.com>
This commit is contained in:
commit
f28f35f79b
@ -177,3 +177,6 @@
|
|||||||
number of PGs. To change this behavior, or to learn more about PG
|
number of PGs. To change this behavior, or to learn more about PG
|
||||||
autoscaling, see :ref:`pg-autoscaler`. Note that existing pools in
|
autoscaling, see :ref:`pg-autoscaler`. Note that existing pools in
|
||||||
upgraded clusters will still be set to ``warn`` by default.
|
upgraded clusters will still be set to ``warn`` by default.
|
||||||
|
|
||||||
|
* The ``upmap_max_iterations`` config option of mgr/balancer has been
|
||||||
|
renamed to ``upmap_max_optimizations`` to better match its behaviour.
|
||||||
|
@ -294,10 +294,10 @@ class Module(MgrModule):
|
|||||||
'runtime': True,
|
'runtime': True,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'name': 'upmap_max_iterations',
|
'name': 'upmap_max_optimizations',
|
||||||
'type': 'uint',
|
'type': 'uint',
|
||||||
'default': 10,
|
'default': 10,
|
||||||
'desc': 'maximum upmap optimization iterations',
|
'desc': 'maximum upmap optimizations to make per attempt',
|
||||||
'runtime': True,
|
'runtime': True,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -901,11 +901,10 @@ class Module(MgrModule):
|
|||||||
detail = 'Unrecognized mode %s' % plan.mode
|
detail = 'Unrecognized mode %s' % plan.mode
|
||||||
self.log.info(detail)
|
self.log.info(detail)
|
||||||
return -errno.EINVAL, detail
|
return -errno.EINVAL, detail
|
||||||
##
|
|
||||||
|
|
||||||
def do_upmap(self, plan):
|
def do_upmap(self, plan):
|
||||||
self.log.info('do_upmap')
|
self.log.info('do_upmap')
|
||||||
max_iterations = self.get_module_option('upmap_max_iterations')
|
max_optimizations = self.get_module_option('upmap_max_optimizations')
|
||||||
max_deviation = self.get_module_option('upmap_max_deviation')
|
max_deviation = self.get_module_option('upmap_max_deviation')
|
||||||
|
|
||||||
ms = plan.initial
|
ms = plan.initial
|
||||||
@ -920,7 +919,7 @@ class Module(MgrModule):
|
|||||||
|
|
||||||
inc = plan.inc
|
inc = plan.inc
|
||||||
total_did = 0
|
total_did = 0
|
||||||
left = max_iterations
|
left = max_optimizations
|
||||||
osdmap_dump = self.get_osdmap().dump()
|
osdmap_dump = self.get_osdmap().dump()
|
||||||
pools_with_pg_merge = [p['pool_name'] for p in osdmap_dump.get('pools', [])
|
pools_with_pg_merge = [p['pool_name'] for p in osdmap_dump.get('pools', [])
|
||||||
if p['pg_num'] > p['pg_num_target']]
|
if p['pg_num'] > p['pg_num_target']]
|
||||||
@ -941,12 +940,29 @@ class Module(MgrModule):
|
|||||||
# shuffle so all pools get equal (in)attention
|
# shuffle so all pools get equal (in)attention
|
||||||
random.shuffle(classified_pools)
|
random.shuffle(classified_pools)
|
||||||
for it in classified_pools:
|
for it in classified_pools:
|
||||||
did = ms.osdmap.calc_pg_upmaps(inc, max_deviation, left, it)
|
pool_dump = osdmap_dump.get('pools', [])
|
||||||
|
num_pg = 0
|
||||||
|
for p in pool_dump:
|
||||||
|
if p['pool_name'] in it:
|
||||||
|
num_pg += p['pg_num']
|
||||||
|
|
||||||
|
# note that here we deliberately exclude any scrubbing pgs too
|
||||||
|
# since scrubbing activities have significant impacts on performance
|
||||||
|
pool_ids = list(p['pool'] for p in pool_dump if p['pool_name'] in it)
|
||||||
|
num_pg_active_clean = 0
|
||||||
|
pg_dump = self.get('pg_dump')
|
||||||
|
for p in pg_dump['pg_stats']:
|
||||||
|
pg_pool = p['pgid'].split('.')[0]
|
||||||
|
if len(pool_ids) and int(pg_pool) not in pool_ids:
|
||||||
|
continue
|
||||||
|
if p['state'] == 'active+clean':
|
||||||
|
num_pg_active_clean += 1
|
||||||
|
|
||||||
|
available = max_optimizations - (num_pg - num_pg_active_clean)
|
||||||
|
did = ms.osdmap.calc_pg_upmaps(inc, max_deviation, available, it)
|
||||||
|
self.log.info('prepared %d changes for pool(s) %s' % (did, it))
|
||||||
total_did += did
|
total_did += did
|
||||||
left -= did
|
self.log.info('prepared %d changes in total' % total_did)
|
||||||
if left <= 0:
|
|
||||||
break
|
|
||||||
self.log.info('prepared %d/%d changes' % (total_did, max_iterations))
|
|
||||||
if total_did == 0:
|
if total_did == 0:
|
||||||
return -errno.EALREADY, 'Unable to find further optimization, ' \
|
return -errno.EALREADY, 'Unable to find further optimization, ' \
|
||||||
'or pool(s)\' pg_num is decreasing, ' \
|
'or pool(s)\' pg_num is decreasing, ' \
|
||||||
|
Loading…
Reference in New Issue
Block a user