webentwicklung-frage-antwort-db.com.de

vm / min_free_kbytes - Warum minimalen reservierten Speicher behalten?

Nach diesem Artikel :

/ proc/sys/vm/min_free_kbytes: Steuert die Menge an Speicher, die für die Verwendung durch spezielle Reserven freigehalten wird, einschließlich "atomarer" Zuordnungen (diejenigen, die nicht auf die Rückforderung warten können).

Meine Frage ist, was bedeutet das "diejenigen, die nicht auf die Rückforderung warten können"? Mit anderen Worten, ich möchte verstehen, warum das System angewiesen werden muss, immer eine bestimmte Mindestmenge an Arbeitsspeicher freizuhalten, und unter welchen Umständen wird dieser Arbeitsspeicher verwendet? [Es muss von etwas benutzt werden; sehe die Notwendigkeit nicht anders]

Meine zweite Frage: Führt die Einstellung dieses Speichers auf einen höheren Wert als 4 MB (auf meinem System) zu einer besseren Leistung? Wir haben einen Server, der gelegentlich eine sehr schlechte Shell-Leistung aufweist (z. B. dauert die Ausführung von ls -l 10-15 Sekunden), wenn bestimmte Prozesse in Gang kommen und wenn diese Zahl auf etwas höher gesetzt wird, führt dies zu einer besseren Shell-Leistung?

19
user3063877

(Link ist tot, sieht aus wie jetzt hier )

Dieser Text bezieht sich auf atomare Zuordnungen, bei denen es sich um Speicheranforderungen handelt, die erfüllt werden müssen, ohne die Kontrolle aufzugeben (d. H. Der aktuelle Thread kann nicht ausgesetzt werden). Dies geschieht am häufigsten in Interruptroutinen, gilt jedoch für alle Fälle, in denen Speicher benötigt wird, während eine wichtige Sperre gehalten wird. Diese Zuweisungen müssen sofort erfolgen, da Sie es sich nicht leisten können, darauf zu warten, dass der Swapper Speicherplatz freigibt.

Siehe Linux-MM für eine ausführlichere Erklärung, aber hier ist kurz der Speicherzuweisungsprozess:

  • _alloc_pages durchläuft zuerst jede Speicherzone und sucht nach der ersten, die in Frage kommende freie Seiten enthält
  • _alloc_pages aktiviert dann die kswapd-Task [..to ..] und greift auf die Reservespeicherpools zu, die für jede Zone verwaltet werden.
  • Wenn die Speicherzuweisung immer noch nicht erfolgreich ist, gibt _alloc pages entweder [..] auf In diesem Prozess führt _alloc_pages ein cond_resched () aus, das einen Ruhezustand verursachen kann, weshalb dieser Zweig verboten ist Zuordnungen mit GFP_ATOMIC .

es ist unwahrscheinlich, dass min_free_kbytes bei dem beschriebenen Befehl "ls -l braucht 10-15 Sekunden für die Ausführung" viel hilft. Dies wird wahrscheinlich eher durch allgemeinen Speicherdruck und -austausch als durch Erschöpfung der Zonen verursacht. Die Einstellung min_free_kbytes muss nur genügend freie Seiten für die Verarbeitung sofortiger Anforderungen zulassen. Sobald der normale Betrieb wieder aufgenommen wird, kann der Swapper-Prozess ausgeführt werden, um die Speicherbereiche neu auszugleichen. Das einzige Mal, dass ich min_free_kbytes erhöhen musste, war die Aktivierung von Jumbo-Frames auf einer Netzwerkkarte, die DMA-Streuung nicht unterstützte.

Um Ihre zweite Frage ein wenig zu erweitern, erzielen Sie bessere Ergebnisse bei der Optimierung von vm.swappiness und den in dem verlinkten Artikel erwähnten Dirty Ratios. Beachten Sie jedoch, dass die Optimierung für die Leistung "ls -l" dazu führen kann, dass andere Prozesse langsamer werden. Optimieren Sie niemals für einen nicht primären Verwendungszweck.

12
Arno

Alle Linux-Systeme versuchen, den gesamten für das System verfügbaren physischen Speicher zu nutzen, häufig durch die Erstellung eines Dateisystempufferspeichers, der einfach ein E/A-Puffer ist, um die Systemleistung zu verbessern. Technisch ist dieser Speicher nicht belegt, obwohl er für das Caching reserviert ist.

"Warten auf Rückforderung" bezieht sich in Ihrer Frage auf den Vorgang der Rückforderung des Cache-Speichers, der "nicht verwendet" wird, damit er einem Prozess zugewiesen werden kann. Dies soll transparent sein, aber in der realen Welt gibt es viele Prozesse, die nicht darauf warten, dass dieser Speicher verfügbar wird. Java ist ein gutes Beispiel, insbesondere wenn eine große minimale Heap-Größe festgelegt wurde. Der Prozess versucht, den Speicher zuzuweisen, und wenn er nicht sofort in einem großen zusammenhängenden (atomaren?) Block verfügbar ist, Der Prozess stirbt.

Reservierung einer bestimmten Speichermenge mit min_free_kbytes ermöglicht die sofortige Verfügbarkeit dieses Speichers und verringert den Speicherdruck, wenn neue Prozesse bei hoher Speicherauslastung und vollem Puffercache gestartet, ausgeführt und beendet werden müssen.

4 MB scheinen ziemlich niedrig zu sein, da bei vollem Puffer-Cache jeder Prozess, der eine sofortige Zuweisung von mehr als 4 MB wünscht, wahrscheinlich fehlschlagen wird. Die Einstellung ist sehr einstellbar und systemspezifisch, aber wenn Sie ein paar GB Speicher zur Verfügung haben, kann es nicht schaden, den Reservespeicher auf 128 MB zu erhöhen. Ich bin nicht sicher, welche Auswirkungen dies auf die Shell-Interaktivität haben wird, aber wahrscheinlich positiv.

7
Shaun Dewberry

Dieser Speicher wird von normalen Prozessen nicht verwendet. Wie @Arno bereits erwähnt hat, umfassen die speziellen Prozesse, die ausgeführt werden können, Interruptroutinen, die jetzt ausgeführt werden müssen (da es sich um einen Interrupt handelt) und beendet werden müssen, bevor andere Prozesse ausgeführt werden können (atomar). Dies kann beispielsweise das Auslagern von Speicher auf die Festplatte umfassen, wenn der Speicher voll ist.

Wenn der Speicher voll ist, wird ein Interrupt-Prozess (Speicherverwaltung) ausgeführt, um einen Teil des Speichers auf die Festplatte zu übertragen, sodass ein Teil des Speichers für die Verwendung durch normale Prozesse freigegeben werden kann. Aber wenn vm.min_free_kbytes Zu klein ist, um ausgeführt zu werden, blockiert es das System. Dies liegt daran, dass dieser Interrupt-Prozess zuerst ausgeführt werden muss, um Speicher freizugeben, damit andere ausgeführt werden können. Dann bleibt er jedoch hängen, da nicht genügend reservierter Speicher vm.min_free_kbytes Für die Ausführung seiner Aufgabe vorhanden ist, was zu einem Deadlock führt.

Siehe auch:

6
pd12