簡體   English   中英

Node.js CPU密集型高負載的腳本,用於從端口到端口轉發數據

[英]Node.js CPU intensive high load for a script that forwards data from port to port

我對編碼將流量從端口轉發到另一個的node.js程序有問題。 場景是這樣的。 我將所有流量從端口55555轉發到在端口44444上打開了SOCKS5sshtunnel 事實是,一切正常進行,直到我運行命令htop -d 1並同時訪問2-3個站點時看到高負載。 如果我直接通過SOCKS5 SOCKS sshtunnel ,我看到的負載是內核的1%,但是使用node.js我的負載為22% 26% 60% 70%甚至100% 這是怎么回事? 我的意思是考慮一下當我像其中的1000個打開時會發生什么!!

這是我的第一次嘗試( proxy1.js ):

var net = require('net');
require('longjohn');


var regex = /^[\x09\x0A\x0D\x20-\x7E]+$/;
var regexIP = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/;

// parse "80" and "localhost:80" or even "42mEANINg-life.com:80"
var addrRegex = /^(([a-zA-Z\-\.0-9]+):)?(\d+)$/;

var addr = {
    from: addrRegex.exec(process.argv[2]),
    to: addrRegex.exec(process.argv[3])
};

if (!addr.from || !addr.to) {s=
    console.log('Usage: <from> <to>');
}

net.createServer(function(from) {
    var to = net.createConnection({
        host: addr.to[2],
        port: addr.to[3]
    });

    // REQUESTS BEGIN
    from.on('data', function(data){

    });

    from.on('end', function(end){

    });

    from.on('close', function(close){

    });

    // error handeling
    from.on('error', function(error)
    {

    });

    from.pipe(to);
    // REQUESTS END

    // RESPONSES BEGIN
    to.on('data', function(data){

    });

    to.on('end', function(end){

    });

    to.on('close', function(close){

    });

    to.on('error', function(error) 
    {

    });

    to.pipe(from);
    // RESPONSES END



}).listen(addr.from[3], addr.from[2]);

這是我的第二次嘗試( proxy2.js ):

var net = require('net');

var sourceport = 55555;
var destport = 62240;

net.createServer(function(s)
{
    var buff = "";
    var connected = false;
    var cli = net.createConnection(destport,"127.0.0.1");
    s.on('data', function(d) {
        if (connected)
        {
           cli.write(d);
        } else {
           buff += d.toString();
        }
    });

    s.on('error', function() {

    });

    cli.on('connect', function() {
        connected = true;
        cli.write(buff);
    });

    cli.on('error', function() {

    });

    cli.pipe(s);
}).listen(sourceport);

我還嘗試運行cpulimit -l 10 nodejs proxy.js 55555 44444也使負載增加,似乎它正在放棄新的fork,進程...

cat /etc/issue
Ubuntu 14.04.3 LTS

nodejs --version
    v0.10.25

processor
    Intel(R) Xeon(R) CPU E3-1246 v3 @ 3.50GHz with 8 cores

RAM
    32 RAM (that stays free all the time)

服務器配置:

  1. 為什么負載這么大?
  2. 我如何編寫代碼以免造成負擔?
  3. 為什么'cpulimit -l 10 nodejs proxy.js 55555 44444'無法按預期工作?
  4. 為什么node.js使用CPU而不使用RAM?

感謝您的建議。

端口只是內存中的一個部分,在端口上快速寫入可能會給CPU加載,因為它可能會創建過多的異步IO請求。 但是,即使這些請求受IO限制,也間接受CPU限制。

為避免此問題,您可能必須通過流數據限制過多的連接請求。 而不是發送1000個小請求,而是發出100個大請求。

我不確定如何解決這個問題或到底發生了什么。 可能對帶流媒體的socket.io有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM