Seitenfehler, merkwürdiges Speicherverhalten und Seitendateien - insbesondere aber nicht speziell in R

775
bg49ag

Ich sollte von Anfang an sagen, ich weiß, dass ich wahrscheinlich mehr RAM verwenden könnte, da ich RStudio derzeit unter Windows 10 mit 4 GB RAM installiere. Der Beitrag ist auch nicht unbedingt nur auf R bezogen, sondern auf die gesamte Speicherkontrolle. Nach einem Neustart des Computers und des RStudio stehen je nach Task-Manager normalerweise 2 bis 2,5 GB "verfügbarer" RAM zur Verfügung.

Ein Teil meines Codes funktioniert einwandfrei (insbesondere wenn ich data.table verwende), auch wenn er viel rechnerisch arbeitet. Erzeugung von Kombinationen und Permutationen, relativ komplexe Joins. Andere Arbeiten werden 4 von 5 Mal fehlschlagen, mit etwas obskuren, scheinbar zufälligen Fehlern; Der Wert von SET_STRING_ELT () muss beispielsweise ein 'CHARSXP' sein.

Hierbei handelt es sich nicht um einen Code- oder Dateifehler oder um etwas besonders kompliziertes zu tun (nur das Öffnen von Dateien, das Anordnen einiger Felder, das Ausblenden von Großbuchstaben und das Zurückschreiben). Wenn ich dasselbe Stück Code ein paar Mal oder abschnittsweise erneut durchführe, funktioniert es möglicherweise mit dem einzigen bestimmenden Faktor, der anfangs scheinbar Glück ist.

Ich habe hier einige Muster identifiziert. Zum Beispiel scheint es zeitbezogen zu sein. Wenn ich die Abschnitte Stück für Stück von Hand ziehe und renne, funktioniert es. Beim Importieren von 10 MB-Dateien mit der Basis-R-Datei 'read.csv' werden Schleifen zusammen mit den rbindlist-Funktionen größerer Dateien ausgeführt. bis zum 'verfügbaren' RAM-Limit im Task-Manager. Aber wenn ich versuche, durch Basis-R 'read.csv'-Typ-Importe von 100 MB-Dateien zu schleifen, wird der Fehler angezeigt. Selbst wenn ich das Objekt explizit aus der Umgebung entferne, gc () sofort danach aufrufe, gibt es anscheinend> 10x so viel Nach Taskmanager ist RAM verfügbar, bei einem Neustart und mit absolut nichts anderem. Die einzige Lösung, die ich dafür fand, bestand darin, nach jedem Zyklus von gc () und 'read.csv' einen Systemschlaf von mindestens 10 Sekunden hinzuzufügen.

Ich hatte sowieso vor, ein Upgrade des Computers durchzuführen (mehr RAM kaufen), aber ich dachte, ich würde einige Nachforschungen über den Performance-Monitor durchführen, um einige Arbeiten auszuführen, um zu sehen, was den Computer eigentlich mit einem Flaschenhals beschäftigt (wenn man ihn höher kauft) Geschwindigkeits-RAM lohnt sich usw.); Der i3 4130t-Prozessor (einer von Intels billigsten) läuft selten über 50%, wobei alle vier logischen Daten offensichtlich ausgelastet sind (unter Verwendung von Microsoft MRAN R Open).

Bei einem abweichenden Code, der durch eine etwa 10 MB große UID-Tabelle und eine zweite Tabelle durchgeht, und bei den Ergebnissen des Leistungsmonitors ist mir aufgefallen, dass die Seitenfehler beim Klicken auf "Ausführen" stetig ansteigen. Es wird etwa 5000 / s hoch sein und der Systemcache sinkt ständig. Interessanterweise scheint dies auch der allmählichen Verlangsamung der Schleife zu entsprechen. Es dauert ein paar Minuten, um 5% der Einträge abzudecken. Aber nach ungefähr sechs Stunden, wenn ich zurück bin, ist es auf halbem Weg und krabbelt vorwärts, und jede geringfügige Störung führt dazu, dass R vollständig hängen bleibt. Ich habe auch häufig R selbst oder das gesamte Betriebssystem zurückgesetzt; Windows hat mich hilfreicherweise informiert, dass nach einem Blue Screen eine oder wenige Stunden nach dem Durchlauf ein Seitenfehler aufgetreten ist.

Es gibt möglicherweise einen verwandten Hinweis auf etwas Ähnliches im Plotly-Forum:

" Es scheint, als würde die Seitendatei ständig lesen / schreiben. Nach ungefähr 5 Minuten beträgt die CPU-Auslastung 20% ​​und die Anzahl der Seitenfehler ~ 15.000.000. Nach 10 Minuten 30% CPU-Auslastung und 65.000.000 Seitenfehler. "

Ich habe einen interessanten und hochgewählten Beitrag gelesen, den ich jetzt nicht finden kann (aber ich denke, er wurde hier veröffentlicht), in Bezug auf die Seitendatei, in der der Benutzer darauf hingewiesen hat, dass in Windows niemals wirklich "freier" RAM vorhanden ist. Es wird ständig präventiv gefüllt, die Dinge werden ausgelagert und dann ausgegeben, wenn etwas anderes Platz benötigt.

Es scheint einige extrem gemischte Meinungen darüber zu geben, ob die Auslagerungsdatei aktiviert werden soll oder nicht.

Ich habe sowohl die Aktivierung als auch die Deaktivierung versucht und sehe das gleiche Muster bei auftretenden Seitenfehlern.

Ich scheine im plottlichen Forum etwas Ähnliches wie Modidum zu beobachten. Obwohl für diese Aufgaben anscheinend mehr als genug RAM zur Verfügung steht, scheint R eine ganze Reihe von Dingen zu suchen.

Ich bin neugierig, ob dies möglicherweise mit der Priorisierung des Speichers in neueren Windows-Versionen zusammenhängt. Mir ist bewusst, dass ich die Priorität eines Prozesses im Task-Manager erhöhen kann. Erhöht dies jedoch die Priorität der Arbeitsspeicherzuordnung im Gegensatz zu nur der Priorität des Prozessorthreads? Gibt es überhaupt solche Prioritäten dauerhaft zu setzen, ohne proprietäre Software zu verwenden? Ich stelle fest, dass Windows versucht, durch präventives Zwischenspeichern im RAM zu helfen, jedoch scheint dies bei R überhaupt nicht zu helfen. Gibt es überhaupt eine Möglichkeit, das Caching-Profil selektiv zu erzwingen oder zu ändern? Für mehr speicherintensive Arbeit würde ich es vorziehen, wenn nichts zwischengespeichert wurde, das ich eigentlich nicht verwende.

Für alle, die neugierig auf die SSD sind, obwohl sie ziemlich viele Lese- / Schreibvorgänge in die Auslagerungsdatei ausgeführt haben und von R absichtlich viel aus dem Laufwerk lesen und darauf schreiben (Hunderttausende von Dateien gleichzeitig), deren Kapazität sättigt und anschließend gelöscht wird (und immer wieder sättigen) scheint die SSD selbst gut zu halten; Nach Kingstons Diagnosewerkzeug gibt es grundsätzlich auch nach Jahren keinen Fehler.

Danke fürs Klicken.

0
Die große Mehrheit (oft sehr große Mehrheit) der Seitenfehler hat nichts mit der Auslagerungsdatei zu tun. Normalerweise handelt es sich um Soft-Page-Fehler, die innerhalb des Speichers ohne Plattenzugriff behoben werden. Ich weiß nicht warum, aber einige Anwendungen produzieren oft eine Menge davon. LMiller7 vor 6 Jahren 1
Anstatt anderswo zu suchen, würde ich in den Programmcode schauen. Es gibt viele Gründe, warum fehlerhafte Codes zeitweise Probleme verursachen. LMiller7 vor 6 Jahren 1

1 Antwort auf die Frage

1
Robert Fischer

Bei einem abweichenden Code, der durch eine etwa 10 MB große UID-Tabelle und eine zweite Tabelle durchgeht, und bei den Ergebnissen des Leistungsmonitors ist mir aufgefallen, dass die Seitenfehler beim Klicken auf "Ausführen" stetig ansteigen. Es wird etwa 5000 / s hoch sein und der Systemcache sinkt ständig. Interessanterweise scheint dies auch der allmählichen Verlangsamung der Schleife zu entsprechen.

Ich bin kein Entwickler und kann Ihnen beim ersten Teil Ihrer Frage leider nicht helfen, aber als Ingenieur kann ich etwas Licht in die Hardware / Betriebssystem-Beziehung bringen.

Bitte haben Sie Verständnis dafür, dass es keine einfache Möglichkeit gibt, dies zu erklären, ohne zuerst tief in die grundlegenden Unterschiede (und Ähnlichkeiten) eines Betriebssystems und der Plattform-Hardware zu tauchen. Aber hier geht es:

Außerdem hilft es Ihnen zu wissen, dass die gesamte Plattform auf ihrer einfachsten Stufe aus einer langen Treppe mit Cache-Ebenen besteht, entweder physischer Cache für die CPU (L1, L2, L3, L4, RAM, Festplatte usw.) oder virtueller Cache Ebenen für Prozesse und OS Memory Mangler. (Privates Arbeitsset bearbeiten, Arbeitsset, Standby usw.).

Page-Fehler gibt es in zwei Ausführungen: weich und hart. Ein Soft- Page-Fehler tritt auf, wenn ein Prozess eine Seite anfordert, die sich nicht innerhalb seines Arbeitssatzes befindet, auch der für den Prozess verfügbare Adressbereich . Die Seite befindet sich normalerweise im RAM als Teil der "Standby" -Liste im Task-Manager (zwischengespeicherte Dateien).

Die Beschreibung Standby ist irreführend, da in Wirklichkeit alle von der CPU abgebildeten Seiten Teil des Systemarbeitssatzes sind. Sogar zwischengespeicherte Dateien.

Eine CPU kennt den Speicherort einer angeforderten Seite im primären (RAM) oder sekundären (HDD) Speicher - RAM oder der HDD (AKA-Cache-Level - sehen Sie?). Es kümmert sich um nichts anderes.

Die CPU bewegt die Seite nicht, sie bewegt den Zeiger.

Zusammengefasst: Ein Soft Fault ist ein Paging in den Prozessadressraum und aus diesem heraus - z. B. Working Set auf Standby und wieder zurück. Es ist jedoch kein wirklich großes Problem.

Ein Hard- Page-Fehler tritt auf, wenn sich die angeforderte Seite nicht im RAM, sondern in der Seiten-Datei der Festplatte befindet. Harte Seitenfehler treten nicht auf, wenn die Seitendatei (offensichtlich) deaktiviert ist.

Bei Softfehlern, wenn freier Speicher verfügbar ist, kann die Größe des Arbeitssatzes (Registrierung und Gruppenrichtlinienobjekt-Editor) und / oder RAM erhöht werden.

Ich habe einen interessanten und hochgewählten Beitrag gelesen, den ich jetzt nicht finden kann (aber ich denke, er wurde hier veröffentlicht), in Bezug auf die Seitendatei, in der der Benutzer darauf hingewiesen hat, dass in Windows niemals wirklich "freier" RAM vorhanden ist. Es wird ständig präventiv gefüllt, die Dinge werden ausgelagert und dann ausgegeben, wenn etwas anderes Platz benötigt.

Nicht wahr.

Für eine optimale Leistung sollte immer mindestens etwas freier Arbeitsspeicher vorhanden sein, damit die Seiten direkt vom Laufwerk eingelesen werden können. Andernfalls müssen Standby-Seiten zuerst verworfen und Seitentabellen aktualisiert werden. Das braucht Zeit.

Wenn es kein Free gibt, benötigt die Maschine mehr RAM.

Es scheint einige extrem gemischte Meinungen darüber zu geben, ob die Auslagerungsdatei aktiviert werden soll oder nicht.

Ich habe sowohl die Aktivierung als auch die Deaktivierung versucht und sehe das gleiche Muster bei auftretenden Seitenfehlern.

Die Seitendatei war für Intel IA-32e / Intel-64-Prozessoren mit 32-Bit-Adress-Pins erforderlich, um unter Windows x86 mit PAE oder Windows 64 RAM auszuführen.

Die Seitendatei war die einzige Möglichkeit, mit der diese CPUs Adressen von mehr als 4 GB erreichen konnten, was das Betriebssystem voll und ganz erreichen konnte.

Entgegen dem weit verbreiteten Mythos, PAE in dem O steht für Seite Address Extension NICHT Physical Address Extension. Mit der Seitenadresserweiterung können Adressen mit mehr als 4 GB vom Betriebssystem erreicht werden, vorausgesetzt, die CPU verfügt über interne 36-Bit-Register.

Wenn die Seitenadresserweiterung auf CPUs mit 32-Bit-Registern aktiviert ist, ist die Hölle los. 32/32 CPUs (32 externe Pins / 32 interne Register) können Adressen von bis zu 4 GB erreichen.

Edit: Ich habe weitere zufällige, aber relevante Punkte hinzugefügt, um das Gesamtbild klarer zu machen ... hoffentlich habe ich es nicht übertrieben.

E ** Hinweis: Früher habe ich IA-64 fälschlicherweise als x86-64 benannt. Ich sollte Intel-64 gelesen haben .

IA-64 ist x64.

** 32/36 (IA32e / Intel 64) Der AKA x86-64 kann Segmente mit mehr als 4 GB und 2x 4 GB ansprechen. Ein 4-GB-Segment ist RAM, das andere Segment ist die Auslagerungsdatei. Primär- und Sekundärspeicher. RAM ---> CPU: Externe Adresspins, CPU ------> HDD: Interne Datenregister.

Die 36-Bit-Seitenadresserweiterung reduziert den Prozessadressraum auf IA32e / Intel64 auf 3,5 GB, 512 MB sind für das CPU-Seitentabellenverzeichnis reserviert und die zusätzlichen 4 Bit für den Segmentverzeichniszeiger

Haben Sie sich jemals gefragt, warum mit x87 kompilierte Spiele nie mehr als 3,6 GB zu verwenden scheinen? Der Grund dafür ist, dass der Intel-Compiler Hochzeiger abschneidet. Die anderen ~ 512 MB sind als reserviert markiert. Auf 64-Bit-Hardware ist der Prozess für rund 500 MB VADs permanent als freier Speicherplatz gekennzeichnet.

Intel IA-32e / Intel-64 ist ansonsten als x86-64 bekannt. x86-64: Eine CPU mit 32 Pins zum RAM, die über interne Register und eine Auslagerungsdatei auf der Festplatte für Seiten 4 GB fähig ist.

Keines der oben genannten Probleme wirkt sich übrigens auf das RAM aus. Eine CPU mit 32 Pins kann nicht mit Speichermodulen mit einer Dichte von mehr als 4 GB kommunizieren. Dies ist eine Hardwarebeschränkung.
Es wäre, als würde man versuchen, einen Freund über ein Festnetz ohne Telefon anzurufen - nur ein Telefon. : P


Physical Address Extension ist eine Intel-CPU-Architektur-Nomenklatur, die sich auf die CPU-Adress-Pins im RAM bezieht. Das oben Gesagte ist in den Intel-Dokumenten eindeutig angegeben.

Die Seitendatei wurde auf CPUs mit 36-Bit-Adress-Pins noch nie benötigt. (AMD64 / IA64)

BTW, verwandte Artikel wie Wikipedia, Technet, MSDN usw., die sich auf Windows-Speichergrenzen und PAE beziehen, sind zum größten Teil völlig falsch oder irreführend.

Microsoft sind in dieser Hinsicht die schlimmsten Täter.

Ich bin neugierig, ob dies möglicherweise mit der Priorisierung des Speichers in neueren Windows-Versionen zusammenhängt. Mir ist bewusst, dass ich die Priorität eines Prozesses im Task-Manager erhöhen kann. Erhöht dies jedoch die Priorität der Arbeitsspeicherzuordnung im Gegensatz zu nur der Priorität des Prozessorthreads? Gibt es überhaupt solche Prioritäten dauerhaft zu setzen, ohne proprietäre Software zu verwenden? Ich stelle fest, dass Windows versucht, durch präventives Zwischenspeichern im RAM zu helfen, jedoch scheint dies bei R überhaupt nicht zu helfen. Gibt es überhaupt eine Möglichkeit, das Caching-Profil selektiv zu erzwingen oder zu ändern? Für mehr speicherintensive Arbeit würde ich es vorziehen, wenn nichts zwischengespeichert wurde, das ich eigentlich nicht verwende.

Es sollte so viel wie möglich zwischengespeichert werden

Ein großartiger Artikel, der viele Fehlinformationen entlarvt: Dateicache- Leistung und Optimierung .