Frage

Unser Service neigt während der Nächte auf unserer Kunden-Server, und dann haben eine harte Zeit aufzuwachen, einzuschlafen. Was zu geschehen scheint, ist, dass der Prozess Haufen, die manchmal mehrere hundert MB ist, um die Auslagerungsdatei verschoben wird. Dies geschieht in der Nacht, wenn unser Service nicht verwendet wird, und andere sind geplant zu laufen (DB Backups, AV-Scans usw.). Wenn dies geschieht, nach ein paar Stunden der Inaktivität in den Dienst der erste Anruf dauert ein paar Minuten (daraus folgenden Anrufe nehmen Sekunden).

Ich bin ziemlich sicher, es ist eine Frage der virtuellen Speicherverwaltung, und ich hasse es wirklich die Idee, das O zu zwingen, unseren Service in dem physischen Speicher zu halten. Ich weiß zu tun, dass andere Prozesse auf dem Server verletzt und verringern den Gesamt Server Durchsatz. das gesagt zu haben, unsere Kunden wollen nur unsere App zu reagieren. Es kümmert sich nicht, wenn jede Nacht Jobs länger dauern.

Ich erinnere mich vage, es gibt einen Weg, um Windows zu zwingen Seiten im physischen Speicher zu halten, aber ich hasse es, diese Idee. Ich bin Neigung mehr zu einer gewissen internen oder externen Watchdog, die auf höherer Ebene Funktionalitäten einleitet (es gibt bereits einige interne Scheduler, der sehr wenig tut, und macht keinen Unterschied). Gäbe es ein 3rd-Party-Tool, das diese Art von Dienstleistung erbracht wird, nur so gut gewesen wäre.

Ich würde gerne alle Kommentare hören, Empfehlungen und gemeinsame Lösungen für diese Art von Problem. Der Dienst wird in VC2005 geschrieben und läuft auf Windows-Servern.

War es hilfreich?

Lösung

Wie Sie erwähnt hat, zwingt die App im Speicher zu bleiben ist nicht der beste Weg, Ressourcen auf der Maschine zu teilen. Eine schnelle Lösung, die Sie feststellen, dass vielleicht gut funktioniert, ist einfach ein Event zu planen, die Ihren Dienst wacht jeden Morgen zu einer bestimmten Zeit, bevor Ihre Kunden beginnen, es zu benutzen. Sie können es einfach in die mit einem einfachen Skript oder EXE Anruf Windows-Taskplaner planen.

Andere Tipps

Ich sage nicht, dass Sie dies tun wollen, oder dass es am besten Praxis ist, aber man kann es funktioniert gut genug für Sie. Es scheint zu entsprechen, was Sie gefragt haben.

Zusammenfassung: Tippen Sie auf jede Seite in dem Prozess, auf Seite in einer Zeit, in regelmäßigen Abständen

.

Was ist mit einem Faden, der im Hintergrund läuft und einmal alle N Sekunden aufwacht. Jedes Mal, wenn die Seite aufwacht, versucht er, von der Adresse X. Der Versuch, zu lesen, mit einem Exception-Handler für den Fall geschützt Sie eine schlechte Adresse lesen. Dann X erhöhen, indem die Größe einer Seite.

Es gibt 65536 Seiten in 4 GB, 49.152 Seiten in 3 GB, 32.768 Seiten in 2 GB. Teilen Sie Ihre Leerlaufzeit (über Nacht Totzeit), wie oft Sie wollen (Versuch), um jede Seite zu schlagen.

BYTE *ptr;

ptr = NULL;
while(TRUE)
{
    __try
    {
        BYTE b;

        b = *ptr;
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        // ignore, some pages won't be accessible
    }

    ptr += sizeofVMPage;

    Sleep(N * 1000);
}

Sie können den sizeOfVMPage Wert aus dem dwPageSize Wert in dem zurückgegebenen Ergebnis von GetSystemInfo () erhalten.

Versuchen Sie nicht, den Exception-Handler zu vermeiden, indem Sie if (! IsBadReadPtr (ptr)), weil andere Threads in der App die gleichzeitig Speicherschutz modifiziert werden kann. Wenn Sie unstuck wird es fast unmöglich, weil dieser erhalten zu identifizieren, warum (es wird höchstwahrscheinlich eine nicht wiederholbare Race-Bedingung sein), so verschwenden Sie keine Zeit mit ihm.

Natürlich würden Sie wollen diesen Thread deaktivieren während des Tages und führen sie nur während der Totzeit.

Ein dritte Ansatz Ihren Dienst haben könnte einen Thread ausführen, die etwas trivial macht wie einen Zähler erhöht wird und schläft dann für einen längeren Zeitraum, etwa 10 Sekunden. Thios sollte auf andere Anwendungen nur minimale Auswirkungen haben, aber zumindest einige Ihrer Seiten zur Verfügung zu halten.

Die andere Sache, um sicherzustellen, dass Ihre Daten lokalisiert ist.

Mit anderen Worten: Sie braucht alle 300 MiB des Speichers wirklich, bevor Sie etwas tun können? Können die Datenstrukturen neu geordnet Sie verwenden werden, so dass eine bestimmte Anforderung mit nur wenigen Megabyte zufrieden sein könnte?

Zum Beispiel

  • , wenn Ihr 300 MiB des Heap-Speichers Gesichtserkennungsdaten enthält. Kann intern die Daten so angeordnet werden, dass männliche und weibliche Gesichtsdaten zusammen gespeichert werden? Oder big-Neins ist getrennt von kleinen Nasen?

  • , wenn es irgendeine Art von logischer Struktur hat kann sie sortiert? so dass eine binäre Suche kann eine Menge Seiten?

  • überspringen verwendet werden
  • , wenn es ein proprietärer, In-Memory-Datenbank-Engine, kann besser die Daten indexiert / gruppierten nicht so viele Speicherseitenzugriffe erfordern?

  • , wenn sie Bildtexturen sind, können in der Nähe von jedem anderen häufig verwendeten gelegen Texturen werden?

Sie benötigen alle 300 MiB des Speichers wirklich, bevor Sie etwas tun können? Sie können nicht warten, ohne Anfrage alle , die Daten wieder in Erinnerung?


Ansonsten:. geplante Aufgabe bei 6 ᴀᴍ es aufwacht

Im Hinblick auf die Kosten, die billigste und einfachste Lösung ist wahrscheinlich nur für diesen Server mehr RAM zu kaufen, und dann können Sie die Auslagerungsdatei vollständig deaktivieren. Wenn Sie mit 32-Bit-Windows, nur 4 GB RAM kaufen. Dann wird der gesamte Adressraum mit physikalischen Speicher unterstützt werden, und die Auslagerungsdatei wird nicht ohnehin etwas zu tun werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top