diff options
Diffstat (limited to 'internal/cpu/worker.go')
| -rw-r--r-- | internal/cpu/worker.go | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/internal/cpu/worker.go b/internal/cpu/worker.go index 06f6812..b11dc9a 100644 --- a/internal/cpu/worker.go +++ b/internal/cpu/worker.go @@ -12,10 +12,6 @@ func (s *Stresser) worker(ctx context.Context, id int) { defer s.wg.Done() mode := s.config.Mode - if s.config.ChaosEnabled { - mode = s.getRandomMode() - } - intensity := s.randomIntensity() ticker := time.NewTicker(10 * time.Millisecond) @@ -31,13 +27,10 @@ func (s *Stresser) worker(ctx context.Context, id int) { mode = s.current s.mu.Unlock() intensity = s.randomIntensity() + s.sleepWithJitter(1, 50) } s.executeStress(ctx, mode, intensity) - - if s.config.ChaosEnabled { - s.sleepWithJitter(1, 50) - } } } } @@ -53,11 +46,33 @@ func (s *Stresser) chaosController(ctx context.Context) { case <-ticker.C: s.mu.Lock() s.current = s.getRandomMode() + newCPUCount := s.determineCPUCount() + if newCPUCount != s.currentCPUs { + s.adjustWorkers(ctx, newCPUCount) + } s.mu.Unlock() } } } +func (s *Stresser) adjustWorkers(ctx context.Context, newCount int) { + if newCount > s.currentCPUs { + for i := s.currentCPUs; i < newCount; i++ { + s.wg.Add(1) + go s.worker(ctx, i) + } + } else if newCount < s.currentCPUs { + s.cancel() + s.wg.Wait() + ctx, s.cancel = context.WithCancel(context.Background()) + for i := 0; i < newCount; i++ { + s.wg.Add(1) + go s.worker(ctx, i) + } + } + s.currentCPUs = newCount +} + func (s *Stresser) executeStress(ctx context.Context, mode Mode, intensity int) { switch mode { case ModePrime: @@ -80,8 +95,5 @@ func (s *Stresser) executeStress(ctx context.Context, mode Mode, intensity int) s.stressSort(ctx, intensity) case ModeBusy: s.stressBusy(ctx, intensity) - case ModeRandom: - randomMode := allModes[s.rand.Intn(len(allModes))] - s.executeStress(ctx, randomMode, intensity) } } |
