6 #ifndef swcdb_manager_RangersResources_h
7 #define swcdb_manager_RangersResources_h
11 namespace SWC {
namespace Manager {
18 uint32_t a_mem = 0, uint32_t a_cpu = 0,
size_t a_ranges = 0)
40 void print(std::ostream& out)
const {
43 <<
" mem=" <<
mem <<
"MB cpu=" <<
cpu <<
"Mhz ranges=" <<
ranges
44 <<
" rgrid=" <<
rgrid <<
')';
58 Env::Config::settings()->get<Config::Property::Value_int32_g>(
59 "swc.mngr.rangers.resource.interval.check")),
61 Env::Config::settings()->get<Config::Property::Value_uint8_g>(
62 "swc.mngr.rangers.range.rebalance.max")),
74 out <<
"RangersResources(rangers=";
76 out <<
size() <<
" [";
78 r.print(out <<
"\n ");
91 for(
auto& rgr : rangers) {
114 if(!res.mem || !res.cpu) {
126 size_t max_ranges = 1;
127 uint16_t max_scale = 1;
129 size_t total_ranges = 0;
130 uint16_t max_load_scale = 0;
135 for(
auto& res : *
this) {
136 if(res.mem > max_mem)
138 if(res.cpu > max_cpu)
140 if(res.ranges > max_ranges)
141 max_ranges = res.ranges;
142 total_ranges += res.ranges;
145 for(
auto& res : *
this) {
146 size_t ranges_scale = (res.ranges * 100) / max_ranges;
147 size_t load_scale = (
148 ( (res.mem * 100 * INT16_MAX) / max_mem +
149 (res.cpu * 100 * INT16_MAX) / max_cpu )
150 ) / (ranges_scale ? ranges_scale : 1);
151 res.load_scale = load_scale > UINT16_MAX
152 ? UINT16_MAX : (load_scale ? load_scale : 1);
153 if(res.load_scale > max_scale)
154 max_scale = res.load_scale;
156 for(
auto& res : *
this) {
157 res.load_scale = (size_t(res.load_scale) * UINT16_MAX) / max_scale;
158 if(max_load_scale < res.load_scale)
159 max_load_scale = res.load_scale;
167 if(total_ranges >
size() * 4 && (max_load_scale >>= 1)) {
168 for(
auto& res : *
this) {
169 if(res.ranges && res.load_scale < max_load_scale) {
170 uint16_t chk = max_load_scale / res.load_scale;
171 uint8_t balance = chk > balanceable ? balanceable : chk;
173 balanceable -= balance;
174 res.rebalance = balance;
190 for(
auto& res : *
this) {
191 for(
auto& rgr : rangers) {
192 if(rgr->rgrid != res.rgrid)
195 uint8_t balance = res.rebalance;
197 rgr->rebalance(balance);
198 }
else if((balance = rgr->rebalance())) {
202 if(balance || rgr->load_scale != res.load_scale) {
203 rgr->load_scale.store(res.load_scale);
206 rgr->interm_ranges.store(0);
223 #endif // swcdb_manager_RangersResources_h