Node.js的CPU密集型高负载的脚本转发数据从端口到端口

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

本文关键字:转发 脚本 数据 负载 CPU js 密集型 高负载 Node      更新时间:2023-09-26

我有一个编码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也使加载,似乎它正在打开新的分叉,进程…

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与流可以帮助。