Hohe Next.js-Speichernutzung: So diagnostizieren Sie sie
Unterscheiden Sie zwischen einem teuren Build, einem Cache-Wachstum und einem Next.js-Speicherverlust. Messen Sie die Prozesse, reproduzieren Sie die Arbeitslast und überprüfen Sie Ihren Fix.
Es gibt keine einzelne RAM-Anforderung für jede Next.js-Anwendung. Eine statische Seite, ein sitzungsbasiertes Dashboard und eine Seite, die große Tabellen darstellt, führen unterschiedliche Aufgaben aus. Die monatlichen Besucherzahlen allein sagen wenig über den VPS aus, den Sie benötigen.
Eine bessere Frage ist, wie viel Speicher Ihre Anwendung mit ihren Abhängigkeiten, gleichzeitigen Spitzen und dem Bereitstellungsworkflow benötigt. Dieser Leitfaden erstellt dieses Budget und hält gleichzeitig die Kompilierung getrennt vom Server, der die Besucher verwaltet.
Ein Build transformiert den Quellcode und kann Seiten im Voraus generieren. Ein inaktiver Server behält seine Laufzeit und geladenen Module. Unter Last können mehrere Renderings, Netzwerkaufrufe und Antworten gleichzeitig aktiv sein. Messen Sie diese drei Zustände separat.
Wenn CI den Build durchführt, bestimmt sein Spitzenwert nicht direkt die Größe des Produktions-VPS. Wenn derselbe Server die Site erstellt und bereitstellt, planen Sie in diesem Zeitraum ein Budget für beide Server ein. Durch die Bereitstellungsüberschneidung zwischen einer alten und einer neuen Version wird ein weiteres Testszenario hinzugefügt.
Der JavaScript-Heap ist nur ein Teil des Node-Speichers. RSS umfasst residente Prozessseiten, einschließlich nativer Zuordnungen. Auf Linux verteilt PSS freigegebene Seiten proportional und ist beim Vergleich von Prozessbäumen nützlich.
Beobachten Sie bei einem Systemd-Dienst auch den cgroup-Speicher. Es deckt den Konzern mit einer eigenen Rechnungslegung ab, die sich von der PSS unterscheidet. Zeichnen Sie die Metrik auf und halten Sie sie zwischen den Läufen konsistent. Bei der alleinigen Messung eines Arbeiters werden die übergeordneten, anderen Arbeiter und nativen Komponenten nicht berücksichtigt.
systemctl show my-next-app.service -p MemoryCurrent -p MemoryPeak
ps -eo pid,ppid,rss,comm --sort=-rssBeobachten Sie ungenutzten Speicher, nachdem nach einigen Besuchen gemeinsame Pfade geladen wurden. Wenden Sie dann eine allmählich steigende Last auf eine dynamische Seite, einen API und Ihre teuren Routen an. Überprüfen Sie den Antwortinhalt: Eine einfache Fehlerseite kann einen beeindruckenden Durchsatz erzielen und gleichzeitig einen Fehler verbergen.
Zeichnen Sie Spitzenspeicher, Latenz, Fehler und Parallelität auf. Schließen Sie authentifizierten Datenverkehr ein, wenn die Anwendung von Sitzungen abhängig ist. Anonymer Homepage-Verkehr beschreibt möglicherweise kein Kunden-Dashboard. Eine kurze Laufzeit ist ein Ausgangspunkt, kein Beweis für Stabilität über Wochen hinweg.
Fügen Sie das Betriebssystem, den Proxy, alle Datenbanken, Anwendungen und Spielraum für Spitzen und Bereitstellungen hinzu. Verwenden Sie Messungen vom Zielserver oder einer repräsentativen Umgebung. Ein Speicherlimit schützt eine Grenze; es garantiert nicht genügend Platz für die Anwendung.
Hypothetisches Beispiel: Reservieren Sie ab 2,048 MiB 500 MiB für das System und die gemeinsamen Dienste, dann 400 MiB für Spitzen und Bereitstellungsüberschneidungen. Damit bleibt 1,148 MiB für Anwendungen übrig. Diese Werte veranschaulichen die Berechnung und stellen keinen Next.js-Mindestwert oder eine allgemeine Empfehlung dar. Ersetzen Sie sie durch Ihre Maße.
In unserer Kampagne „PRNext versus Next.js“ verwendet die normale SSR-Seite auf dem kleinen VPS 113.88 MiB PSS für PRNext und 101.38 MiB für Next.js. Mit dem Zwei-CPU-Budget auf der anderen Maschine lauten die Werte 117.50 und 173.30 MiB. Die Rangfolge hängt vom Kontext ab.
Diese Ergebnisse beschreiben einen identifizierten PRNext 0.1.18-alpha-Kandidaten, eine Fixture-Anwendung und kurze Fenster. Sie messen nicht Ihre Anwendung, ihren Build oder die endgültigen Release-Archive. Schlaf ist ein weiterer Zustand: Er gibt das Gedächtnis inaktiver Arbeiter frei und verursacht Aufwachkosten.
Genügend Arbeitsspeicher verhindert nicht, dass ein gesättigter CPU die Latenz erhöht. Mehr: CPU behebt keine beibehaltenen Objekte oder einen Mangel an Speicher in der Datenbank. Suchen Sie nach der Ressource, die sich verschlechtert, wenn die Anforderungen langsamer werden.
Wiederholen Sie den gleichen Arbeitsaufwand nach jeder Änderung. Wenn das Gedächtnis bei vergleichbarer Arbeit weiter wächst, ohne sich zu stabilisieren, untersuchen Sie die Beibehaltung. Wenn die Spitzen legitim sind, überdenken Sie den Ausführungsort der Builds, die Anzahl der Prozesse oder die verfügbare Kapazität.