【问题标题】:Response time from nodejs server with express on raspberry pi extremely slow来自 nodejs 服务器的响应时间与树莓派上的 express 非常慢
【发布时间】: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


【解决方案1】:

听起来您正在饿死 IO 绑定任务(负责发回响应的部分)。

服务器总是在后台做一些工作

什么样的工作?愿意分享一些代码吗?

查看setImmediate 或查看出色的async 库。

【讨论】:

  • 我基本上是从不同的网站抓取各种数据并将其保存在数据库中。由于我使用的是 http 请求和数据库操作,它应该主要是异步的,但我可以尝试将所有内容包装在异步调用中。您知道为什么我的 pi 上的差异与我的 pc 上的差异如此之大的原因吗?
  • 公平地说,您没有提供足够的详细信息来查明问题。分享一些代码。
  • 为什么要用jsdom?你在抓取数据吗?
  • 是的,我正在从网站解析数据并想使用 jquery
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 2019-01-18
  • 2023-03-29
  • 1970-01-01
  • 2013-08-19
  • 2014-04-05
  • 1970-01-01
相关资源
最近更新 更多