【问题标题】:Nodejs performance optimizationNodejs 性能优化
【发布时间】:2014-01-08 18:45:30
【问题描述】:

我是性能优化的新手,虽然我认识到 nodejs 可能不是对初学者最友好的起点,但它是手头的任务。

观察结果:简单的 JSON API 请求在没有负载且数据库中有

执行此代码:

exports.get_user = function(req, res) {
  return res.json(req.user)
}

(注意:我们将会话存储在 Redis 中)

堆栈:

  • Nodejs
  • 快递
  • Redis
  • 蒙古人

我从哪里开始?

【问题讨论】:

  • 你是如何初始化req.user的?
  • 这里确实没有足够的信息来猜测您遇到了什么问题。
  • 请指定您的服务(node、redis、mongo)的物理位置。提供一段实际执行的更大的代码。此外,通过在执行的脚本中添加 console.log(new Date()) 通常很容易识别耗时操作。
  • @jibsales 我应该提到我正在使用 Express / PassportJS(和猫鼬)。这是passport.deserializeUser:jsfiddle.net/Y2vJS
  • @igorpavlov 你问的是什么顺序 redis / mongo / 出现在 app.js / 请求在点击 export.get_user 之前遍历的其他中间件?

标签: node.js express redis connect node-redis


【解决方案1】:

虽然对于这种小场景来说这可能有点过头了,但您可能需要考虑进行分析。我发现 nodetime.com 服务非常有用。

【讨论】:

  • 我在节点时间的 /api/get_user 上运行了一个事务配置文件,得到了 12.9 毫秒:nodetime screenshot。但是对 chrome 开发工具的相同请求显示 607 毫秒:dev tools screenshot。由于 nodetime 只是测量 node 生成请求所需的时间,我是否应该假设差异是请求通过开放互联网传输所需的时间?
  • 是的,这是一个合理的假设。我不知道有关您的部署拓扑的详细信息。您的线路可能存在延迟,或者您可能只是在 dns 解析上花费时间。此外,您可能希望测量丢弃前几个请求的连续请求流,由于加载时间,这往往需要更长的时间。
  • 我发现 nginx 的 limit_req 指令限制性太强,导致大部分延迟。谢谢。
【解决方案2】:

传递–-nouse_idle_notification 标志将告诉V8 忽略来自Node 的空闲通知调用,这是对V8 要求它立即运行GC 的请求,因为Node 进程当前处于空闲状态。因为 Node 对这些调用很激进(效率会产生干净的状态),所以过多的 GC 可能会减慢您的应用程序。请注意,使用此标志不会禁用 GC; GC 只是运行频率较低。在适当的情况下,这种技术可以提高性能。

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 2016-05-14
    • 2011-10-17
    • 1970-01-01
    • 2017-06-02
    • 2013-03-31
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多