0

我已经使用 Express 和 Socket.IO 创建了一个简单的聊天应用程序,现在我已经在使用 IISNode 的托管服务提供商上设置了它。我遇到的问题是套接字连接大约每两分钟重新连接一次。无论套接字上是否有活动,都会发生这种情况。

来自主机的技术支持告诉我,我的应用程序总是使用大量内存。这对我来说似乎不太可能。据我所知,每个域都分配了 512MB 的内存。他们告诉我,当内存用完时,应用程序池会被回收,这就是我的应用程序不断重新连接的原因。我已经无休止地测试了这段代码。即使在我的开发机器上运行它,我的 node.exe 进程也不会使用超过 32MB 的内存。

所以我需要一个健全性检查;下面是我的代码。我真的在这里做一些愚蠢的事情吗?有没有办法让我分析应用程序以找出它实际使用了多少内存?

服务器端:

var express = require('express');
var http = require('http');

var app = express();
var server = http.createServer(app);

var io = require('socket.io').listen(server);

app.use(express.static(__dirname + '/public'));

io.configure(function() {
    io.set('resource', '/public/socket.io');
});

io.sockets.on('connection', function (socket) {
    socket.on('fromClient', function (data) {
    io.sockets.emit('fromServer', { who: data.who, message: data.message });
    });
});

server.listen(process.env.PORT || 8080);

客户端:

window.addEventListener("load", function () {

    var msgContainer = document.getElementById("msgContainer");
    var btnSend = document.getElementById("sendMessage");

    //this is my localhost, of course, substituted by my domain name on live
    var socket = io.connect('http://localhost:8080/', {
        resource: 'public/socket.io'
    });

    var theWho = document.getElementById("theWho");
    var newMessage = document.getElementById("newMessage");

    if (newMessage.addEventListener) {
        newMessage.addEventListener('keyup', newMessage_keyUp, false);
    } else if (btnSend.attachEvent) {
        newMessage.attachEvent('onkeyup', newMessage_keyUp);
    }

    function newMessage_keyUp(e) {
        if (e.keyCode == 13) {
            messageToServer();
        }
    }

    function messageToServer() {
        var who = theWho.value;
        var message = newMessage.value;
        if (who == "") {
            who = "Anon";
        }
        socket.emit("fromClient", {
            who: who,
            message: message
        });
        newMessage.value = "";
        newMessage.focus();
    }

    if (btnSend.addEventListener) {
        btnSend.addEventListener('click', messageToServer, false);
    } else if (btnSend.attachEvent) {
        btnSend.attachEvent('onclick', messageToServer);
    }

    socket.on('fromServer', function (data) {
        addMessage(data.who, data.message);
    });

    //THIS is what keeps firing ever ~2 minutes
    socket.on('connect', function () {
        socket.emit("fromClient", {
            who: "Server",
            message: "New user connected.."
        })
    })

    function addMessage(who, message) {
        var m = document.createElement("div");
        m.innerHTML = "<strong>" + who + ":</strong>&nbsp;" + message;
        m.setAttribute("class", "msg");
        msgContainer.appendChild(m);
        m.scrollIntoView();
    }
});
4

1 回答 1

0

您可以使用 iisnode-debug HTTP 响应标头获取有关使用 iisnode 部署的 Node.js 应用程序的大量诊断信息。以下是详细信息: http: //tomasz.janczuk.org/2012/11/diagnose-nodejs-apps-hosted-in-iis-with.html

特别是,使用 iisnode-debug 标头将使您能够检查 IIS 工作进程(运行 iisnode 本身)以及 node.exe 进程(运行 Node.js 应用程序)的内存消耗。它还报告 IIS 工作进程和 node.exe 的 PID,这将帮助您确定是否确实有任何进程被回收。

于 2013-12-18T19:14:27.623 回答