Skip to content

Commit 7e160a5

Browse files
committed
perf: switch default worker choice strategy to LEAST_USED
Signed-off-by: Jérôme Benoit <[email protected]>
1 parent 29da88c commit 7e160a5

File tree

8 files changed

+35
-43
lines changed

8 files changed

+35
-43
lines changed

docs/api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ An object with these properties:
156156
`WorkerChoiceStrategies.INTERLEAVED_WEIGHTED_ROUND_ROBIN` and
157157
`WorkerChoiceStrategies.FAIR_SHARE` strategies are targeted to heavy and long
158158
tasks.\
159-
Default: `WorkerChoiceStrategies.ROUND_ROBIN`
159+
Default: `WorkerChoiceStrategies.LEAST_USED`
160160

161161
- `workerChoiceStrategyOptions` (optional) - The worker choice strategy options
162162
object to use in this pool.\

src/pools/abstract-pool.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ export abstract class AbstractPool<
241241
this.opts.startWorkers = opts.startWorkers ?? true
242242
checkValidWorkerChoiceStrategy(opts.workerChoiceStrategy)
243243
this.opts.workerChoiceStrategy = opts.workerChoiceStrategy ??
244-
WorkerChoiceStrategies.ROUND_ROBIN
244+
WorkerChoiceStrategies.LEAST_USED
245245
this.checkValidWorkerChoiceStrategyOptions(
246246
opts.workerChoiceStrategyOptions,
247247
)

src/pools/pool.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ export interface PoolOptions {
197197
/**
198198
* The default worker choice strategy to use in this pool.
199199
*
200-
* @defaultValue WorkerChoiceStrategies.ROUND_ROBIN
200+
* @defaultValue WorkerChoiceStrategies.LEAST_USED
201201
*/
202202
workerChoiceStrategy?: WorkerChoiceStrategy
203203
/**

src/pools/selection-strategies/worker-choice-strategies-context.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,13 @@ export class WorkerChoiceStrategiesContext<
6262
*
6363
* @param pool - The pool instance.
6464
* @param workerChoiceStrategies - The worker choice strategies.
65-
* @defaultValue [WorkerChoiceStrategies.ROUND_ROBIN]
65+
* @defaultValue [WorkerChoiceStrategies.LEAST_USED]
6666
* @param opts - The worker choice strategy options.
6767
*/
6868
public constructor(
6969
private readonly pool: IPool<Worker, Data, Response>,
7070
workerChoiceStrategies: WorkerChoiceStrategy[] = [
71-
WorkerChoiceStrategies.ROUND_ROBIN,
71+
WorkerChoiceStrategies.LEAST_USED,
7272
],
7373
opts?: WorkerChoiceStrategyOptions,
7474
) {

tests/pools/abstract-pool.test.mjs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ describe({
220220
enableEvents: true,
221221
restartWorkerOnError: true,
222222
enableTasksQueue: false,
223-
workerChoiceStrategy: WorkerChoiceStrategies.ROUND_ROBIN,
223+
workerChoiceStrategy: WorkerChoiceStrategies.LEAST_USED,
224224
})
225225
for (
226226
const [, workerChoiceStrategy] of pool.workerChoiceStrategiesContext
@@ -769,7 +769,7 @@ describe({
769769
worker: WorkerTypes.web,
770770
started: true,
771771
ready: true,
772-
defaultStrategy: WorkerChoiceStrategies.ROUND_ROBIN,
772+
defaultStrategy: WorkerChoiceStrategies.LEAST_USED,
773773
strategyRetries: 0,
774774
minSize: numberOfWorkers,
775775
maxSize: numberOfWorkers,
@@ -792,7 +792,7 @@ describe({
792792
worker: WorkerTypes.web,
793793
started: true,
794794
ready: true,
795-
defaultStrategy: WorkerChoiceStrategies.ROUND_ROBIN,
795+
defaultStrategy: WorkerChoiceStrategies.LEAST_USED,
796796
strategyRetries: 0,
797797
minSize: Math.floor(numberOfWorkers / 2),
798798
maxSize: numberOfWorkers,
@@ -1155,7 +1155,7 @@ describe({
11551155
worker: WorkerTypes.web,
11561156
started: true,
11571157
ready: true,
1158-
defaultStrategy: WorkerChoiceStrategies.ROUND_ROBIN,
1158+
defaultStrategy: WorkerChoiceStrategies.LEAST_USED,
11591159
strategyRetries: expect.any(Number),
11601160
minSize: Math.floor(numberOfWorkers / 2),
11611161
maxSize: numberOfWorkers,
@@ -1199,7 +1199,7 @@ describe({
11991199
worker: WorkerTypes.web,
12001200
started: true,
12011201
ready: true,
1202-
defaultStrategy: WorkerChoiceStrategies.ROUND_ROBIN,
1202+
defaultStrategy: WorkerChoiceStrategies.LEAST_USED,
12031203
strategyRetries: expect.any(Number),
12041204
minSize: numberOfWorkers,
12051205
maxSize: numberOfWorkers,
@@ -1217,7 +1217,7 @@ describe({
12171217
worker: WorkerTypes.web,
12181218
started: true,
12191219
ready: true,
1220-
defaultStrategy: WorkerChoiceStrategies.ROUND_ROBIN,
1220+
defaultStrategy: WorkerChoiceStrategies.LEAST_USED,
12211221
strategyRetries: expect.any(Number),
12221222
minSize: numberOfWorkers,
12231223
maxSize: numberOfWorkers,
@@ -1262,7 +1262,7 @@ describe({
12621262
worker: WorkerTypes.web,
12631263
started: true,
12641264
ready: true,
1265-
defaultStrategy: WorkerChoiceStrategies.ROUND_ROBIN,
1265+
defaultStrategy: WorkerChoiceStrategies.LEAST_USED,
12661266
strategyRetries: expect.any(Number),
12671267
minSize: Math.floor(numberOfWorkers / 2),
12681268
maxSize: numberOfWorkers,
@@ -1282,7 +1282,7 @@ describe({
12821282
worker: WorkerTypes.web,
12831283
started: true,
12841284
ready: true,
1285-
defaultStrategy: WorkerChoiceStrategies.ROUND_ROBIN,
1285+
defaultStrategy: WorkerChoiceStrategies.LEAST_USED,
12861286
strategyRetries: expect.any(Number),
12871287
minSize: Math.floor(numberOfWorkers / 2),
12881288
maxSize: numberOfWorkers,
@@ -1330,7 +1330,7 @@ describe({
13301330
started: true,
13311331
ready: true,
13321332
backPressure: true,
1333-
defaultStrategy: WorkerChoiceStrategies.ROUND_ROBIN,
1333+
defaultStrategy: WorkerChoiceStrategies.LEAST_USED,
13341334
strategyRetries: expect.any(Number),
13351335
minSize: numberOfWorkers,
13361336
maxSize: numberOfWorkers,
@@ -1354,7 +1354,7 @@ describe({
13541354
started: true,
13551355
ready: true,
13561356
backPressure: false,
1357-
defaultStrategy: WorkerChoiceStrategies.ROUND_ROBIN,
1357+
defaultStrategy: WorkerChoiceStrategies.LEAST_USED,
13581358
strategyRetries: expect.any(Number),
13591359
minSize: numberOfWorkers,
13601360
maxSize: numberOfWorkers,
@@ -1401,7 +1401,7 @@ describe({
14011401
worker: WorkerTypes.web,
14021402
started: true,
14031403
ready: true,
1404-
defaultStrategy: WorkerChoiceStrategies.ROUND_ROBIN,
1404+
defaultStrategy: WorkerChoiceStrategies.LEAST_USED,
14051405
strategyRetries: expect.any(Number),
14061406
minSize: 0,
14071407
maxSize: numberOfWorkers,
@@ -1581,7 +1581,7 @@ describe({
15811581
expect([
15821582
...dynamicThreadPool.workerChoiceStrategiesContext
15831583
.workerChoiceStrategies.keys(),
1584-
]).toStrictEqual([WorkerChoiceStrategies.ROUND_ROBIN])
1584+
]).toStrictEqual([WorkerChoiceStrategies.LEAST_USED])
15851585
const echoTaskFunction = (data) => {
15861586
return data
15871587
}
@@ -1600,7 +1600,7 @@ describe({
16001600
...dynamicThreadPool.workerChoiceStrategiesContext
16011601
.workerChoiceStrategies.keys(),
16021602
]).toStrictEqual([
1603-
WorkerChoiceStrategies.ROUND_ROBIN,
1603+
WorkerChoiceStrategies.LEAST_USED,
16041604
WorkerChoiceStrategies.LEAST_BUSY,
16051605
])
16061606
expect(dynamicThreadPool.listTaskFunctionsProperties()).toStrictEqual([
@@ -1702,7 +1702,7 @@ describe({
17021702
...dynamicThreadPool.workerChoiceStrategiesContext
17031703
.workerChoiceStrategies.keys(),
17041704
]).toStrictEqual([
1705-
WorkerChoiceStrategies.ROUND_ROBIN,
1705+
WorkerChoiceStrategies.LEAST_USED,
17061706
WorkerChoiceStrategies.LEAST_BUSY,
17071707
])
17081708
expect(dynamicThreadPool.listTaskFunctionsProperties()).toStrictEqual([
@@ -1718,7 +1718,7 @@ describe({
17181718
expect([
17191719
...dynamicThreadPool.workerChoiceStrategiesContext
17201720
.workerChoiceStrategies.keys(),
1721-
]).toStrictEqual([WorkerChoiceStrategies.ROUND_ROBIN])
1721+
]).toStrictEqual([WorkerChoiceStrategies.LEAST_USED])
17221722
expect(dynamicThreadPool.listTaskFunctionsProperties()).toStrictEqual([
17231723
{ name: DEFAULT_TASK_NAME },
17241724
{ name: 'test' },

tests/pools/selection-strategies/selection-strategies.test.mjs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,17 @@ describe('Selection strategies test suite', () => {
2626
)
2727
})
2828

29-
it('Verify ROUND_ROBIN strategy is the default at pool creation', async () => {
29+
it('Verify LEAST_USED strategy is the default at pool creation', async () => {
3030
const pool = new DynamicThreadPool(
3131
min,
3232
max,
3333
new URL('./../../worker-files/thread/testWorker.mjs', import.meta.url),
3434
)
3535
expect(pool.opts.workerChoiceStrategy).toBe(
36-
WorkerChoiceStrategies.ROUND_ROBIN,
36+
WorkerChoiceStrategies.LEAST_USED,
3737
)
3838
expect(pool.workerChoiceStrategiesContext.defaultWorkerChoiceStrategy).toBe(
39-
WorkerChoiceStrategies.ROUND_ROBIN,
39+
WorkerChoiceStrategies.LEAST_USED,
4040
)
4141
// We need to clean up the resources after our test
4242
await pool.destroy()

tests/pools/selection-strategies/worker-choice-strategies-context.test.mjs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { InterleavedWeightedRoundRobinWorkerChoiceStrategy } from '../../../src/
1111
import { LeastBusyWorkerChoiceStrategy } from '../../../src/pools/selection-strategies/least-busy-worker-choice-strategy.ts'
1212
// import { LeastEluWorkerChoiceStrategy } from '../../../src/pools/selection-strategies/least-elu-worker-choice-strategy.ts'
1313
import { LeastUsedWorkerChoiceStrategy } from '../../../src/pools/selection-strategies/least-used-worker-choice-strategy.ts'
14-
import { RoundRobinWorkerChoiceStrategy } from '../../../src/pools/selection-strategies/round-robin-worker-choice-strategy.ts'
1514
import { WeightedRoundRobinWorkerChoiceStrategy } from '../../../src/pools/selection-strategies/weighted-round-robin-worker-choice-strategy.ts'
1615
import { WorkerChoiceStrategiesContext } from '../../../src/pools/selection-strategies/worker-choice-strategies-context.ts'
1716

@@ -46,7 +45,7 @@ describe('Worker choice strategies context test suite', () => {
4645
workerChoiceStrategiesContext.workerChoiceStrategies.get(
4746
workerChoiceStrategiesContext.defaultWorkerChoiceStrategy,
4847
),
49-
).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
48+
).toBeInstanceOf(LeastUsedWorkerChoiceStrategy)
5049
workerChoiceStrategiesContext = new WorkerChoiceStrategiesContext(
5150
dynamicPool,
5251
)
@@ -55,7 +54,7 @@ describe('Worker choice strategies context test suite', () => {
5554
workerChoiceStrategiesContext.workerChoiceStrategies.get(
5655
workerChoiceStrategiesContext.defaultWorkerChoiceStrategy,
5756
),
58-
).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
57+
).toBeInstanceOf(LeastUsedWorkerChoiceStrategy)
5958
})
6059

6160
it('Verify that constructor() initializes the context with retries attribute properly set', () => {
@@ -78,7 +77,7 @@ describe('Worker choice strategies context test suite', () => {
7877
fixedPool,
7978
)
8079
expect(workerChoiceStrategiesContext.defaultWorkerChoiceStrategy).toBe(
81-
WorkerChoiceStrategies.ROUND_ROBIN,
80+
WorkerChoiceStrategies.LEAST_USED,
8281
)
8382
const workerChoiceStrategyUndefinedStub = workerChoiceStrategiesContext
8483
.workerChoiceStrategies.get(
@@ -141,7 +140,7 @@ describe('Worker choice strategies context test suite', () => {
141140
fixedPool,
142141
)
143142
expect(workerChoiceStrategiesContext.defaultWorkerChoiceStrategy).toBe(
144-
WorkerChoiceStrategies.ROUND_ROBIN,
143+
WorkerChoiceStrategies.LEAST_USED,
145144
)
146145
const workerChoiceStrategyStub = workerChoiceStrategiesContext
147146
.workerChoiceStrategies.get(
@@ -164,7 +163,7 @@ describe('Worker choice strategies context test suite', () => {
164163
fixedPool,
165164
)
166165
expect(workerChoiceStrategiesContext.defaultWorkerChoiceStrategy).toBe(
167-
WorkerChoiceStrategies.ROUND_ROBIN,
166+
WorkerChoiceStrategies.LEAST_USED,
168167
)
169168
const workerChoiceStrategyStub = workerChoiceStrategiesContext
170169
.workerChoiceStrategies.get(
@@ -183,7 +182,7 @@ describe('Worker choice strategies context test suite', () => {
183182
dynamicPool,
184183
)
185184
expect(workerChoiceStrategiesContext.defaultWorkerChoiceStrategy).toBe(
186-
WorkerChoiceStrategies.ROUND_ROBIN,
185+
WorkerChoiceStrategies.LEAST_USED,
187186
)
188187
const workerChoiceStrategyStub = workerChoiceStrategiesContext
189188
.workerChoiceStrategies.get(
@@ -205,15 +204,15 @@ describe('Worker choice strategies context test suite', () => {
205204
workerChoiceStrategiesContext.workerChoiceStrategies.get(
206205
workerChoiceStrategiesContext.defaultWorkerChoiceStrategy,
207206
),
208-
).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
207+
).toBeInstanceOf(LeastUsedWorkerChoiceStrategy)
209208
workerChoiceStrategiesContext.setDefaultWorkerChoiceStrategy(
210-
WorkerChoiceStrategies.ROUND_ROBIN,
209+
WorkerChoiceStrategies.LEAST_USED,
211210
)
212211
expect(
213212
workerChoiceStrategiesContext.workerChoiceStrategies.get(
214213
workerChoiceStrategiesContext.defaultWorkerChoiceStrategy,
215214
),
216-
).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
215+
).toBeInstanceOf(LeastUsedWorkerChoiceStrategy)
217216
})
218217

219218
it('Verify that setDefaultWorkerChoiceStrategy() works with ROUND_ROBIN and dynamic pool', () => {
@@ -224,15 +223,15 @@ describe('Worker choice strategies context test suite', () => {
224223
workerChoiceStrategiesContext.workerChoiceStrategies.get(
225224
workerChoiceStrategiesContext.defaultWorkerChoiceStrategy,
226225
),
227-
).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
226+
).toBeInstanceOf(LeastUsedWorkerChoiceStrategy)
228227
workerChoiceStrategiesContext.setDefaultWorkerChoiceStrategy(
229-
WorkerChoiceStrategies.ROUND_ROBIN,
228+
WorkerChoiceStrategies.LEAST_USED,
230229
)
231230
expect(
232231
workerChoiceStrategiesContext.workerChoiceStrategies.get(
233232
workerChoiceStrategiesContext.defaultWorkerChoiceStrategy,
234233
),
235-
).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
234+
).toBeInstanceOf(LeastUsedWorkerChoiceStrategy)
236235
})
237236

238237
it('Verify that setDefaultWorkerChoiceStrategy() works with LEAST_USED and fixed pool', () => {

tests/pools/thread/dynamic.test.mjs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,13 +132,6 @@ describe({
132132
)
133133
expect(exitEvents).toBe(max - min)
134134
expect(longRunningPool.workerNodes.length).toBe(min)
135-
expect(
136-
longRunningPool.workerChoiceStrategiesContext.workerChoiceStrategies
137-
.get(
138-
longRunningPool.workerChoiceStrategiesContext
139-
.defaultWorkerChoiceStrategy,
140-
).nextWorkerNodeKey,
141-
).toBeLessThan(longRunningPool.workerNodes.length)
142135
// We need to clean up the resources after our test
143136
await longRunningPool.destroy()
144137
})

0 commit comments

Comments
 (0)