Ist es sinnvoll, um Cache-Daten aus einem Speicher erhalten mapped-Datei?
-
22-09-2019 - |
Frage
Oder es wäre schneller wieder lesen, dass die Daten von der kartierten Speicher wieder, da das Betriebssystem einen eigenen Cache implementieren könnte?
Die Art der Daten ist nicht im Voraus bekannt ist, wird angenommen, dass Datei liest zufällig ist.
Lösung
ich wollte ein paar Dinge erwähnen ich zu diesem Thema gelesen habe. Die Antwort lautet: nicht , Sie möchten nicht an zweiter Stelle erraten, der Speichermanager des Betriebssystems.
Das kommt zuerst von der Idee, dass Sie Ihr Programm mögen (z MongoDB, SQL Server) zu versuchen, Ihren Speicher zu begrenzen, basierend auf einem Prozentsatz des freien RAM:
Versuchen Sie nicht, Speicher zu reservieren, bis es nur x% frei
Gelegentlich wird ein Kunde für eine Art und Weise stellt ihr Programm so zu gestalten, es raubend RAM wird fortgesetzt, bis es nur x% frei. Die Idee ist, dass ihr Programm RAM aggressiv verwenden sollte, während noch genügend RAM verfügbar (x%) für eine andere Verwendung zu verlassen. Es sei denn, Sie ein System entwerfen, wo Sie das einzige Programm auf dem Computer ausgeführt wird, ist dies eine schlechte Idee.
(lesen Sie den Artikel für die Erklärung von Warum es ist schlecht, einschließlich der Bilder)
Als nächstes kommt von einigen Anmerkungen vom Autor von Lack und Reverse-Proxy:
Varnish Cache - Erläuterungen des Architekten
Was passiert also mit Tintenfische aufwendige Speicherverwaltung ist, dass es in Kämpfe bekommt mit der aufwendigen Speicherverwaltung Kern, und wie jeder Bürgerkrieg, das wird nie etwas getan.
Was passiert, ist dies: Squid erstellt ein HTTP-Objekt in „RAM“ und es wird einige Male schnell nach der Erstellung verwendet. Dann nach einiger Zeit bekommt es nicht mehr Hits und die Kernel merkt dies. Dann jemand versuchen Speicher aus dem Kernel für etwas zu bekommen, und der Kernel entscheidet, diese nicht genutzten Seiten des Speichers, um Auslagerungsspeicher verwenden (Cache-RAM) mehr sinnvoll für einige Daten zu schieben, die tatsächlich von einem Programm verwendet wird. Dies ist jedoch ohne Tintenfisch getan zu wissen, über sie. Squid noch denkt, dass diese http Objekte im RAM sind, und sie werden, die Sekunde versucht, auf sie zuzugreifen, aber bis dahin ist der RAM für etwas Produktives verwendet.
Stellen Sie sich vor Sie tun Cache etwas von einem Memory-Mapped-Datei. An einem gewissen Punkt in der Zukunft, dass der Speicher hält, dass „Cache“ wird auf der Festplatte ausgelagert werden.
- das Betriebssystem auf die Festplatte etwas geschrieben hat, die ist bereits vorhanden auf der Festplatte
Als nächstes kommt eine Zeit, wenn Sie eine Suche von Ihrem „Cache“ Speicher ausgeführt werden sollen, anstatt der „echte“ Speicher. Sie versuchen, den „Cache“ für den Zugriff auf und da es die Hardware-RAM aus wirft eine PAGE FAULT
getauscht wurde und Cache zurück in den RAM getauscht.
- Sie die Cache-Speicher ist nur so langsam wie das „echte“ Gedächtnis, da beide nicht mehr im RAM
Schließlich möchten Sie Ihren Cache befreien (vielleicht Ihr Programm wird heruntergefahren). Wenn die „Cache“ ausgelagert wird, muss das O tauscht sie zuerst in so zurück, dass sie befreit werden kann. Wenn stattdessen nur Sie Ihre Memory-Mapped-Datei nicht zugeordnete, alles ist weg (nichts geht, werden ausgelagert in).
- in diesem Fall Ihr Cache macht die Dinge langsamer
Auch von Raymon Chen: Wenn Ihre Anwendung ist zu schließen - in der Nähe bereits:
Wenn DLL_PROCESS_DETACH Sie sagt, dass der Prozess wird beendet, Ihre beste Wette ist einfach zurück, ohne etwas zu tun
Ich benutze regelmäßig ein Programm, das dieser Regel nicht folgen. Das Programm zuordnet vielen Speicher im Laufe ihres Lebens, und wenn ich das Programm beenden, es sitzt nur einige Minuten, manchmal bei 100% CPU Spinnen, manchmal die Festplatte am laufenden Band (manchmal beide). Als ich mit dem Debugger einbrechen, um zu sehen, was los ist, ich entdecken, dass das Programm nicht produktiv etwas zu tun. Es ist nur jeden letzten Byte von memor methodisch zu befreieny war es zugewiesen während seine Lebensdauer.
Wenn mein Computer nicht unter großem Speicherdruck, dann die meisten der Speicher das Programm während seiner Lebenszeit zugeteilt worden ist noch nicht ausgelagert, so jeden letzten Tropfen Speicherfreigabe ist ein CPU-bound Operation. Auf der anderen Seite, wenn ich einen Build gekickt oder getan hatte etwas anderes speicherintensiv, dann den größten Teil des Speichers das Programm während seiner Lebenszeit zugeteilt wurde ausgelagert, was bedeutet hätte, dass die Programmseiten alle, dass der Speicher wieder in von der Festplatte, nur so es könnte auf sie kostenlos anrufen. Art boshaft Sounds, eigentlich. "Kommen Sie Ich kann Ihnen hier so sagen gehen weg. "
Das alles anal-rententive Speicherverwaltung ist sinnlos. Der Prozess verlässt. Alles wird, dass Speicher freigegeben werden, wenn der Adressraum zerstört. Vergeuden Sie keine Zeit und nur bereits verlassen.
Die Realität ist, dass die Programme laufen nicht mehr in "RAM" , sie laufen in Speicher - < em> virtuelle Speicher.
Sie können make Verwendung eines Cache, aber Sie müssen Arbeit mit der virtuellen Speichermanager des Betriebssystems:
- Sie Ihren Cache zu halten, innerhalb von so wenigen Seiten wie möglich
- Sie sie im RAM bleiben, um sicherzustellen, durch die Tugend von ihnen eine Menge zugegriffen wird (das heißt eigentlich eine nützliche Cache ist)
Zugriff auf:
- tausend 1-Byte-Stellen um eine 400GB-Datei
ist viel teurer als der Zugriff auf
- eine einzige 1000-Byte-Stelle in einer 400-GB-Datei
Mit anderen Worten:. Sie nicht wirklich brauchen, um Cache Daten, die Sie benötigen eine lokalisierte Datenstruktur
Wenn Sie Ihre wichtigen Daten auf eine einzige 4k Seite beschränkt halten, werden Sie viel schöner mit dem VMM spielen; Windows- is Cache.
Wenn Sie 64-Byte-Quad-Wort ausgerichtet Cache-Zeilen hinzufügen, gibt es noch mehr Anreiz Ihre Datenstruktur Layout anzupassen. Aber dann wollen Sie nicht es zu kompakt, oder du wirst Leiden Leistungseinbußen von Cache-Flush von false-Sharing .
Andere Tipps
Die Antwort ist sehr OS-spezifisch. Im Allgemeinen wird es keinen Sinn, diese Daten in dem Caching. Sowohl die „Cache“ Daten sowie die Memory-Mapped können jederzeit ausgelagert entfernt werden.
Wenn es keinen Unterschied geben wird es spezifisch für ein Betriebssystem sein -. Es sei denn, Sie diese Granularität benötigen, gibt es keinen Sinn, die Daten in das Caching