0

Express と Socket.IO を使用して単純なチャット アプリケーションを作成し、IISNode を使用するホスティング プロバイダーにセットアップしました。私が抱えている問題は、ソケット接続が約 2 分ごとに再接続し続けることです。これは、ソケット上でアクティビティがあるかどうかに関係なく発生します。

ホストの技術サポートから、私のアプリケーションは常に大量のメモリを使用すると言われました。これは私には非常にありそうにないようです。私の知る限り、各ドメインには 512MB のメモリが割り当てられています。彼らは、メモリが使い果たされるとアプリケーション プールがリサイクルされると私に言いました。これが、私のアプリが再接続し続ける理由です。私はこのコードを際限なくテストしました。これを開発マシンで実行しても、node.exe プロセスが 32 MB を超えるメモリを使用することはありません。

したがって、健全性チェックが必要です。以下は私のコードです。私は本当にここで愚かなことをしていますか?アプリケーションが実際に使用しているメモリの量を調べるために、アプリケーションをプロファイリングする方法はありますか?

サーバー側:

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 に答える