Node.js CPU问题/优化

Node.js CPU issue/Optimization

本文关键字:优化 问题 CPU js Node      更新时间:2023-09-26

我和我的朋友正在制作一款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。这是我们的socket发送大部分数据的部分。

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

额外:检查用户的格式已经在https://codereview.stackexchange.com/questions/107922/node-js-cpu-issue的StackExchange上回答了。我们只是需要帮助,如果有任何方法来减少zlib的cpu占用。

谢谢。

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

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

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