Код очень прост и должен освобождать объекты из памяти, в этом приложении около 20 одновременно работающих пользователей.
Идея кода заключается в том, что sessionID является ключом для хранения объекта, а когда сеанс заканчивается, объект освобождается.
код
'use strict'
const http = require('http')
const app = require('./config')
const Server = http.Server(app)
const PORT = process.env.PORT || 8000
const io = require('socket.io')(Server)
Server.listen(PORT, () => console.log('Game server running on:', PORT))
const players = {}
const moneys = {}
var util = require('util');
io.on('connection', socket => {
// When a player connects
socket.on('new-player', state => {
//console.log(socket.id+'New player joined with state:', state)
players[socket.id] = state
// Emit the update-players method in the client side
io.emit('update-players', players)
var pCount = Object.keys(players).length;
console.log("players in mem "+pCount);
});
socket.on('new-money', state => {
moneycounter++
moneys[socket.id] = state
// Emit the update-players method in the client side
if (moneycounter >2) {
io.emit('update-moneys', moneys)
moneycounter = 0
}
});
socket.on('disconnect', state => {
console.log(socket.id+' player discontinue with state:', state)
try {
if (typeof players[socket.id].playerName != 'undefined') delete players[socket.id].playerName
if (typeof players[socket.id].speed != 'undefined') delete players[socket.id].speed
}
catch (err) {
console.log(socket.id+' typeerror deleting 1')
}
delete players[socket.id]
delete moneys[socket.id]
// io.emit('update-players', players)
});
// When a player moves
socket.on('move-player', data => {
//console.log(' move player' +socket.id)
const { x, y, angle, playerName, speed } = data
// If the player is invalid, return
if (players[socket.id] === undefined) {
console.log(socket.id+' invalid move')
try {
if (typeof players[socket.id].playerName != 'undefined') delete players[socket.id].playerName
if (typeof players[socket.id].speed != 'undefined') delete players[socket.id].speed
}
catch (err) {
console.log(socket.id+' typeerror 3 deleting')
}
delete players[socket.id]
delete moneys[socket.id]
socket.disconnect();
return
}
// Update the player's data if he moved
players[socket.id].x = x
players[socket.id].y = y
players[socket.id].angle = angle
players[socket.id].playerName = {
name: playerName.name,
x: playerName.x,
y: playerName.y
}
players[socket.id].speed = {
value: speed.value,
x: speed.x,
y: speed.y
}
// Send the data back to the client
io.emit('update-players', players)
})
})
По какой-то причине мое приложение очень быстро набирает ~ 20 МБ ОЗУ
но позже тот же день занимает более 1,5 ГБ, вызывая ошибки памяти R14.
Мой конфиг должен ограничить его до 512 следующим образом:
веб-узел --optimize_for_size --max_old_space_size = 460
--gc_interval = 100 server / index.js
Моя текущая конфигурация 2X. (План 1024 мб)
Есть ли возможность настроить перезагрузку heroku при возникновении ошибки памяти R14.