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

lan*_*and 13 ubuntu node.js meteor ubuntu-12.04 digital-ocean

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

数字海洋规格:

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

截图显示问题:

在此输入图像描述

请注意,屏幕截图是昨天捕获的,并且它一直保持在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
                    });
                }
                });
                }
Run Code Online (Sandbox Code Playgroud)

在我运行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秒usecs/call calls错误系统调用


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上.

cri*_*ley 0

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

在我的本地环境中,ubuntu 服务器虚拟机仅 512 Mb 和 1 个核心即可正常工作。

我在 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 
Run Code Online (Sandbox Code Playgroud)

另外,我的应用程序做了类似你的事情。我使用大气中的CFS包和 node-csv 来读取我上传的 CSV。上传效果很好,node-csv 也很好......但我可以向你确认这是否是问题所在,它似乎是在 DigitalOcean 上运行的 NODE。我的 MongoDB 也运行得很好...