2015-10-18 75 views
1

我和我的朋友正在使Node.js的比赛,我们一直在测试的CPU,但剖析这一过程被称为zlib的后吸大部分的CPU/RAMNode.js的CPU问题/优化

3个客户端连接到一个游戏是好的,但是当12〜13个玩家连接时,它使用58%,其中zlib使用该CPU的30%左右。

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是out问题之一,也是如果有其他优化方法来减少服务器的CPU。

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

谢谢。

+0

使用lz4 ....... – YOU

回答

0

zlib是一个广泛使用的压缩库。您看到大量CPU使用率的最可能原因是存在大量压缩的网络流量。这是可取的,因为CPU通常比网络流量'便宜'。其他可能会导致严重zlib使用的应用程序将是通过node.js的zlib module加载的磁盘上的压缩文件,或者如果您正在进行PNG图像的服务器端解压缩(通常也是uses zlib)。

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

你不提这是否实际上导致你的问题呢。我不一定会担心。这种单进程可伸缩性是使用node.js的一个缺点,唯一的解决方案是将服务分解成可分布在多个内核甚至多个服务器上的较小部分。

+0

谢谢,我发现zlib在socket中被使用的地方。首先减少发送的数据,然后禁用套接字zlib压缩。它已经将服务器负载减少了40%,这要归功于Alex的信息! – Hawkhunter