In meinem C++-Programm, in dem intensive Festplatten-, Netzwerk-E/A- und sogar CPU-Berechnungen stattfinden, verwende ich den speicherzugeordneten Bereich als Array.
Bei sehr kleinen Datenmengen funktioniert es einwandfrei. Wenn ich das Programm jedoch mit sehr großen Datenmengen ausführe, stürzt meine Anwendung ab. (Ich verstehe absolut, dass die Größe der mmap-Region kein Problem sein sollte, da das Betriebssystem sich um alle E/A-Vorgänge und Puffervorgänge kümmert.)
Ich möchte Linux nicht die Schuld dafür geben, aber ich würde gern wissen, ob es möglich ist, dass „mmap“ instabil wird und das Betriebssystem abstürzt?
Wenn das Betriebssystem abstürzt, sehe ich auf dem Bildschirm die Meldung „Kernel Panic“, die mit irgendeinem „Write_back“ zusammenhängt … (Ich werde die Meldung hier hinzufügen, sobald ich das Problem reproduzieren kann.)
// Das Programm verwendet MPI-Netzwerkoperationen über einen zugeordneten Speicherbereich (Intel MPI mit aktiviertem RDMA von Infiniband), wobei RDMA möglicherweise den Betriebssystemkernel umgeht und einige Daten direkt in den Speicher schreibt.
Ich habe den Aufrufstapel untersucht und einige Kernelcodes gefunden: (http://lxr.free-electrons.com/source/fs/ext4/inode.c#L2313)
Ich vermute, dass die Fehler von der 'BUG_ON'-Trap in #L2386 BUG_ON(PageWriteback(page)) herrühren. Die Kernel-Version ist 3.19.0 (https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.19.tar.xz)
Antwort1
Sie können nichtUrsacheeine Kernel-Panik durch unsachgemäße Verwendung eines Systemaufrufs, mmap
einschließlich. Die Syscall-Schnittstelle bietet dem Anrufer nicht die Mittel, die Datenstrukturen des Kernels zu beschädigen.
Ich würde nach einem Hardwareproblem suchen und besonders auf Hinweise in den Systemprotokollen achten, z. B. /var/log/kernel.log
. Als Experiment würde ich versuchen, eine Datei derselben Größe auf einem anderen Dateisystem abzubilden, da die Festplatte die Komponente ist, bei der ein Ausfall am wahrscheinlichsten ist.
Es istmöglichSie haben einen Kernel-Bug entdeckt. Eine schnelle Suche nachSchreib zurückUndPanik[dieser alte Virus] taucht auf.1 Wenn Sie einen sehr alten Kernel verwenden, ist es wahrscheinlich Zeit für ein Upgrade.
Antwort2
Nach der Beschreibung in den Kommentaren handelt es sich um einen Kernel-Absturz (Panik). Es sollte auf jeden Fallniemalspassieren.
Welche Distribution ist das? Welche Kernel-Version? Architektur?
Aktualisieren Sie zunächst alles. Wenn Ihre Distribution das Ende ihres Lebenszyklus erreicht hat, führen Sie ein Upgrade durch. Versuchen Sie es dann erneut.
Wenn es weiterhin besteht, sollten Sie in der Lage sein, dies mit einem kleinen C-Programm reproduzierbar zu machen, das die gleiche Arbeit erledigt mmap()
wie Ihr C++-Programm, und auf diesem Speicher einen Tanz ähnlich dem von C++ wiederholt (vielleicht reicht es schon, einfach zu versuchen, „weit hinein“ zu gelangen). Sammeln Sie alles und melden Sie es über den Fehlerberichtskanal Ihrer Distribution.