X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fpools%2Fselection-strategies%2Fabstract-worker-choice-strategy.ts;h=6e798fbc4349d98bf5b5761d884013382efa601f;hb=3575d1d00f110b76dee3ebc61bd17bb480ddd985;hp=ad42f9184c78e5116332a507c003cd4530f8da9e;hpb=0567595a23237d7b0e4bc0ec70c8e313eb71bb10;p=poolifier.git diff --git a/src/pools/selection-strategies/abstract-worker-choice-strategy.ts b/src/pools/selection-strategies/abstract-worker-choice-strategy.ts index ad42f918..6e798fbc 100644 --- a/src/pools/selection-strategies/abstract-worker-choice-strategy.ts +++ b/src/pools/selection-strategies/abstract-worker-choice-strategy.ts @@ -1,3 +1,4 @@ +import { cpus } from 'node:os' import { DEFAULT_WORKER_CHOICE_STRATEGY_OPTIONS } from '../../utils' import type { IPool } from '../pool' import type { IWorker } from '../worker' @@ -99,12 +100,12 @@ export abstract class AbstractWorkerChoiceStrategy< } /** - * Gets the worker task run time. - * If the required statistics are `avgRunTime`, the average run time is returned. - * If the required statistics are `medRunTime`, the median run time is returned. + * Gets the worker task runtime. + * If the required statistics are `avgRunTime`, the average runtime is returned. + * If the required statistics are `medRunTime`, the median runtime is returned. * * @param workerNodeKey - The worker node key. - * @returns The worker task run time. + * @returns The worker task runtime. */ protected getWorkerTaskRunTime (workerNodeKey: number): number { return this.requiredStatistics.medRunTime @@ -112,6 +113,31 @@ export abstract class AbstractWorkerChoiceStrategy< : this.pool.workerNodes[workerNodeKey].tasksUsage.avgRunTime } + /** + * Gets the worker task wait time. + * If the required statistics are `avgWaitTime`, the average wait time is returned. + * If the required statistics are `medWaitTime`, the median wait time is returned. + * + * @param workerNodeKey - The worker node key. + * @returns The worker task wait time. + */ + protected getWorkerWaitTime (workerNodeKey: number): number { + return this.requiredStatistics.medWaitTime + ? this.pool.workerNodes[workerNodeKey].tasksUsage.medWaitTime + : this.pool.workerNodes[workerNodeKey].tasksUsage.avgWaitTime + } + + protected computeDefaultWorkerWeight (): number { + let cpusCycleTimeWeight = 0 + for (const cpu of cpus()) { + // CPU estimated cycle time + const numberOfDigits = cpu.speed.toString().length - 1 + const cpuCycleTime = 1 / (cpu.speed / Math.pow(10, numberOfDigits)) + cpusCycleTimeWeight += cpuCycleTime * Math.pow(10, numberOfDigits) + } + return Math.round(cpusCycleTimeWeight / cpus().length) + } + /** * Finds the first free worker node key based on the number of tasks the worker has applied. *