繁体   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