From 4e8a97cb6377c85c6886d07cacdfb38cb2475151 Mon Sep 17 00:00:00 2001 From: Vincent Rousseau <vincent.rousseau@irstea.fr> Date: Tue, 9 Jan 2018 15:56:49 +0100 Subject: [PATCH] Add CPU boost when few bloc of the user in frame --- app/lib/computation/BlockchainContext.ts | 10 +++++++ app/lib/indexer.ts | 2 ++ app/modules/prover/lib/blockProver.ts | 33 ++++++++++++++++++------ app/modules/prover/lib/constants.ts | 2 +- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/app/lib/computation/BlockchainContext.ts b/app/lib/computation/BlockchainContext.ts index 426ed2dc8..d8c1344c5 100644 --- a/app/lib/computation/BlockchainContext.ts +++ b/app/lib/computation/BlockchainContext.ts @@ -93,6 +93,16 @@ export class BlockchainContext { return local_vHEAD.issuerDiff; } + /** + * Utility method: gives the number of block in the current frame for a given issuer. + * @param issuer The issuer we want. + */ + async getIssuerNbBlockInFrame(issuer: string): Promise<number> { + const local_vHEAD = await this.getvHeadCopy({ issuer }) + let issuerNbBlockInFrame = await indexer.preparePersonalizedPoW(local_vHEAD, this.vHEAD_1, (n:number, m:number, p = "") => this.dal.range(n,m,p), this.conf) + return issuerNbBlockInFrame + } + setConfDAL(newConf: any, newDAL: any, theBlockchain: DuniterBlockchain, theQuickSynchronizer: QuickSynchronizer): void { this.dal = newDAL; this.conf = newConf; diff --git a/app/lib/indexer.ts b/app/lib/indexer.ts index ddb1cfa99..ea2d70521 100644 --- a/app/lib/indexer.ts +++ b/app/lib/indexer.ts @@ -1092,6 +1092,8 @@ export class Indexer { HEAD.powRemainder = HEAD.issuerDiff % 16; HEAD.powZeros = (HEAD.issuerDiff - HEAD.powRemainder) / 16; + + return nbPersonalBlocksInFrame; } // BR_G19 diff --git a/app/modules/prover/lib/blockProver.ts b/app/modules/prover/lib/blockProver.ts index f3e036770..ce45c9f68 100644 --- a/app/modules/prover/lib/blockProver.ts +++ b/app/modules/prover/lib/blockProver.ts @@ -192,6 +192,15 @@ export class BlockProver { }); if (!result) { this.logger.info('GIVEN proof-of-work for block#%s with %s leading zeros followed by [0-' + highMark + ']! stop PoW for %s', block.number, nbZeros, this.pair && this.pair.pub.slice(0,6)); + let selfNbBlockInFrame = await this.server.getBcContext().getIssuerNbBlockInFrame(this.server.PeeringService.selfPubkey) + if(this.conf.ecoMode === true) { + let selfNbBlockInFrame = await this.server.getBcContext().getIssuerNbBlockInFrame(this.server.PeeringService.selfPubkey) + if(selfNbBlockInFrame < 2) { + this.changeCPU(1) + this.conf.nbCores = this.server.conf.nbCores + this.logger.info("Boost number of CPU cores "+this.conf.nbCores+" with only "+selfNbBlockInFrame+" block member in frame") + } + } throw 'Proof-of-work computation canceled because block received'; } else { const proof = result.block; @@ -201,15 +210,23 @@ export class BlockProver { this.logger.info('Done: #%s, %s in %ss instead of %ss (%s tests, ~%s tests/s)', block.number, proof.hash, (duration / 1000).toFixed(2), this.conf.avgGenTime, testsCount, testsPerSecond.toFixed(2)); this.logger.info('FOUND proof-of-work with %s leading zeros followed by [0-' + highMark + ']!', nbZeros); - if(this.conf.ecoMode === true && this.conf.nbCores*testsPerSecond > ProverConstants.ECO_MODE_MINIMAL_TESTS_PER_SECONDS) { - if(this.conf.nbCores > 1) { - this.logger.info("Reducing number of CPU cores "+this.conf.nbCores) - this.conf.nbCores = this.conf.nbCores -1 + if(this.conf.ecoMode === true) { + let selfNbBlockInFrame = await this.server.getBcContext().getIssuerNbBlockInFrame(this.server.PeeringService.selfPubkey) + if(selfNbBlockInFrame < 2) { + this.changeCPU(1) + this.conf.nbCores = this.server.conf.nbCores + this.logger.info("Boost number of CPU cores "+this.conf.nbCores+" with only "+selfNbBlockInFrame+" block member in frame") } - else if(this.conf.cpu > ProverConstants.ECO_MODE_MINIMAL_CPU){ - let cpu:number = this.conf.cpu - 0.1 - this.logger.info("Slowing down the CPU to "+cpu) - this.changeCPU(cpu) + else if(this.conf.nbCores*testsPerSecond > ProverConstants.ECO_MODE_MINIMAL_TESTS_PER_SECONDS) { + if(this.conf.nbCores > 1) { + this.logger.info("Reducing number of CPU cores "+this.conf.nbCores) + this.conf.nbCores = this.conf.nbCores -1 + } + else if(this.conf.cpu > ProverConstants.ECO_MODE_MINIMAL_CPU){ + let cpu:number = this.conf.cpu - 0.1 + this.logger.info("Slowing down the CPU to "+cpu) + this.changeCPU(cpu) + } } } return BlockDTO.fromJSONObject(proof) diff --git a/app/modules/prover/lib/constants.ts b/app/modules/prover/lib/constants.ts index 66dbe534b..3a8d77c70 100644 --- a/app/modules/prover/lib/constants.ts +++ b/app/modules/prover/lib/constants.ts @@ -5,7 +5,7 @@ export const ProverConstants = { MINIMAL_ZEROS_TO_SHOW_IN_LOGS: 3, POW_MINIMAL_TO_SHOW: 2, - DEFAULT_ECO_MODE: false, + DEFAULT_ECO_MODE: true, DEFAULT_CPU: 0.6, DEFAULT_PEER_ID: 1, MIN_PEER_ID: 1, -- GitLab