【问题标题】:Node.js CPU issue/OptimizationNode.js CPU 问题/优化
【发布时间】:2015-10-18 10:46:08
【问题描述】:

我和我的朋友正在做一个 node.js 游戏,我们一直在测试 cpu,但是在分析这个名为 zlib 的进程后,它正在占用大部分 CPU/RAM

3 个客户端连接到一个游戏很好,但是当连接 12~13 个玩家时,它使用 58%,而 zlib 使用了大约 30% 的 cpu。

inclusive      self           name
ticks   total  ticks   total
64775   58.5%  64775   58.5%  /lib/x86_64-linux-gnu/libc-2.19.so
25001   22.6%    224    0.2%  LazyCompile: *callback zlib.js:409
//this one is a different zlib
7435    6.7%     82    0.1%  LazyCompile: ~callback zlib.js:409

有什么办法可以减少cpu的使用吗?或者它增加这么多是有原因的。

我已经阅读了一些内容,并被告知它来自 socket.io,所以这是我们发送大部分数据的套接字部分。

for (var i = 0; i < users.length; i++) {
    if (u.room == users[i].room && users[i].x + users[i].radius >= u.x - u.screenWidth / 2 - 20 && users[i].x - users[i].radius <= u.x + u.screenWidth / 2 + 20 && users[i].y + users[i].radius >= u.y - u.screenHeight / 2 - 20 && users[i].y - users[i].radius <= u.y + u.screenHeight / 2 + 20) {
        if (users[i].id == u.id) {
            visiblePlayers.push({
                x: users[i].x,
                y: users[i].y,
                angle: users[i].angle,
                hue: users[i].hue,
                radius: users[i].radius,
                squeeze: users[i].squeeze,
                name: users[i].name,
                dead: users[i].dead,
                isPlayer: true,
                kills: users[i].kills
            });
        } else {
            visiblePlayers.push({
                x: users[i].x,
                y: users[i].y,
                angle: users[i].angle,
                hue: users[i].hue,
                radius: users[i].radius,
                squeeze: users[i].squeeze,
                name: users[i].name,
                dead: users[i].dead
            });
        }
        // SEND DYING INFO: (FOR OFFLINE ANIMATION):
        if (users[i].dying) {
            visiblePlayers[visiblePlayers.length - 1].dying = true;
        }
    }
}
var visibleEnergy = [];
for (var i = 0; i < energies.length; i++) {
    if (u.firstSend || (energies[i].updated && energies[i].room == u.room)) {
        var anim = energies[i].animate;
        if (u.firstSend)
            anim = true;
        visibleEnergy.push({
            x: energies[i].x,
            y: energies[i].y,
            radius: energies[i].radius,
            index: i,
            animate: anim,
            hue: energies[i].hue,
            room: energies[i].room
        });
    }
}

// SEND PLAYER UPDATES TO CLIENTS:
sockets[u.id].emit('serverTellPlayerMove', visiblePlayers,
    visibleEnergy);

Zlib 是其中一个问题,但如果有任何其他优化方法来降低服务器 CPU。

额外:检查用户的格式已在 StackExchange https://codereview.stackexchange.com/questions/107922/node-js-cpu-issue 中得到解答。如果有任何方法可以减少 zlib cpu 使用率,我们只需要帮助。

谢谢。

【问题讨论】:

    标签: javascript node.js performance sockets optimization


    【解决方案1】:

    zlib 是一个广泛使用的压缩库。您看到大量 CPU 使用率的最可能原因是大量压缩的网络流量。这是可取的,因为 CPU 通常比网络流量“便宜”。其他可能需要大量使用 zlib 的领域是通过 node.js 的zlib module 加载磁盘上的压缩文件,或者如果您正在对通常也是uses zlib 的 PNG 图像进行服务器端解压缩。

    如果您发现 zlib 的“税”对于您的特定应用程序来说太多了,也许您可​​以将解压缩卸载到另一个进程。您可以在主服务器前使用一些 node.js 服务,其目的纯粹是连接到客户端。然后让他们以未压缩的“原始”格式与您的服务器通信,您的服务器更容易理解这种格式。

    你还没有提到这是否真的给你带来了问题。我不一定会担心它。这种单一进程的可扩展性是使用 node.js 的一个缺点,唯一的解决方案是将您的服务分成更小的部分,这些部分可以分布在多个内核甚至多个服务器上。

    【讨论】:

    • 谢谢,我找到了在套接字中使用 zlib 的位置。首先减少正在发送的数据,然后禁用套接字 zlib 压缩。它已将服务器负载降低了 40%,感谢 Alex 提供的信息!
    猜你喜欢
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2011-04-01
    • 2019-03-12
    • 2010-10-20
    • 2012-02-25
    相关资源
    最近更新 更多