部署到Digital Ocean的Meteor应用程序停留在100%CPU和OOM上

时间:2014-04-18 17:15:09

标签: node.js ubuntu meteor ubuntu-12.04 digital-ocean

我有一个Meteor(0.8.0)应用程序使用Meteor Up to Digital Ocean进行部署,该应用程序一直停留在100%CPU,只是因内存不足而崩溃,并以100%CPU再次启动。在过去的24小时里,它一直像这样被困住了。奇怪的部分是没有人使用服务器和meteor.log没有显示很多线索。我已经为MongoHQ提供了数据库的oplog。

数字海洋规格:

1GB Ram 30GB SSD Disk New York 2 Ubuntu 12.04.3 x64

屏幕截图显示问题:

enter image description here

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

  

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

热门显示:

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

如何开始: 我有一个应用程序通过csv或mailchimp oauth接收电子邮件列表,通过批处理调用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的wimpy Windows笔记本电脑上,我没有任何性能问题,无论何时处理数十万封电子邮件。但是在数字海洋上,它似乎甚至无法处理15,000(我已经看到CPU飙升至100%然后与OOM崩溃,但在它出现之后它通常会稳定......不是这次) 。令我担心的是,尽管应用程序没有/很少活动,服务器根本没有恢复。我通过查看分析来验证这一点 - GA在24小时内总共显示9个会话,而不仅仅是点击/弹跳,MixPanel在同一时间段内仅显示1个登录用户(我)。我从最初的失败以来唯一做的就是检查facts包,其中显示:

  

mongo-livedata observe-multiplexers 13 observe-drivers-oplog 13

     

oplog-watchers 16观察 - 处理15个花在查询阶段的时间

     

87828在FETCHING-phase 82期间花费的时间

     

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

Meteor APM也没有显示任何异常,meteor.log不会显示除OOM以外的任何流星活动并重新启动消息。 MongoHQ不会报告任何运行缓慢的查询或大量活动 - 平均0次查询,更新,插入,删除它们的监控仪表板。据我所知,24小时内没有多少活动,当然也没有什么密集的。我已经尝试安装newrelic和nodetime但是两者都没有工作 - newrelic显示没有数据,meteor.log有一个nodetime调试消息

加载的nodetime-native扩展失败。

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

此时我基本上没有想法,因为Node对我来说很新,感觉就像我在黑暗中采取疯狂的刺。请帮忙。

更新:四天后,服务器仍然以100%挂钩。即使是init 6也没有做任何事情 - 服务器重启,节点进程启动并跳回到100%cpu。我尝试了其他工具,如memwatch和webkit-devtools-agent,但无法让它们与Meteor合作。

以下是strace输出

  

strace -c -p 6840

     

附加过程6840 - 中断退出

     

^ CProcess 6840分离

     

%time seconds usecs / call calls errors syscall

     
     

77.17 0.073108 1 113701 epoll_wait

     

11.15 0.010559 0 80106 39908 mmap

     

6.66 0.006309 0 116907阅读

     

2.09 0.001982 0 84445 futex

     

1.49 0.001416 0 45176写

     

0.68 0.000646 0 119975 munmap

     

0.58 0.000549 0 227402 clock_gettime

     

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 mprotect

     

0.00 0.000000 0 4 brk

     
     

100.00 0.094735 1007268 39908总计

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

3 个答案:

答案 0 :(得分:2)

我有类似的问题。我不需要Oplog,我被建议添加meteor包" disable-oplog"。所以我做了,CPU使用率大大降低了。如果您没有真正利用Oplog,最好禁用它,所以meteor add disable-oplog并看看会发生什么。

我希望这会有所帮助。

答案 1 :(得分:0)

- 你在使用Meteor-up吗? 我也用纽约2

在我的本地环境中,使用ubuntu服务器虚拟盒只能使用512 Mb和1 Core。

我在DigitalOcean 4 Gb RAM,2核VPS + Meteorup(当然还有我的应用程序)上遇到了同样的问题。

LOCAL ENVIROMENT on virtualbox - 1 CORE - 512 MB - New York 2 - ubuntu 14.04 x86.
-------------------------------------
>Meteor.js = 0.8.0,
>Node = 0.10.26,
>MongoDB shell version = 2.4.10,

>%CPU = 20.8 avg,
>%MEM = 27.4 avg

DIGITALOCEAN 4 GB RAM - 2 CPUS - ubuntu 14.04 x64.
-------------------------------------
>Meteor.js = 0.8.0,
>Node = 0.10.26,
>MongoDB shell version = 2.4.10,

>%CPU = 101.8 avg,
>%MEM = 27.4 avg

> PID meteoru+  20   0 1644244 796692   6228 R **102.2** **32.7**  84:47.08 node 

此外,我的应用程序做了类似你的应用程序。我在大气层使用CFS包,而node-csv用来读取我上传的CSV。上传效果很好,node-csv工作得很好....但我可以确认你是否有问题,似乎是在DigitalOcean上运行的NODE。     我的MongoDB也很棒......

答案 2 :(得分:0)

我是 VPS 新手,我尝试做的第一件事就是运行我的脚本。问题是我用 nodepm2 启动了同一台服务器几次。

解决方案

  1. 运行 pm2 kill 以终止进程管理器运行的所有进程
  2. run killall node - 如果还有剩余,则终止所有正在运行的进程
  3. 运行 pm2 start <your_server>.js - 再次运行您的服务器