20

首先 - 关于我的背景:我已经编程了一段时间(此时已经 10 年)并且在编写想法时相当有能力。一年多前我开始从事 Web 应用程序编程,幸运的是发现了 nodeJS,它让 Web 应用程序的创建感觉更像传统编程。现在,我有一个我已经开发了一段时间的 node.js 应用程序,它现在在网络上的生产环境中运行。我的主要困惑源于我对 Web 开发世界非常陌生,并且在监视我的应用程序时并不真正知道什么是重要的,什么不是。

我使用的是 Joyent SmartMachine,看着他们提供的分析选项有点不知所措。有很多不同的选项和配置,我不知道每个分析的真正目的是什么。对于以下问题,我将不胜感激任何答案,无论是针对 Joyent 的云分析还是完全通用的。


问题一

现在,我主要关心的是弄清楚我的应用程序是如何利用我运行它的服务器的。我想知道我的应用程序是否分配了适量的资源。它收到的请求数量是否会使服务器过度使用,或者它是否需要额外的资源?为此目的,对于 NodeJS 应用程序来说,哪些分析是重要的?(如果有区别的话,在不同的服务器上同时使用 MongoDB 和 Redis)


问题二

在管理生产中的服务器时,还有哪些其他统计数据通常非常重要?我习惯于运行一次以执行特定操作的程序(例如,一旦计算出图像就完成运行的光线追踪器),而不是持续运行并与许多客户端交互的网络应用程序。我敢肯定,对于像我这样的新手来说,对于长期的服务器管理员来说,有很多事情是显而易见的。


问题三

在专门处理 NodeJS 时要注意什么?在处理 NodeJS 的单线程事件循环与更标准的服务器系统时,哪些统计/分析变得特别重要?

我还有其他关于数据库如何参与等式的问题,但我认为现在这已经足够了......

4

3 回答 3

15

从 0.4 到目前的 0.8 系列,我们已经在生产环境中运行了将近一年的 node.js。Web 应用是基于 mongo、redis 和 memcached 的 express 2 和 3。

几个事实。

  • 节点无法处理大型 v8 堆,当它增长超过 200mb 时,您将开始看到 CPU 使用率增加
  • 节点似乎总是泄漏内存,或者至少在没有实际使用它的情况下增加了大堆大小。我怀疑内存碎片,因为 v8 分析或 valgrind 显示 js 空间或驻留堆中没有泄漏。早期的 0.8 在这方面很糟糕,rss 可能是 1GB 和 50MB 堆。
  • 挂起请求很难跟踪。我们编写了中间件来监控这些,特别是因为我们的应用程序是基于长轮询的

我的建议。

  • 每台机器使用多个实例,每个 cpu 至少 1 个。与 haproxy、nginx 等具有会话亲和力的平衡
  • 编写中间件以报告挂起的连接,即代码从未响应或延迟超过阈值的连接
  • 经常重启实例,至少每周一次
  • 编写轮询器,每分钟打印一个进程模块的内存统计信息
  • 使用supervisord和fabric轻松进行流程管理

监控 CPU,报告内存统计信息并在阈值时重新启动

于 2012-11-10T02:28:12.047 回答
6

无论是哪种类型的 Web 应用程序、NodeJS 或其他类型,负载测试都会回答您的应用程序是否拥有适量的服务器资源。我最近为此找到的一个很好的网站是Load Impact

真正要回答的问题是,随着并发用户数量的增加,加载时间何时开始增加?当您达到一定数量的并发用户时,就会达到一个临界点,之后服务器性能将开始下降。因此,根据您希望在不久的将来访问您的网站的用户数量进行负载测试。

你如何估计你期望的用户数量?

必须在您的页面上安装 Google Analytics 或其他分析包!通过这种方式,您将能够看到每天有多少用户访问您的网站,以及每月访问量的增长情况,这有助于预测未来的预期访问量,从而预测服务器上的预期负载。

即使我知道用户数量,我如何估计实际负载?

答案在所有浏览器都可用的 F12 开发工具中。在任何浏览器中打开您的网站并按 F12(或 Opera Ctrl+Shift+I),这应该会打开浏览器的开发工具。在 Firefox 上确保您安装了 Firebug,在 Chrome 和 Internet Explorer 上它应该可以开箱即用。转到网络网络选项卡,然后刷新您的页面。这将向您显示 HTTP 请求的数量、每个页面加载的带宽使用情况!

所以计算每日服务器负载的公式很简单:

每个页面加载的 HTTP 请求数 X 每个用户每天平均加载的页面数 X 预期并发用户数 = 每天对服务器的 HTTP 请求总数

和...

每页加载传输的 MB 数 X 每个用户每天平均加载的页数 X 预期并发用户数 = 每天所需的总带宽

我总是发现每天计算这些数字然后将其外推到几周和几个月更容易。

于 2012-11-16T09:25:43.380 回答
3

Node.js 是单线程的,所以你绝对应该为你机器上的每个 CPU 启动一个进程。到目前为止,集群是做到这一点的最佳方式,并且具有能够重新启动死亡的工作人员并检测无响应的工作人员的额外好处。

您还希望进行负载测试,直到您的请求开始超时或超过您认为的合理响应时间。这将使您对服务器可以处理的上限有一个很好的了解。Blitz是众多值得一看的选项之一。

我从未使用过 Joyent 的统计信息,但NodeFly和他们的node-nodefly-gcinfo是监控节点进程的好工具。

于 2012-11-22T08:22:52.240 回答