我在编写node.js
程序时遇到问题,该程序将流量从端口转发到另一个端口。场景是这样的。我将所有流量从端口55555
转发到在端口sshtunnel
上打开SOCKS5
的{{1}}。事情就是一切顺利,直到我运行命令44444
,当我正在同时访问2-3个站点时,我看到高负荷。如果我直接通过htop -d 1
,我会看到负载1%的核心,但是SOCKS5 SOCKS sshtunnel
我node.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
服务器配置:
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?感谢您的建议。
答案 0 :(得分:0)
端口只是内存中的一个段,在端口上快速写入可能会加载CPU,因为它可能会创建太多的异步IO请求。但是,这些请求即使它们是IO绑定也是间接CPU绑定的。
要避免此问题,您可能必须通过流数据限制太多连接请求。而不是发送1000个小请求,而是发出100个大请求。
我不确定如何解决这个或究竟发生了什么。可能是socket.io与流媒体可以帮助。