@@ -185,10 +185,8 @@ impl WorkloadGroupResourceManagerInner {
185
185
( None , None ) => {
186
186
return Ok ( workload_resource) ;
187
187
}
188
- ( None , Some ( QuotaValue :: Bytes ( v) ) ) => {
189
- workload_resource
190
- . max_memory_usage
191
- . store ( * v, Ordering :: Relaxed ) ;
188
+ ( None , Some ( QuotaValue :: Bytes ( _v) ) ) => {
189
+ self . update_mem_usage ( & online_workload_group) ;
192
190
return Ok ( workload_resource) ;
193
191
}
194
192
( None , Some ( QuotaValue :: Percentage ( v) ) ) => {
@@ -218,10 +216,8 @@ impl WorkloadGroupResourceManagerInner {
218
216
self . percent_normalizer . update ( * v) ;
219
217
self . update_mem_usage ( & online_workload_group) ;
220
218
}
221
- ( Some ( QuotaValue :: Bytes ( _old) ) , Some ( QuotaValue :: Bytes ( new) ) ) => {
222
- workload_resource
223
- . max_memory_usage
224
- . store ( * new, Ordering :: Relaxed ) ;
219
+ ( Some ( QuotaValue :: Bytes ( _old) ) , Some ( QuotaValue :: Bytes ( _new) ) ) => {
220
+ self . update_mem_usage ( & online_workload_group) ;
225
221
return Ok ( workload_resource) ;
226
222
}
227
223
_ => { }
@@ -239,16 +235,29 @@ impl WorkloadGroupResourceManagerInner {
239
235
{
240
236
if let Some ( v) = self . percent_normalizer . get_normalized ( * v) {
241
237
let limit = self . global_mem_stat . get_limit ( ) ;
238
+ let usage_ratio = workload_group. meta . get_max_memory_usage_ratio ( ) ;
242
239
if limit > 0 {
243
- workload_group
244
- . max_memory_usage
245
- . store ( limit as usize / 100 * v, Ordering :: Relaxed ) ;
240
+ workload_group. max_memory_usage . store (
241
+ limit as usize / 100 * usage_ratio / 100 * v,
242
+ Ordering :: Relaxed ,
243
+ ) ;
246
244
}
247
245
}
248
246
} else if let Some ( QuotaValue :: Bytes ( v) ) =
249
247
workload_group. meta . quotas . get ( MEMORY_QUOTA_KEY )
250
248
{
251
- workload_group. max_memory_usage . store ( * v, Ordering :: Relaxed ) ;
249
+ let limit = self . global_mem_stat . get_limit ( ) ;
250
+ let usage_ratio = workload_group. meta . get_max_memory_usage_ratio ( ) ;
251
+
252
+ let mut memory_usage = * v;
253
+ if limit > 0 {
254
+ let max_memory_usage = limit as usize / 100 * usage_ratio;
255
+ memory_usage = std:: cmp:: min ( max_memory_usage, memory_usage) ;
256
+ }
257
+
258
+ workload_group
259
+ . max_memory_usage
260
+ . store ( memory_usage, Ordering :: Relaxed ) ;
252
261
} else {
253
262
workload_group. max_memory_usage . store ( 0 , Ordering :: Relaxed )
254
263
}
@@ -386,7 +395,7 @@ mod tests {
386
395
// Check memory usage was calculated (100% since it's the only workload)
387
396
assert_eq ! (
388
397
workload1. max_memory_usage. load( Ordering :: Relaxed ) ,
389
- ( LIMIT / 100 * 100 ) as usize
398
+ ( LIMIT / 100 * 25 / 100 * 100 ) as usize
390
399
) ;
391
400
}
392
401
@@ -423,11 +432,11 @@ mod tests {
423
432
// Check memory allocations are calculated correctly
424
433
assert_eq ! (
425
434
resource1. max_memory_usage. load( Ordering :: Relaxed ) ,
426
- ( LIMIT / 100 * 30 ) as usize
435
+ ( LIMIT / 100 * 25 / 100 * 30 ) as usize
427
436
) ; // 30% of total 100
428
437
assert_eq ! (
429
438
resource2. max_memory_usage. load( Ordering :: Relaxed ) ,
430
- ( LIMIT / 100 * 70 ) as usize
439
+ ( LIMIT / 100 * 25 / 100 * 70 ) as usize
431
440
) ; // 70% of total 100
432
441
433
442
// Drop first workload
@@ -438,7 +447,7 @@ mod tests {
438
447
assert_eq ! ( inner. percent_normalizer. sum. load( Ordering :: Relaxed ) , 70 ) ;
439
448
assert_eq ! (
440
449
resource2. max_memory_usage. load( Ordering :: Relaxed ) ,
441
- ( LIMIT / 100 * 100 ) as usize
450
+ ( LIMIT / 100 * 25 / 100 * 100 ) as usize
442
451
) ; // Now 100% of remaining 70
443
452
444
453
Ok ( ( ) )
@@ -464,11 +473,11 @@ mod tests {
464
473
465
474
assert_eq ! (
466
475
resource1. max_memory_usage. load( Ordering :: Relaxed ) ,
467
- ( LIMIT / 100 * 50 ) as usize
476
+ ( LIMIT / 100 * 25 / 100 * 50 ) as usize
468
477
) ;
469
478
assert_eq ! (
470
479
resource2. max_memory_usage. load( Ordering :: Relaxed ) ,
471
- ( LIMIT / 100 * 50 ) as usize
480
+ ( LIMIT / 100 * 25 / 100 * 50 ) as usize
472
481
) ;
473
482
474
483
workload_mgr
@@ -493,15 +502,15 @@ mod tests {
493
502
// Memory usage should be recalculated
494
503
assert_eq ! (
495
504
resource1. max_memory_usage. load( Ordering :: Relaxed ) ,
496
- ( LIMIT / 100 * ( 70 * 100 / ( 70 + 50 ) ) ) as usize
505
+ ( LIMIT / 100 * 25 / 100 * ( 70 * 100 / ( 70 + 50 ) ) ) as usize
497
506
) ;
498
507
assert_eq ! (
499
508
resource2. max_memory_usage. load( Ordering :: Relaxed ) ,
500
- ( LIMIT / 100 * ( 50 * 100 / ( 70 + 50 ) ) ) as usize
509
+ ( LIMIT / 100 * 25 / 100 * ( 50 * 100 / ( 70 + 50 ) ) ) as usize
501
510
) ;
502
511
assert_eq ! (
503
512
updated_resource. max_memory_usage. load( Ordering :: Relaxed ) ,
504
- ( LIMIT / 100 * ( 70 * 100 / ( 70 + 50 ) ) ) as usize
513
+ ( LIMIT / 100 * 25 / 100 * ( 70 * 100 / ( 70 + 50 ) ) ) as usize
505
514
) ;
506
515
507
516
Ok ( ( ) )
0 commit comments