【发布时间】:2017-03-06 18:12:01
【问题描述】:
TLDR; http 响应在树莓派上非常慢,在本地超级快
我有一个树莓派 3 和一个 nodejs 服务器,在我的本地网络上运行 express。
服务器总是在后台做一些工作,我做了一个rest api来检查进度。
当调用 get 时,服务器会向我发送一个带有脚本文件的 html 文件,该脚本会调用另一个 api 来获取原始数据并将其注入到 html 文件中。 (我这样做是为了不必在服务器上注入数据)
现在的问题是:当我在我的电脑上运行服务器时,一切都很快。但在我的覆盆子上,发送几乎空的 html + js + css 文件最多需要 10 秒。我检查了 cpu 和 ram 的使用情况,它总是在 50% 左右,所以这应该不是问题。
有人知道是什么原因造成的吗?
work.js
var db = require('./db.js');
var storeCollection;
var allowCollection;
var dbToClose;
module.exports.get = get;
function get(query, callback) {
db.connect(function(database){
storeCollection = database.collection(query+"store");
allowCollection = database.collection(query+"allow");
dbToClose = database;
getOne(query, 1, callback);
});
}
function getOne(query, page, callback) {
jsdom.env(searchurl + query + pageparam + page, function (err, window) {
if (err) {
console.error(err);
return;
}
var $ = jquery(window);
var resultlist = $("...");
var count = 0;
if(resultlist.length <= 0){
dbToClose.close();
callback("work");
}
for (var i = 0; i < resultlist.length; i++) {
var item = new Object();
//data parsing
if (item.link) {
item._id = new Buffer(item.link).toString('base64');
db.addOneIfAllowed(storeCollection,allowCollection,item,function(){
if(++count == resultlist.length){
getOne(query, ++page, callback);
}
});
} else{
dbToClose.close();
callback("work");
}
}
});
}
web.js
//rest api
...
//work
updateDatabase();
setInterval(updateDatabase, 60000 * 5);
function updateDatabase() {
timer.start();
db.connect(function (database) {
var persist = database.collection("persist");
persist.find({}).toArray(function (err, persisting) {
database.close();
persisting.forEach(function (q) {
persistAll(q._id);
});
});
});
}
function persistAll(q) {
var workcount = 0;
var time;
function finish(name) {
console.log("persisted "+name);
workcount++;
if (workcount == 6) {
console.log("done persisting");
}
}
time = Date.now();
work.get(q, finish);
otherwork.get(q,finish);
...
}
【问题讨论】:
-
采取更系统的方法来找出导致速度变慢的原因并不难。例如,当您完全禁用“后台”任务时,HTTP 请求是否更快?或者当你禁用它的一部分时(比如,数据库写入)?
-
@robertklep 没有数据库调用会快一点,但差别不大。我决定制作第二个 nodejs 服务器,它只处理 api 调用,它的工作就像一个魅力。
标签: node.js http express raspberry-pi raspberry-pi3