Ich habe ein verblüffendes Problem. Ich habe eine Bibliothek , die verwendet sg zur Ausführung angepasst CDB. Es gibt einige Systeme, die routinemäßig Probleme mit der Speicherzuweisung in sg haben . Normalerweise hat der SG- Treiber ein hartes Limit von ca. 4 MB, aber wir sehen es auf diesen wenigen Systemen mit ~ 2,3 MB Anfragen. Das heißt, die CDBs bereiten sich auf eine Übertragung von 2,3 MB vor. Hier sollte es keine Probleme geben: 2.3 <4.0.
Nun das Profil der Maschine. Es handelt sich um eine 64-Bit-CPU, auf der jedoch CentOS 6.0 32-Bit ausgeführt wird (ich habe sie weder erstellt noch habe ich etwas mit dieser Entscheidung zu tun). Die Kernel-Version für diese CentOS-Distribution ist 2.6.32. Sie haben 16 GB RAM.
Hier sehen Sie, wie die Speichernutzung auf dem System aussieht (da dieser Fehler während des automatisierten Tests auftritt, habe ich noch nicht überprüft, ob dies den Status widerspiegelt, in dem dieser Fehler von sg zurückgegeben wird ).
top - 00:54:46 up 5 days, 22:05, 1 user, load average: 0.00, 0.01, 0.21
Tasks: 297 total, 1 running, 296 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 15888480k total, 9460408k used, 6428072k free, 258280k buffers
Swap: 4194296k total, 0k used, 4194296k free, 8497424k cached
Ich habe diesen Artikel aus dem Linux Journal gefunden, in dem es um die Zuweisung von Speicher im Kernel geht. Der Artikel ist datiert, scheint sich aber auf 2.6 zu beziehen (einige Kommentare zum Autor an der Spitze). Der Artikel erwähnt, dass der Kernel auf ungefähr 1 GB Speicher begrenzt ist (obwohl es aus dem Text nicht ganz klar ist, ob diese jeweils 1 GB für physisch und virtuell oder insgesamt sind). Ich frage mich, ob dies eine genaue Aussage für 2.6.32 ist. Letztendlich frage ich mich, ob diese Systeme diese Grenze erreichen.
Obwohl dies keine wirkliche Antwort auf mein Problem ist, frage ich mich, ob die Behauptung für 2.6.32 wahr ist. Was ist dann die tatsächliche Speichergrenze für den Kernel? Dies muss möglicherweise bei der Fehlerbehebung berücksichtigt werden. Alle anderen Vorschläge sind willkommen. Was dies so verwirrend macht, ist, dass diese Systeme mit vielen anderen identisch sind, die nicht dasselbe Problem aufweisen.
quelle
Ich möchte ein wenig zu Warren Youngs hervorragender Antwort hinzufügen , weil die Dinge tatsächlich schlimmer sind, als er schreibt.
Der 1-GB-Kernel-Adressraum ist weiter in zwei Teile unterteilt. 128MB sind für
vmalloc
und 896MB fürlowmem
. Egal was es eigentlich bedeutet. Beim Zuweisen von Speicher muss der Kernel-Code auswählen, welche davon gewünscht werden. Sie können nicht einfach Speicher aus dem Pool abrufen, der über freien Speicherplatz verfügt.Wenn Sie
vmalloc
möchten, sind Sie auf 128 MB beschränkt. Jetzt sieht 1GB gar nicht so schlecht aus ...Wenn Sie
lowmem
möchten, sind Sie auf 896 MB beschränkt. Nicht so weit von 1 GB entfernt, aber in diesem Fall werden alle Zuweisungen auf die nächste Potenz von 2 aufgerundet. Eine Zuweisung von 2,3 MB verbraucht also tatsächlich 4 MB. Außerdem können Sie bei Verwendung von nicht mehr als 4 MB in einem Anruf zuweisenlowmem
.64-Bit ist wirklich die richtige Antwort.
quelle