Подтвердить что ты не робот

Приложение Meteor, развернутое в Digital Ocean, застряло на 100% процессоре и OOM

У меня есть приложение Meteor (0.8.0), развернутое с использованием Meteor до Digital Ocean, которое застряло на 100% -ном процессоре, только для того, чтобы потерпеть крах из-за нехватки памяти и снова запустить его на 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% процессорному процессу, пока он не сработает с нехваткой памяти. В журнале отображается:

FATAL ERROR: Сбой эвакуации - процесс из памяти ошибка: обнаружено навсегда script было убито сигналом: ошибка SIGABRT: Перезапуск script навсегда

Верхние дисплеи:

26308 meteorus 20 0 1573m 644m 4200 R 98,1 64,7 32: 45,36 node

Как это началось: У меня есть приложение, которое берет список писем через csv или mailchimp oauth, отправляет их в fullcontact через их пакетный вызов 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
                    });
                }
                });
                }

Локально на моем wimpy ноутбуке Windows, работающем с Vagrant, у меня нет проблем с производительностью, обрабатывающих сотни тысяч электронных писем за раз. Но на Digital Ocean он даже не может справиться с 15 000 (я видел всплеск процессора до 100%, а затем сбой с OOM, но после того, как он появляется, он обычно стабилизируется... не в этот раз). Меня беспокоит, что сервер не восстановился вообще, несмотря на отсутствие активности в приложении. Я проверил это, посмотрев на аналитику. GA показывает 9 сеансов в течение 24 часов, делая немного больше, чем удары/и подпрыгивая, MixPanel показывает только 1 зарегистрированный пользователь (меня) в тот же таймфрейм. И единственное, что я сделал с момента первого сбоя, - это проверить пакет facts, который показывает:

mongo-livingata наблюдения-мультиплексоры 13 наблюдение-драйверы-oplog 13

oplog-watchers 16 наблюдающих ручек 15 фаз, затраченных времени в QUERYING

87828 время, потраченное в FETCHING-фаза 82 прожиточное

invalidation-crossbar-listeners 16 подписки 11 сеансов 1

Meteor APM также не показывает ничего необычного, meteor.log не показывает никакой метеорной активности, кроме OOM, и перезапускает сообщения. MongoHQ не сообщает ни о медленных запросах, ни о многих действиях - 0 запросов, обновлений, вставок, удалений в avg, глядя на панель мониторинга. Насколько я могу судить, в течение 24 часов активности не было много, и, конечно же, не было ничего интенсивного. С тех пор я пытаюсь установить newrelic и nodetime, но ни один из них не работает - newrelic не показывает никаких данных, а meteor.log имеет сообщение об отладке nodetime

Не удалось загрузить расширенное расширение nodetime.

Поэтому, когда я пытаюсь использовать nodetime CPU profiler, он становится пустым, а моментальный снимок кучи возвращается с Ошибка: инструменты V8 не загружаются.

У меня в основном нет идей на данный момент, и поскольку Node для меня довольно новичок, мне кажется, что я нахожусь в тихих местах в темноте. Пожалуйста, помогите.

Обновление: сервер по-прежнему привязан к 100% через четыре дня. Даже init 6 ничего не делает - перезапускается сервер, процесс Node запускается и возвращается до 100% процессора. Я пробовал другие инструменты, такие как memwatch и webkit-devtools-agent, но не мог заставить их работать с Meteor.

Ниже приведен вывод strace

strace -c -p 6840

Процесс 6840 прилагается - прерывание для выхода

^ CProcess 6840 отсоединен

% времени секунды ошибки usecs/call calls 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 всего

Итак, похоже, что процесс Node проводит большую часть своего времени в epoll_wait.

4b9b3361

Ответ 1

У меня была аналогичная проблема. Мне не нужен Oplog, и мне предложили добавить метеорный пакет "disable-oplog". Так я и сделал, и использование ЦП было значительно сокращено. Если вы не используете Oplog, лучше отключить его, поэтому meteor add disable-oplog и посмотреть, что произойдет.

Надеюсь, это поможет.

Ответ 2

- Вы используете Meteor-up? Я также использую New York 2

В моей локальной среде с виртуальным ядром сервера ubuntu работает awsome с 512 МБ и 1 ядром.

У меня такая же проблема на DigitalOcean 4 Гб ОЗУ, 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 

Кроме того, мое приложение делает что-то вроде твоего. Im, используя пакет CFS из атмосферы и node -csv, чтобы прочитать CSV, который я загружаю. Загрузка работает отлично, а также node -csv отлично работает... но я могу подтвердить, если это проблема, она выглядит как NODE, работающая на DigitalOcean.   Мой MongoDB отлично работает и...