Deaktivieren Sie das gesamte Festplatten-Caching für Apache2 unter Linux

7

Für Benchmarking-Zwecke möchte ich Apache 2 zwingen, jede angeforderte Datei von der Festplatte zu laden, anstatt sie aus einem Cache im Speicher zu laden. Nach dem, was ich gelesen habe, wird eine Synchronisierung durchgeführt, gefolgt von

echo 3 > /proc/sys/vm/drop_caches

Lass mich den Linux-Cache löschen. Eine nachfolgende Anforderung für eine bestimmte Datei wird dann nicht aus dem Linux-Cache bereitgestellt, aber weitere Anforderungen für dieselbe Datei werden erneut aus dem Linux-Cache bereitgestellt. Dies liegt daran, dass / proc / sys / vm / drop_caches das Caching nicht deaktiviert, sondern nur das verwirft, was bis zu diesem Moment zwischengespeichert wurde. Ich könnte den Cache wahrscheinlich vor jeder einzelnen Anfrage löschen, aber ich würde eine andere Lösung bevorzugen. Kann ich noch etwas tun, um sicherzustellen, dass Apache jede angeforderte Datei von der Festplatte lädt?

Warum ich das tun möchte : Ich weiß, dass im normalen Betrieb das Caching aktiviert ist. Der Server stellt jedoch keine kleinen Dateien bereit, auf die häufig zugegriffen wird, z. B. HTML-Seiten, kleine Bilder usw. Stattdessen werden Dateien bereitgestellt, die meist ein paar Megabyte groß sind und aus einem sehr großen Satz von Dateien stammen. Auf diese Dateien wird ziemlich einheitlich zugegriffen, und daher wird sehr selten auf jede einzelne Datei zugegriffen. Daher erwarte ich im normalen Betrieb, dass die meisten Zugriffe keinen Cache-Treffer verursachen, sondern dass die Datei von der Festplatte geladen werden muss. Ich habe mehrere Beispieldateien, auf die ich mit apaches ab zugreifen möchteBenchmark, um zu messen, wie viele Transaktionen pro Sekunde der Server bedienen kann. Leider glaube ich, dass die Ergebnisse, die ich erhalte, aufgrund von Caching viel zu optimistisch sind. Daher möchte ich das Festplatten-Caching von Linux deaktivieren, und das Zwischenspeichern von Apache kann sich von selbst erledigen.

Update: Die bisher gegebene Antwort sagt mir, wie ich Apaches eigenes Caching deaktivieren kann, aber ich frage mich immer noch, ob es eine Möglichkeit gibt, das vom Linux-Kernel durchgeführte Caching zu deaktivieren.

Davitenio
quelle
4
Was versuchst du zu testen? Disk Speed: Bonnie ist meiner Meinung nach viel besser, um das zu tun. Apache? Verwenden Sie Caches, im normalen Betrieb werden ohnehin Caches verwendet ...
Martin M.
Sie sollten auch das Feld Cache-Control: HTTP-Header ohne Cache berücksichtigen.
zero_r
Ich habe die Lösung für Ihr Problem auf superuser.com veröffentlicht: superuser.com/questions/242928/…
Robert Metzger
Bitte beziehen Sie sich auf diese Antwort: superuser.com/a/464382/106740 Es wird erklärt, wie Sie einen Linux-Prozess starten können, damit er den Kernel "fadvices", um das Zwischenspeichern der Dateien zu vermeiden!
Robert Metzger
Bitte setzen Sie Expires auf 0, http-Header ohne Cache und es wird reichen. Das Deaktivieren des Dateisystem-Cache unter Linux ist wahrscheinlich unmöglich, da zu viele Caches vorhanden sind. Sie sollten PageCache , Dentries und Inodes berücksichtigen , und wenn wir über OS-Cache sprechen, sollten Sie das SLAB-Caching irgendwie entfernen. Denken Sie daran, den Apache2-Inhalt mit "Sync" zu mounten. Warum würdest du das nochmal machen?
Wojciechz

Antworten:

7

Ich glaube nicht, dass Sie das gesamte Festplatten-Caching unter Linux deaktivieren können.

Als Hack können Sie weiterhin "sync; echo 3> / proc / sys / vm / drop_caches" ausführen, um fast alles zu löschen, was im Speicher zwischengespeichert ist. Von der Konsole

watch -n 1 `sync; echo 3 > /proc/sys/vm/drop_caches`

würde den Trick machen. Im obigen Beispiel bleibt nichts länger als eine Sekunde vom Kernel zwischengespeichert, obwohl dies keine Auswirkungen auf Daten hat, die von Apache oder anderen Prozessen im Speicher gespeichert werden. Es werden möglicherweise auch keine Inhalte aus Dateien mit Speicherzuordnung gelöscht, die noch geöffnet sind und Teile gesperrt haben.

Wenn Sie zu Beginn eines Testlaufs nur nichts zwischengespeichert haben möchten und es Ihnen egal ist, ob während der Tests Daten zwischengespeichert werden, können Sie "sync" und "echo 3> / proc / sys / vm" einfach einen einzelnen Aufruf hinzufügen / drop_caches "zu Beginn Ihres Testlaufs.

Wenn Ihr Test Skripte umfasst, die auf eine Datenbank zugreifen, müssen Sie Ihrem Datenbank-Back-End mitteilen können, dass zwischen den Tests auch keine Daten im RAM zwischengespeichert werden sollen.

David Spillett
quelle
Vergessen Sie nicht, dass das Laufwerk selbst bei deaktiviertem Betriebssystem-Cache über einen integrierten Cache verfügt.
David
Guter Punkt, dachte, der physische Festplatten-Cache ist kleiner (zwischen 2 MB und 32 MB in diesen Tagen) als der Betriebssystem-Cache, so dass es praktisch sein kann, einen Block mit Cache-Größe an einen Ort zu schreiben, an dem Sie diesen Cache nicht "leeren" möchten. Die meisten Laufwerke berücksichtigen die Anweisungen zum Deaktivieren des Schreibcaches von hdparm / sdparm, aber ich glaube nicht, dass Sie den physischen Cache vollständig deaktivieren können.
David Spillett
2

Sie können den Großteil des Caching in Apache deaktivieren, indem Sie das Modul mod_cache deaktivieren. Das Auskommentieren der folgenden Zeilen in Ihrer Konfiguration sollte den Trick tun:

  • LoadModule cache_module
  • LoadModule disk_cache_module
  • LoadModule mem_cache_module
David
quelle
Ich denke, er möchte das Festplatten-Caching auf Betriebssystemebene deaktivieren.
Jason Tan
Eigentlich möchte ich das Caching sowohl auf Betriebssystemebene als auch in Apache deaktivieren. Diese Antwort ist also hilfreich, da sie wahrscheinlich das Caching durch Apache deaktiviert. Aber ich frage mich, ob es eine Möglichkeit gibt, das Caching durch das Betriebssystem zu deaktivieren (/ proc / sys / vm / drop_caches lässt mich den Cache nur löschen, aber nicht deaktivieren)
davitenio
1

Nein, die Verwendung des Puffercaches kann nicht deaktiviert werden. Es gibt Möglichkeiten, dies programmgesteuert zu tun (z. B. Öffnen der Datei in O_DIRECT), aber Apache müsste dazu neu geschrieben werden.

Im Kern sieht es so aus, als würden Sie versuchen, Ihr E / A-Subsystem für mehrere Streaming-Megabyte-Dateien zu vergleichen. Es gibt viel bessere Möglichkeiten, dies zu tun, ohne den Overhead von Apache in das Bild zu mischen.

Wenn Sie entschlossen sind, dies zu versuchen, können Sie versuchen, ein kleines Programm zu schreiben, um den größten Teil des physischen Speichers auf dem Computer zu speichern, um den verfügbaren Festplatten-Cache zu reduzieren. Dies würde jedoch wahrscheinlich dazu führen, dass der Server Ihre Benchmark-Ergebnisse ruiniert (Apaches Multi Process) Modell wird schlecht mit diesem in Wechselwirkung treten , wenn Sie das set StartServers, MinServersund MaxServersauf den gleichen Wert zu vermeiden Prozesserstellung während der Benchmark -Durchlaufs)

Dave Cheney
quelle
0

Ich bin hier vielleicht furchtbar unpassend (also lassen Sie mich wissen, wenn ich eine falsche Annahme mache), aber das Zwischenspeichern von Datenträgern unter Linux wird als Swap bezeichnet und verwendet eine Swap-Datei oder eine Swap-Partition.

swapoff -a 

Sollte das Festplatten-Caching deaktivieren.

Matt Simmons
quelle
Ich denke, er bezieht sich auf die Aufbewahrung von festplattenbasierten Daten im RAM für den schnellen Zugriff (gemessen mehr oder weniger am Cache und puffert die Messwerte in "frei" oder "oben"), nicht auf Daten aus dem auf der Festplatte gespeicherten Speicher, weil es eine gab RAM-Mangel (dies ist die virtuelle Speicherfunktion, die Sie mit dem Befehl swappoff deaktivieren).
David Spillett
Beim Festplatten-Caching beziehe ich mich auf das Zwischenspeichern von Festplattenzugriffen im RAM, dh auf das Zwischenspeichern von Seiten im RAM, um unnötige Zugriffe auf die Festplatte zu vermeiden. Ich beziehe mich nicht auf das Austauschen, eine Technik zum Freigeben von RAM durch Speichern von Seiten auf der Festplatte.
Davitenio