[英]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.