Node.js的CPU密集型高负载的脚本转发数据从端口到端口
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
也使加载,似乎它正在打开新的分叉,进程…
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)
服务器配置:
- 为什么负载这么大?
- 我怎么能写代码不使加载?
- 为什么'cpulimit -l 10 nodejs proxy.js 55555 44444'不按预期工作?
- 为什么
node.js
使用CPU而不是RAM ?
谢谢你的建议
端口只是内存中的一个段,在端口上快速写入可能会加载CPU,因为它可能会创建太多的异步IO请求。尽管这些请求是IO绑定的,但是它们是间接的CPU绑定的。
为了避免这个问题,你可能不得不通过流数据来限制太多的连接请求。与其发送1000个小请求,不如发送100个大请求。
我不知道如何解决这个问题,也不知道到底发生了什么。可能是socket。IO与流可以帮助。
相关文章:
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 借助asp.net验证或java脚本对多个文本进行验证
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- Java脚本时间添加
- 不显示带有本地json文件数据的谷歌地图脚本
- JQuery添加元素需要在我的js之前再次添加JQuery脚本
- 从远程脚本获取用户IP
- 如何根据时间运行不同的脚本
- 如何将字符串值从php页面发送到java脚本页面
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- 当脚本由system.js加载时,如何要求('electron')
- HTML标记在脚本标记中工作
- 是否可以控制获取哪些Google地图脚本(JavaScript API)
- 使用谷歌应用程序脚本从工作表中获取值并将其显示在文本框中
- 显示时间的脚本
- ng应用程序使脚本无限运行
- 如何在运行时在angular 2中加载外部js脚本
- Google Adsense多次加载脚本
- Node.js的CPU密集型高负载的脚本转发数据从端口到端口