diff --git a/back/src/Controller/IoSocketController.ts b/back/src/Controller/IoSocketController.ts index 511a171e..87a8c5e2 100644 --- a/back/src/Controller/IoSocketController.ts +++ b/back/src/Controller/IoSocketController.ts @@ -49,6 +49,7 @@ import Direction = PositionMessage.Direction; import {ProtobufUtils} from "../Model/Websocket/ProtobufUtils"; import {App, HttpRequest, TemplatedApp, WebSocket} from "uWebSockets.js" import {parse} from "query-string"; +import {cpuTracker} from "../Services/CpuTracker"; function emitInBatch(socket: ExSocketInterface, payload: SubMessage): void { socket.batchedMessages.addPayload(payload); @@ -90,41 +91,6 @@ export class IoSocketController { }); this.ioConnection(); - - - - - let time = process.hrtime.bigint() - let usage = process.cpuUsage() - - - function secNSec2ms(secNSec) { - if (Array.isArray(secNSec)) { - return secNSec[0] * 1000 + secNSec[1] / 1000000; - } - return secNSec / 1000; - } - - let oldCpuUsage = process.cpuUsage(); - setInterval(() => { - let elapTime = process.hrtime.bigint(); - let elapUsage = process.cpuUsage(usage) - usage = process.cpuUsage() - - let elapTimeMS = elapTime - time; - let elapUserMS = secNSec2ms(elapUsage.user) - let elapSystMS = secNSec2ms(elapUsage.system) - let cpuPercent = Math.round(100 * (elapUserMS + elapSystMS) / Number(elapTimeMS) * 1000000) - - time = elapTime; - //usage = elapUsage; - console.log('elapsed time ms: ', elapTimeMS) - console.log('elapsed user ms: ', elapUserMS) - console.log('elapsed system ms:', elapSystMS) - console.log('cpu percent: ', cpuPercent) - - - }, 500); } private isValidToken(token: object): token is TokenInterface { @@ -452,6 +418,11 @@ export class IoSocketController { try { const userMoves = userMovesMessage.toObject(); + // If CPU is high, let's drop messages of users moving (we will only dispatch the final position) + if (cpuTracker.getCpuPercent() > 80 && userMoves.position?.moving === true) { + return; + } + const position = userMoves.position; if (position === undefined) { throw new Error('Position not found in message'); diff --git a/back/src/Services/CpuTracker.ts b/back/src/Services/CpuTracker.ts new file mode 100644 index 00000000..69eac8b9 --- /dev/null +++ b/back/src/Services/CpuTracker.ts @@ -0,0 +1,40 @@ + +function secNSec2ms(secNSec: Array|number) { + if (Array.isArray(secNSec)) { + return secNSec[0] * 1000 + secNSec[1] / 1000000; + } + return secNSec / 1000; +} + +class CpuTracker { + private cpuPercent: number = 0; + + constructor() { + let time = process.hrtime.bigint() + let usage = process.cpuUsage() + setInterval(() => { + let elapTime = process.hrtime.bigint(); + let elapUsage = process.cpuUsage(usage) + usage = process.cpuUsage() + + let elapTimeMS = elapTime - time; + let elapUserMS = secNSec2ms(elapUsage.user) + let elapSystMS = secNSec2ms(elapUsage.system) + this.cpuPercent = Math.round(100 * (elapUserMS + elapSystMS) / Number(elapTimeMS) * 1000000) + + time = elapTime; + /*console.log('elapsed time ms: ', elapTimeMS) + console.log('elapsed user ms: ', elapUserMS) + console.log('elapsed system ms:', elapSystMS) + console.log('cpu percent: ', this.cpuPercent)*/ + }, 500); + } + + public getCpuPercent(): number { + return this.cpuPercent; + } +} + +const cpuTracker = new CpuTracker(); + +export { cpuTracker }; diff --git a/benchmark/index.ts b/benchmark/index.ts index df1a69dd..420223cc 100644 --- a/benchmark/index.ts +++ b/benchmark/index.ts @@ -14,7 +14,7 @@ async function startOneUser(): Promise { const connection = await connectionManager.connectToRoomSocket(); connection.emitPlayerDetailsMessage('foo', ['male3']); - await connection.joinARoom('global__maps.workadventure.localhost/Floor0/floor0', 783, 170, 'down', false, { + await connection.joinARoom('global__maps.workadventure.localhost/Floor0/floor0', 783, 170, 'down', true, { top: 0, bottom: 200, left: 500,