Ich habe das folgende Problem: Ein Programm hat einen Fehler wie den folgenden
int main() {
for(;;) {
char *p = (char*)std::malloc(1024);
std::memset(p, 1, 1024);
}
}
Und es reserviert so lange Speicher, bis mein System die Seiten anderer Anwendungen zugunsten dieses Programms austauscht und ich auf der Box nichts mehr tun kann. Ich habe dieses Problem mehrmals mit verschiedenen Anwendungen getroffen (heute war es mit Moonlight 2 Beta in Firefox). Ich denke, das Problem ist, dass das Programm dazu führt, dass der Speicher eines anderen Programms ausgelagert wird und daher mehr physischen Speicher benötigt.
Natürlich habe ich mir ulimit angeschaut und zwei Einstellungen gefunden
-m
Die maximale Größe
-v
der residenten Gruppe ist die Größe des virtuellen Speichers
Ich habe gelesen, dass der erste die gesamte physische Speichergröße angibt, die der Prozess auf einmal verwenden kann. Für mich scheint dies sinnvoller zu sein als die gesamte Größe des virtuellen Speichers, da er möglicherweise gemeinsam genutzt wird und überhaupt keine Bedeutung hat, da er ohnehin ausgetauscht wird. Also habe ich das Folgende zu meinem hinzugefügt, .bashrc
nachdem ich mir die gewohnten Resident-Set-Größen mit angesehen hatte top
, die für eine gewohnte Firefox-Sitzung bis zu etwa 120 MB reichen.
# limit usage to 256MB physical memory out of 1GB
ulimit -m 262144
Aber nach meinem obigen Test Schnipsel einsetzen, noch Brough mein System nach unten, und ich musste etwa 5 Minuten warten , bis das Terminal meine erkannten ^C
Taste drückt. Wenn ich in den ersten Sekunden nicht reagiere, kann ich in diesen Situationen normalerweise nur die Reset-Taste drücken, die mir nicht gefällt. Hat also jemand eine Strategie, wie man das löst? Warum funktioniert die körperliche Begrenzung nicht? Es scheint mir, dass auf diese Weise andere Anwendungen noch genügend physisches Gedächtnis haben sollten, um vernünftig zu reagieren.
-m
der Menge des physischen Speichers begrenzt ist, aber nicht die virtuelle. Der Prozess wird also vertauscht. Ich habe gelesen, dass nicht alle Varianten von Shell / Linux unterstützt werden-m
. Sie können überprüfen, was tatsächlich mitulimit -a
oder mitulimit -m
(ohne Parameter) eingestellt istIch denke, ulimit Implementierung saugt zufällig auf fast jedem Betriebssystem. Ich benutze ulimit -S -v unter Linux seit sechs Jahren. Sechs! Und es scheint, dass einige Kernel es nicht mehr unterstützen. Ich habe einen Mac und OS X 10.6 unterstützt ihn nicht. Ich habe es auch mit -m versucht. In meinem alten Desktop mit Ubuntu 9.04 funktioniert ulimit -S -v einwandfrei.
In der Tat bin ich auf der Suche nach einer echten Lösung dafür. Ich kann einfach nicht glauben, dass Leute in Apple beispielsweise zulassen, dass ihr Programm im Speicher verrückt wird.
quelle
Klassisches Speicherleck. Ich fürchte, Sie müssen die betreffende Anwendung bugfixen, das Betriebssystem kann nicht viel. Alles, was das Betriebssystem tun könnte, ist, den Speicher für eine Anwendung zu beschränken, aber dann würde die betreffende Anwendung abstürzen / segfault und möglicherweise das Betriebssystem oder zumindest xorg mitnehmen.
Sie könnten ld_preload eine andere Version von malloc und einen Thread hinzufügen, um es nach einer festgelegten Anzahl von Sekunden zu befreien. Ich bezweifle jedoch, dass es funktionieren würde ...
Sie benötigen dieses Tut: http://lattice.umiacs.umd.edu/files/functions_tr.pdf
quelle