Node.js用于将数据从端口转发到端口

时间:2015-08-24 18:54:06

标签: javascript node.js

我在编写node.js程序时遇到问题,该程序将流量从端口转发到另一个端口。场景是这样的。我将所有流量从端口55555转发到在端口sshtunnel上打开SOCKS5的{​​{1}}。事情就是一切顺利,直到我运行命令44444,当我正在同时访问2-3个站点时,我看到高负荷。如果我直接通过htop -d 1,我会看到负载1%的核心,但是SOCKS5 SOCKS sshtunnelnode.js 22% 26% 60%有时甚至是70%。发生了什么事,这是为什么?我的意思是考虑当我打开那些会发生的事情的1000个时候!

这是我的第一次尝试(100%):

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

服务器配置:

  1. 为什么负载如此之大?
  2. 如何编写代码以免加载?
  3. 为什么'cpulimit -l 10 nodejs proxy.js 55555 44444'没有按预期工作?
  4. 为什么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) 使用的是CPU而不是RAM?
  5. 感谢您的建议。

1 个答案:

答案 0 :(得分:0)

端口只是内存中的一个段,在端口上快速写入可能会加载CPU,因为它可能会创建太多的异步IO请求。但是,这些请求即使它们是IO绑定也是间接CPU绑定的。

要避免此问题,您可能必须通过流数据限制太多连接请求。而不是发送1000个小请求,而是发出100个大请求。

我不确定如何解决这个或究竟发生了什么。可能是socket.io与流媒体可以帮助。