Socket.io Nodejs专用游戏服务器 - 发出消息会增加CPU使用率 - 如何获得更多CPU容量?

时间:2017-09-17 12:47:56

标签: node.js performance socket.io cpu ovh

我正在使用Socket.io和Node.js进行简单的多人游戏。我遇到了一些性能问题并尝试调试以找出可能存在内存泄漏的地方。 发生的事情是,对于添加到游戏中的每个玩家,CPU使用率持续增加约10%,然后保持稳定,直到我最终添加另一个(增加另外10%)或断开玩家(减少10%)。 / p>

在我看了一会儿之后,我发现这种增加的原因是服务器端的“发射”。服务器看起来像这样:

var clients = [];

io.sockets.on('connection', function(socket){
    //logic for adding this player to the game arena, that runs 
    //only one time (when the client connects)
    var id = addToGame();

    //add the id of this player in the 'clients' list
    clients.push({
        id: id,
        socket: socket
    });

    socket.on('disconnect', function(){
        //remove the player from the game.
        //delete the client'id from the list of 'clients'
    });
});

setInterval(update, 30);


function update() {
    for (var client of clients) {
        var player = findPlayerById(client.id);
        var message = getMessageForPlayer(player);
        client.socket.emit('update client', message);
    }
}

我认为问题在于我使用匿名函数几次,所以我改变了它,但它似乎没有做任何事情。

那么,在用代码搞砸之后,我意识到当我注释掉这一行时

client.socket.emit('update client', message);

当新玩家出现时,CPU使用量似乎没有增加。哪种方式有意义,因为游戏运行使得游戏领域总有一定数量的玩家。这些玩家最初是由CPU控制的,并且与人类玩家完全相同。当一个人类玩家加入游戏时,他们只是取代现有的CPU玩家,这样无论所有玩家都是CPU还是真正的人类玩家,更新游戏时发生的计算大致相同。

唯一的区别在于在发出“更新客户端”消息之前运行的计算。这只发生在人类玩家身上。所以我认为因为for循环查询每个人类玩家的游戏是有意义的,这可能是CPU使用率增加的原因。 但令我惊讶的是,即使您将所有这些计算保留原样,只需取出“发射”部分,问题就会消失(无论您添加多少玩家,CPU使用率都会保持稳定)。

我认为这是我应该期待的,因为我正在使用来自Digital Ocean的测试专用服务器,具有1Gb的RAM和1个CPU(发出的消息也是平均约150个元素的数组,考虑每个元素是一个包含10个字符串作为元素的数组。)

我的问题是:我如何获得具有CPU容量的服务器,这将允许我在500个或更多玩家中托管?使用我现有的那个,游戏逻辑本身占用了大约40%的CPU,并且每个玩家增加了10%的CPU,难以达到仅仅10个玩家而没有CPU使用率达到100%并重新启动。

我准备从OVH获得一台32Gb,4核的服务器,但是我想要了解那些比我更了解的人的观点。我应该在CPU中寻找什么才能在没有CPU故障的情况下发出这些消息?

0 个答案:

没有答案