正如问题标题所暗示的那样,我很难确定可以对我的应用程序进行哪些改进(或在os,ubuntu中进行了调整)以达到可接受的性能。但首先,我将解释该体系结构:
前端服务器是一台8核机器,具有8 gigs RAM,运行Ubuntu 12.04。该应用程序完全用javascript编写,并在node.js v 0.8.22中运行(由于某些模块似乎抱怨较新版本的节点),我使用nginx 1.4代理来自端口80和443的HTTP流量到受管理的8个节点工作程序并开始使用节点集群api。我使用最新版本的socket.io 0.9.14来处理websocket连接,在该连接上,我仅启用了websockets和xhr-polling作为可用传输。在这台机器上,我还运行了Redis(2.2)的实例。
我将持久数据(例如用户和乐谱)存储在mongodb(3.6)上的第二台服务器上,该服务器具有4gigs RAM和2个内核。
该应用程序已投入生产数月之久(直到一个星期前才在一个盒子上运行),每天约有1.8万用户在使用。除以下一个主要问题外,它始终运行良好:性能下降。使用后,每个进程使用的cpu数量会增加,直到它使worker饱和(不再处理请求)为止。我已经临时解决了它每分钟检查一次每个工作人员使用的cpu的问题,并在达到98%时重新启动它。因此,这里的问题主要是cpu,而不是RAM。自从我更新到socket.io 0.9.14(较早的版本正在泄漏内存)以来,RAM不再是问题,因此我怀疑这是一个内存泄漏问题,尤其是因为现在它是CPU增长相当快的原因(我必须每天重新启动每个工人大约10-12次!)。老实说,正在使用的RAM也在增长,但是非常缓慢,每2-3天使用1个演出,奇怪的是,即使我完全重新启动整个应用程序,它也不会发布。仅当我重新启动服务器后才会释放!我真的不明白...
现在,我发现了nodefly很棒,因此我终于可以看到生产服务器上正在发生的事情,并且从几天开始就在收集数据。如果有人想查看图表,我可以给您访问权限,但是基本上,我可以看到我有80到200个并发连接!我期望node.js处理数千个请求,而不是数百个请求。同样,http流量的平均响应时间在500到1500毫秒之间浮动,我认为这确实很多。同样,在此时有1300位用户在线的时刻,这是“ ss -s”的输出:
Total: 5013 (kernel 5533)
TCP: 8047 (estab 4788, closed 3097, orphaned 139, synrecv 0, timewait 3097/0), ports 0
Transport Total IP IPv6
* 5533 - -
RAW 0 0 0
UDP 0 0 0
TCP 4950 4948 2
INET 4950 4948 2
FRAG 0 0 0
这表明我在timewait中有很多关闭的连接。我已将打开的最大文件数增加到999999,这是ulimit -a的输出:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 63724
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 999999
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 63724
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
因此,我认为问题可能出在HTTP流量上,由于某些原因,该流量会导致可用的端口/套接字(?)饱和,但是对我来说没有任何意义:为什么当我重新启动工作线程时,所有客户端在几秒钟内重新连接,工人的CPU上的负载下降到1%,并且能够正确处理请求,直到大约1小时(在高峰时间)饱和为止?
我主要是一名JavaScript程序员,而不是sys admin,所以我不知道我应该为服务器承担多少负载,但可以肯定的是,它并没有达到应有的性能。否则该应用程序是稳定的,而最后一个问题使我无法交付已准备好的移动版本的应用程序,因为显然它们会带来更多的负载并最终使整个事情崩溃!
希望有明显的事情我做错了,有人会帮助发现它...随时向我询问更多信息,对于这个问题的时长我很抱歉,但是我相信这是必要的...提前致谢!
top
当CPU使用率接近100%时,您会看到什么?