我有一个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
屏幕截图显示问题:
请注意,屏幕截图是昨天捕获的,它一直保持在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上。
答案 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 新手,我尝试做的第一件事就是运行我的脚本。问题是我用 node 和 pm2 启动了同一台服务器几次。
解决方案
pm2 kill
以终止进程管理器运行的所有进程killall node
- 如果还有剩余,则终止所有正在运行的进程pm2 start <your_server>.js
- 再次运行您的服务器