4 Stimmen

Was passiert, wenn bei eingestelltem mlockall der Speicherplatz ausgeht?

Ich arbeite an einer C++-Anwendung, die für einen Batch-Lauf eine große Menge an Speicher benötigt. (> 20gb)

Einige meiner Kunden stoßen an die Grenzen des Arbeitsspeichers, so dass das Betriebssystem manchmal mit dem Swapping beginnt und sich die Gesamtlaufzeit verdoppelt oder sogar noch schlimmer wird.

Ich habe gelesen, dass ich mlockall verwenden kann, um zu verhindern, dass der Prozess ausgelagert wird. Was würde passieren, wenn der Speicherbedarf des Prozesses den verfügbaren physischen Speicher auf diese Weise erreicht oder überschreitet?

Ich vermute, die Antwort könnte betriebssystemspezifisch sein, also geben Sie bitte das Betriebssystem in Ihrer Antwort an.

3voto

S.Skov Punkte 697

Was passieren würde, ist genau das, was Sie sehen - das Scheitern der Zuweisung von mehr Speicher, da Ihre Anwendung den gesamten physischen Speicher im System belegt hat und dieser nicht ausgelagert werden kann, kann malloc nichts anderes tun, als fehlzuschlagen. Dieses Verhalten ist bei den meisten modernen Betriebssystemen gleich.

Wenn Sie mlockall verwenden wollen (und das sollten Sie wirklich nicht), stellen Sie besser sicher, dass das System über die erforderliche Menge an physischem Speicher verfügt, sonst werden Sie in einer Welt des Schmerzes sein - malloc wird auch für andere Prozesse fehlschlagen und diese könnten Ihr System zum Absturz bringen.

0voto

jrockway Punkte 40754

Ich habe dies unter Linux ausprobiert. Nachdem ich mein "ulimit -l" (max locked pages) überschritten habe, schlägt malloc fehl.

Hier ist das Testskript:

#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv){
  int r = 0;
  int count = 0;
  char *buf;

  printf("Locking...\n");
  r = mlockall(MCL_FUTURE);
  if(r){
    printf("Error: %d\n", r);
    exit(1);
  }

  while(1){
    buf = malloc(1000);
    if(!buf){
      printf("Failed to allocate after %d iterations\n", count);
      exit(0);
    }
    count++;
  }

  return 0;
}

(Habe ich erwähnt, dass ich kein C-Programmierer bin?)

In der Dokumentation heißt es, dass dieses Verhalten "implementierungsabhängig" ist. Sie werden also wahrscheinlich Ihre eigene Implementierung testen müssen, um zu sehen, was passiert. Ich habe mein Skript ausgeführt, indem ich mich als Root angemeldet habe, das Limit für gesperrte Seiten auf 10000 gesetzt habe, von dieser Shell aus zu einem normalen Benutzer gewechselt bin und dann das Skript ausgeführt habe. Ich habe 10057 Zuweisungen durchgeführt, bevor malloc fehlschlug; und noch viel mehr ohne den mlockall-Aufruf.

0voto

vy32 Punkte 26016

In diesem Fall werden die Ressourcen Ihres Systems durch Ihre Anforderungen überschritten. Sie müssen Ihr System so umgestalten, dass es weniger Speicher benötigt.

Warum brauchen Sie 20 GB RAM? Das ist sehr ungewöhnlich. Ich habe einige Aufträge, die so groß sind. Normalerweise kann man sie in eine Reihe kleinerer Aufträge aufteilen und sie nacheinander oder gleichzeitig auf mehreren Rechnern ausführen.

Wenn Sie wirklich alle 20 GB gleichzeitig ausführen müssen, sollten Sie Ihren kleinen Datensatz verkleinern, damit mehr davon in den L2-Cache passt. Dadurch können Sie erhebliche Verbesserungen erzielen.

Was ist der Prozess, der 20 GB RAM benötigt? Ist es Ihr eigenes Programm oder etwas wie MySQL? In welcher Sprache ist es geschrieben? Ich konnte ein Programm in Python, das 4 GB Arbeitsspeicher benötigte, mit einer optimierten C++-Implementierung auf 500 MB Arbeitsspeicher reduzieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X