部署到 Digital Ocean 的 Meteor 应用卡在 100% CPU 和 OOM

2024-04-19

我有一个使用 Meteor Up 部署到 Digital Ocean 的 Meteor (0.8.0) 应用程序,该应用程序一直卡在 100% CPU,只是因内存不足而崩溃,然后以 100% CPU 再次启动。过去24小时就这样卡住了。奇怪的是没有人在使用服务器,并且meteor.log 没有显示太多线索。我有 MongoHQ 和 oplog 数据库。

数字海洋规格:

1GB RAM 30GB SSD 磁盘纽约 2 Ubuntu 12.04.3 x64

显示问题的屏幕截图:

请注意,屏幕截图是昨天捕获的,它一直保持在 100% cpu 状态,直到内存不足而崩溃。日志显示:

致命错误:疏散分配失败 - 进程内存不足 错误:永远检测到的脚本被信号杀死:SIGABRT 错误: 永远重启脚本5次

顶部显示:

26308 流星 20 0 1573m 644m 4200 R 98.1 64.7 32:45.36 节点

它是如何开始的: 我有一个应用程序,它通过 csv 或 mailchimp oauth 接收电子邮件列表,通过批处理调用将它们发送给 fullcontacthttp://www.fullcontact.com/developer/docs/batch/ http://www.fullcontact.com/developer/docs/batch/然后根据响应状态相应地更新 Meteor 集合。 200 回复中的片段

if (result.statusCode === 200) {
            var data = JSON.parse(result.content);
            var rate_limit = result.headers['x-rate-limit-limit'];
            var rate_limit_remaining = result.headers['x-rate-limit-remaining'];
            var rate_limit_reset = result.headers['x-rate-limit-reset'];
            console.log(rate_limit);
            console.log(rate_limit_remaining);
            console.log(rate_limit_reset);
            _.each(data.responses, function(resp, key) {
                var email = key.split('=')[1];
                if (resp.status === 200) {
                    var sel = {
                        email: email,
                        listId: listId
                    };
                    Profiles.upsert({
                        email: email,
                        listId: listId
                    }, {
                        $set: sel
                    }, function(err, result) {
                        if (!err) {
                            console.log("Upsert ", result);
                            fullContactSave(resp, email, listId, Meteor.userId());                            
                        }
                    });
                    RawCsv.update({
                        email: email,
                        listId: listId
                    }, {
                        $set: {
                            processed: true,
                            status: 200,
                            updated_at: new Date().getTime()
                        }
                    }, {
                        multi: true
                    });
                }
                });
                }

在我本地运行 Vagrant 的 Windows 笔记本电脑上,一次处理数十万封电子邮件没有任何性能问题。但在 Digital Ocean 上,它似乎甚至无法处理 15,000(我见过 CPU 飙升至 100%,然后因 OOM 崩溃,但在它出现后通常会稳定下来......不是这次)。让我担心的是,尽管应用程序上没有/很少有活动,但服务器根本没有恢复。我通过查看分析验证了这一点 - GA 在 24 小时内总共显示了 9 个会话,除了点击 / 和弹跳之外几乎没有什么作用,MixPanel 在同一时间范围内仅显示 1 个登录用户(我)。自从最初的失败以来我所做的唯一一件事就是检查facts包,其中显示:

mongo-livedata 观察多路复用器 13 观察驱动程序-oplog 13

oplog-watchers 16 个观察句柄 15 个在查询阶段花费的时间

87828 FETCHING 阶段花费的时间 82 个实时数据

invalidation-crossbar-listeners 16 个订阅 11 个会话 1

Meteor APM 也没有显示任何异常情况,除了 OOM 和重新启动消息之外,meteor.log 没有显示任何流星活动。 MongoHQ 没有报告任何运行缓慢的查询或大量活动 - 0 查询、更新、插入、删除都来自盯着他们的监控仪表板。据我所知,24 小时内没有太多活动,当然也没有什么密集活动。此后,我尝试安装 newrelic 和 nodetime,但两者都不太有效 - newrelic 没有显示任何数据,并且meteor.log 有一条 nodetime 调试消息

加载 nodatime-native 扩展失败。

因此,当我尝试使用 nodetime 的 CPU 分析器时,它会显示空白,并且堆快照返回错误:未加载 V8 工具。

此时我基本上没有想法,而且由于 Node 对我来说还很陌生,感觉就像我在黑暗中进行疯狂的尝试。请帮忙。

Update:四天后服务器仍然保持在 100%。即使 init 6 也不会执行任何操作 - 服务器重新启动、节点进程启动并跳回到 100% cpu。我尝试了其他工具,如 memwatch 和 webkit-devtools-agent,但无法让它们与 Meteor 一起使用。

以下是 strace 输出

strace -c -p 6840

进程 6840 附加 - 中断退出

^CProcess 6840 已分离

% time 秒 usecs/call 调用错误 syscall


77.17 0.073108 1 113701 epoll_等待

11.15 0.010559 0 80106 39908 映射

6.66 0.006309 0 116907 读取

2.09 0.001982 0 84445 富泰克斯

1.49 0.001416 0 45176 写入

0.68 0.000646 0 119975 慕尼黑地图

0.58 0.000549 0 227402 时钟获取时间

0.10 0.000095 0 117617 rt_sigprocmask

0.04 0.000040 0 30471 epoll_ctl

0.03 0.000031 0 71428 gettimeofday

0.00 0.000000 0 36 m保护

0.00 0.000000 0 4 巴克


100.00 0.094735 1007268 39908 合计

所以看起来节点进程大部分时间都花在了epoll_wait上。


我有类似的问题。我不需要 Oplog,有人建议我添加 Meteor 包“disable-oplog”。于是我就这么做了,CPU占用率降低了很多。如果你并没有真正利用 Oplog,最好禁用它,所以也这样做meteor add disable-oplog看看会发生什么。

我希望这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

部署到 Digital Ocean 的 Meteor 应用卡在 100% CPU 和 OOM 的相关文章

随机推荐

  • 保持java套接字打开?

    我正在制作一个会自动更新的程序 游戏 我有更新部分 但没有检查版本 我本以为这会很容易 这就是我所做的 我为游戏编写了一个更新程序 并且编写了一个服务器 每次客户端 更新程序连接时 服务器都会启动一个线程 线程处理一切 游戏更新程序读取一个
  • Symfony 2 功能测试外部 URL

    无论我做什么 我总能得到一个 Symfony Component HttpKernel Exception NotFoundHttpException 否 已找到 的路线 in crawler gt text 当我尝试使用以下命令请求外部
  • 如何向 img 标签添加到期日期?

    我正在使用 Page Speed Firebug 扩展来帮助提高页面性能 我有一个包含大量图像的页面 它提出的建议之一是 利用浏览器缓存 以下可缓存资源的新鲜生命周期较短 指定以下资源至少在未来一周后到期 http www mysite c
  • 使用Jquery打印div内容

    我想使用 jQuery 打印 div 的内容 这个问题已经在 SO 中提出 但我找不到正确的 有效的 答案 这是我的 HTML div p This is a sample text for printing purpose p div
  • PostgreSQL 恢复后,我收到“关系 django_session 的权限被拒绝”

    我目前正在实时服务器和本地运行我的 Django 1 1 1 站点和 PostgreSQL 8 4 2 当我尝试从本地机器上的实时服务器恢复我的备份之一时 在本地访问我的站点时出现以下错误 http 本地主机 8000 http local
  • Nodejs 在异步上创建简单队列

    在下面的示例代码中 我可以同时运行多功能 Promise all sendMoneyToRequestedUser data saveTransferMoneyTransaction data then function results l
  • 如何在保存到数据库之前在JSP中转义html?

    我现在正在学习 JSP 和 Java 并写了一个 非常 简单的留言簿来开始使用 JSP 但我想确保没有人可以使用 CSS 因此我需要在将 HTML 代码保存到 mySQL 数据库之前删除它 我已经在这里搜索并找到了 PreparedStat
  • 更改 MVC 5 中的用户名 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在使用 ASP NET MVC5 和 Identity 2 0 测试版 用户可以更改用户名吗 我正在尝试使用 Use
  • IActionFilter 与 IResultFilter

    请解释一下 IActionFilter 和 IResultFilter 之间的区别 我了解 OnActionExecuting 发生在操作方法执行之前 OnActionExecuted 发生在操作方法执行之后 进一步了解执行操作方法意味着什
  • 如何让 firebase deploy --email 或 --token 参数起作用?

    我在使用这些 firebase 命令通过 firebase 部署 travis CI 时遇到问题 firebase deploy email FIREBASE USERNAME password FIREBASE PASSWORD fire
  • 通过javascript在html表格中动态添加一列

    我正在编写一个java脚本代码 它将在html中已经存在的表中动态附加一列复选框 我的 html 代码是这样的 table border 1 tr th Email id th th Em th tr table
  • QSignal Manager - 无法将多个信号连接到一个插槽

    我有 4 个 QLineEdits 和 4 个 QPushButtons 如果我单击 QPushButton 我想在相应的 QLineEdit 内设置一些文本 我想使用QSignalMapper来区分每个QButton及其对应的QLineE
  • 用于教育目的的公共 SQL 数据库

    我正在寻找一个可以免费访问的公开可用的 SQL 数据库 可以在其中运行一些SELECT免费查询一些有意义的数据 不是 item1 item2 item3 你见过吗 如果能附上一些教程就更好了 供应商并不那么重要 只要可以使用通用 JDBC
  • 复杂类型中的 XJC javaType 适配器

    我想让 XJC 在生成 bean 时在复杂类型中使用 javaType 标记 这是不允许的吗 我真的缺少好的文档和一些可以理解的错误消息 这是我正在尝试的操作 但失败并出现错误 编译器无法支持此转换自定义 它附加到错误的位置 或者与其他绑定
  • Django Rest Framework如何禁止用户更改用户名?

    我正在创造UserSerializer并希望允许用户创建新帐户但禁止他们更改用户名 有一个read only我可以应用该属性 但用户在创建新用户名时将无法设置用户名 但如果没有它 它允许我改变它 还有一个required不幸的是 该属性不能
  • Jquery 数据表主题隐藏页眉/页脚块

    我正在尝试删除该表的页眉 页脚块 Picture of what I am trying to remove 该表的Jquery代码 document ready function var oTable tableSmooth dataTa
  • 迭代器模式 - 错误 C2679:二进制 '<<':找不到采用 'std::string' 类型的右侧操作数的运算符 [重复]

    这个问题在这里已经有答案了 我正在尝试使用迭代器模式进行迭代和打印 但出现错误 这是错误 error C2679 binary lt lt no operator found which takes a right hand operand
  • C++11:如何使用 设置种子

    我正在练习随机库 这是 C 11 的新功能 我编写了以下最小程序 include
  • Angular 和 Sails 路由配置

    是否有任何 Sails js 或 Node 配置可以阻止 Angular 路由工作 无论我采取什么方法 除了 sails 的routes js 中的路线之外 每条路线都会返回 404 我尝试过 1 2 和 1 3 Angular 版本 并且
  • 部署到 Digital Ocean 的 Meteor 应用卡在 100% CPU 和 OOM

    我有一个使用 Meteor Up 部署到 Digital Ocean 的 Meteor 0 8 0 应用程序 该应用程序一直卡在 100 CPU 只是因内存不足而崩溃 然后以 100 CPU 再次启动 过去24小时就这样卡住了 奇怪的是没有