【问题标题】:node.js express cluster and high CPU usagenode.js 快速集群和高 CPU 使用率
【发布时间】:2012-07-02 16:41:19
【问题描述】:

我的 node.js 应用程序使用 express、socket.io 并通过 mongoose 与 mongodb 对话。所有这些都可以在 CPU 使用率低的情况下正常工作。 当我让应用程序与集群一起运行时,它运行良好,但 CPU 使用率确实很高。这就是我正在做的事情。

var settings = require("./settings"),
    cluster = require('cluster');

cluster('./server')
  .use(cluster.logger('logs'))
  .use(cluster.stats())
  .use(cluster.pidfiles('pids'))
  .use(cluster.cli())
  .use(cluster.repl(8888))
  .listen(7777);

当我检查 master.log 时,我看到了

[Fri, 21 Oct 2011 02:59:51 GMT] INFO master started
[Fri, 21 Oct 2011 02:59:53 GMT] ERROR worker 0 died
[Fri, 21 Oct 2011 02:59:53 GMT] INFO spawned worker 0
[Fri, 21 Oct 2011 02:59:54 GMT] ERROR worker 0 died
[Fri, 21 Oct 2011 02:59:54 GMT] INFO spawned worker 0
[Fri, 21 Oct 2011 02:59:56 GMT] ERROR worker 0 died
[Fri, 21 Oct 2011 02:59:56 GMT] INFO spawned worker 0
.....

[Fri, 21 Oct 2011 03:11:08 GMT] INFO spawned worker 0
[Fri, 21 Oct 2011 03:11:10 GMT] WARNING shutting down master
[Fri, 21 Oct 2011 03:12:07 GMT] INFO spawned worker 0
[Fri, 21 Oct 2011 03:12:07 GMT] INFO spawned worker 1
[Fri, 21 Oct 2011 03:12:07 GMT] INFO master started
[Fri, 21 Oct 2011 03:12:09 GMT] ERROR worker 1 died
[Fri, 21 Oct 2011 03:12:09 GMT] INFO spawned worker 1
[Fri, 21 Oct 2011 03:12:10 GMT] ERROR worker 1 died
[Fri, 21 Oct 2011 03:12:10 GMT] INFO spawned worker 1

在workers.access.log 中,我看到所有控制台消息、socket.io 日志等...

在workers.error.log 中,我看到以下错误消息,看起来有问题...

node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: EADDRINUSE, Address already in use
    at HTTPServer._doListen (net.js:1106:5)
    at net.js:1077:14
    at Object.lookup (dns.js:153:45)
    at HTTPServer.listen (net.js:1071:20)
    at Object.<anonymous> (/cygdrive/c/HTML5/RENT/test/server/server.js:703:5)
    at Module._compile (module.js:402:26)
    at Object..js (module.js:408:10)
    at Module.load (module.js:334:31)
    at Function._load (module.js:293:12)
    at require (module.js:346:19)

server.js:703 - 指向app.listen(9999);

编辑:server.js 代码

var express = require("express"),
    fs = require("fs"),
    form = require('connect-form'),
    app = module.exports = express.createServer(
        form({ keepExtensions: true })
    ),
    sys = require("sys"),
    RentModel = require("./rent_schema"),
    UserModel   = require("./track_schema"),
    email   = require("./email_connect"),
    SubscriptionModel = require("./subscription_schema"),
    io = require("socket.io"),
    fb = require('facebook-js'),
    Twitter = require('./Twitter_Analysis'),
    Foursquare = require('./Foursquare_Analysis'),
    YQL = require("yql"),
    settings = require("./settings");
//    


 var cluster = require('cluster');
 cluster(app)
  .use(cluster.logger('logs'))
  .use(cluster.stats())
  .use(cluster.pidfiles('pids'))
  .use(cluster.cli())
  .use(cluster.debug())
  .use(cluster.repl(settings.ADMIN_PORT))
  .listen(settings.PORT);



socket = io.listen(app);
.....
.....
//app.listen(settings.PORT);

【问题讨论】:

    标签: node.js express mongoose cluster-computing


    【解决方案1】:

    看起来您正在尝试将您的工作人员绑定到同一个端口,这会使工作人员崩溃,但集群正在重新启动工作人员。所以你处于一个无限的死亡循环中。

    我不确定您是否需要 server.js 文件中的 app.listen(9999),它可能试图在您的所有工作人员中绑定端口 9999。一个很好的例子请看集群包中的例子:https://github.com/LearnBoost/cluster/blob/master/examples/express.js

    【讨论】:

    • 谢谢。你的解释对我来说很有意义。请给我一些关于如何将工作人员绑定到不同端口的指示?
    • 我不确定您的 server.js 文件中是否需要 app.listen(9999),它可能正在尝试在所有工作人员中绑定端口 9999。我认为集群已经为你绑定了一个端口。如果您有 github,我可以获取代码并可能修复它。看看这个例子,看看它是否有帮助:github.com/LearnBoost/cluster/blob/master/examples/express.js
    • 我的代码不在 github 中。我通过复制粘贴代码中的一些行来编辑我的问题。不确定它是否足够。如果我注释掉 app.listen(9999),请求超时。
    • 据我了解,集群支持监听同一个套接字(在节点:启动并运行中阅读)。不过,我不熟悉您代码中的集群语法。以下是它的一个示例:stackoverflow.com/questions/10663809/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    相关资源
    最近更新 更多