2014-04-18 8 views
13

Ich habe eine Meteor (0.8.0) App mit Meteor bis Digital Ocean eingesetzt, die bei 100% CPU stecken geblieben ist, nur mit nicht genügend Arbeitsspeicher abstürzen, und bei 100% CPU neu starten. Es ist so in den letzten 24 Stunden festgefahren. Der komische Teil ist, dass niemand den Server benutzt und meteor.log zeigt nicht viele Hinweise. Ich habe MongoHQ mit oplog für die Datenbank.Meteor App auf Digital Ocean bei 100% CPU und OOM stecken

Digital-Ozean-Spezifikationen:

1GB Ram 30GB SSD Festplatte in New York 2 Ubuntu 12.04.3 x64

Screenshot zeigt Ausgabe:

enter image description here

Beachten Sie, dass der Screenshot erfasst wurde gestern und Es ist bei 100% CPU geblieben, bis es mit nicht genügend Speicher abstürzt. Das Protokoll zeigt:

FATAL ERROR: Evacuation Allocation failed - process out of memory error: Forever detected script was killed by signal: SIGABRT error: Forever restarting script for 5 time

Top-Displays:

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

Wie es begann: Ich habe eine Anwendung, die in nimmt eine Liste von E-Mails über csv oder mailchimp oauth, sendet sie über ihren Batch-Prozess-Aufruf http://www.fullcontact.com/developer/docs/batch/ an fullcontact und aktualisiert dann die Meteor-Sammlungen entsprechend des Antwortstatus. Ein Ausschnitt aus einer 200-Antwort

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 
        }); 
       } 
       }); 
       } 

Lokalen auf meinem wimpy Windows-Laptop Vagrant läuft, habe ich keine Performance-Probleme auch immer Hunderttausende von E-Mail zu einem Zeitpunkt, zu verarbeiten. Aber auf Digital Ocean kann es nicht einmal mit 15.000 umgehen, wie es scheint (ich habe den CPU-Spike zu 100% gesehen und stürze dann mit OOM ab, aber nachdem er aufkommt, stabilisiert er sich normalerweise ... diesmal nicht). Was mich beunruhigt ist, dass der Server sich trotz wenig/keiner Aktivität in der App überhaupt nicht erholt hat. Ich habe dies überprüft, indem ich mich mit Analytics befasst habe - GA zeigt 9 Sessions insgesamt über die 24 Stunden, die wenig mehr als das Schlagen und Bouncen machen, MixPanel zeigt nur einen angemeldeten Benutzer (mich) im selben Zeitraum. Und das einzige, was ich seit dem ersten Ausfall getan haben, ist überprüfen Sie die facts-Paket, das zeigt:

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

oplog-watchers 16 observe-handles 15 time-spent-in-QUERYING-phase

87828 time-spent-in-FETCHING-phase 82 livedata

invalidation-crossbar-listeners 16 subscriptions 11 sessions 1

Meteor APM auch nichts angezeigt aus dem Üblichen, die meteor.log zeigt keine Meteor-Aktivität neben dem OOM und Neustart Nachrichten. MongoHQ meldet keine langsame Abfragen oder viel Aktivität - 0 Abfragen, Updates, Einfügungen, löscht auf AVG aus dem Monitoring-Dashboard anstarren. Soweit ich das beurteilen kann, gab es seit 24 Stunden nicht viel Aktivität und schon gar nichts Intensives. Ich habe seitdem versucht Newrelic und Nodetime zu installieren, aber keine funktioniert ganz - newrelic zeigt keine Daten und die meteor.log hat eine Nodetime Debug-Nachricht

Failed geladen nodetime-native Erweiterung.

Wenn ich versuche, den CPU-Profiler von nodetime zu verwenden, wird er leer angezeigt und der Heap-Snapshot wird mit zurückgegeben. Fehler: V8-Tools werden nicht geladen.

Ich bin an dieser Stelle im Grunde von Ideen, und da Node mir ziemlich neu ist, fühlt es sich an, als würde ich hier im Dunkeln wilde Stiche nehmen. Bitte helfen Sie.

Aktualisieren: Der Server ist vier Tage später immer noch mit 100% verbunden. Selbst ein init 6 tut nichts - Server startet neu, Knotenprozess startet und springt auf 100% CPU zurück. Ich habe andere Tools wie memwatch und webkit-devtools-agent ausprobiert, konnte sie aber nicht dazu bringen, mit Meteor zu arbeiten.

Im Folgenden ist der Strace Ausgang

strace -c -p 6840

Process 6840 attached - interrupt to quit

^CProcess 6840 detached

% 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 read

2.09 0.001982 0 84445 futex

1.49 0.001416 0 45176 write

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 total

So sieht es aus wie der Knoten Prozess die meiste Zeit in epoll_wait verbringt.

+0

Meteor ist mir nicht bekannt, aber Sie verwenden _.each, um Ergebnisse zu iterieren und asynchrone I/O für eine potentiell große Sammlung von Elementen auszuführen. Das heißt, wenn Sie 15.000 Elemente haben, wird versucht, alle 15.000 Upserts usw. gleichzeitig zu schreiben. Sie sollten es mit async.eachLimit oder ähnlichem versuchen. – eshortie

Antwort

2

Ich hatte ein ähnliches Problem. Ich brauchte Oplog nicht und ich wurde vorgeschlagen, das Meteor-Paket "disable-oplog" hinzuzufügen. Also tat ich es, und die CPU-Auslastung wurde stark reduziert. Wenn Sie Oplog nicht wirklich nutzen, ist es vielleicht besser, es zu deaktivieren, also tun Sie meteor add disable-oplog und sehen, was passiert.

Ich hoffe, das hilft.

Verwandte Themen