[英]Node.js CPU intensive high load for a script that forwards data from port to port
我对编码将流量从端口转发到另一个的node.js
程序有问题。 场景是这样的。 我将所有流量从端口55555
转发到在端口44444
上打开了SOCKS5
的sshtunnel
。 事实是,一切正常进行,直到我运行命令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)
服务器配置:
node.js
使用CPU而不使用RAM? 感谢您的建议。
端口只是内存中的一个部分,在端口上快速写入可能会给CPU加载,因为它可能会创建过多的异步IO请求。 但是,即使这些请求受IO限制,也间接受CPU限制。
为避免此问题,您可能必须通过流数据限制过多的连接请求。 而不是发送1000个小请求,而是发出100个大请求。
我不确定如何解决这个问题或到底发生了什么。 可能对带流媒体的socket.io有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.