ich habe heute im syslog etliche Einträge gefunden, die auf eine "page allocation failure" hinweisen.
Betroffen sind nur 2 Prozesse: "immortal" und "swapper". Immortal ist ein Prozess, den ich entwickelt habe und mathematische Berechnungen durchführt. Der Prozess speichert gelegentlich zwischen.
Auszug aus der syslog:
Code: Alles auswählen
Jun 4 06:04:18 beta kernel: [8372848.909977] __ratelimit: 356 callbacks suppressed
Jun 4 06:04:19 beta kernel: [8372848.910003] immortal: page allocation failure. order:0, mode:0x4020
Jun 4 06:04:19 beta kernel: [8372848.910029] Pid: 2087, comm: immortal Not tainted 2.6.32-5-686 #1
Jun 4 06:04:19 beta kernel: [8372848.910051] Call Trace:
Jun 4 06:04:19 beta kernel: [8372848.910077] [<c108c07e>] ? __alloc_pages_nodemask+0x484/0x4d9
Jun 4 06:04:19 beta kernel: [8372848.910102] [<c10adc66>] ? alloc_slab_page+0x18/0x1b
Jun 4 06:04:19 beta kernel: [8372848.910125] [<c10adda8>] ? __slab_alloc+0x13f/0x431
Jun 4 06:04:19 beta kernel: [8372848.910147] [<c10ae84a>] ? __kmalloc_track_caller+0xcd/0x124
Jun 4 06:04:19 beta kernel: [8372848.910171] [<c11d3da5>] ? __netdev_alloc_skb+0x14/0x2f
Jun 4 06:04:19 beta kernel: [8372848.910194] [<c11d3da5>] ? __netdev_alloc_skb+0x14/0x2f
Jun 4 06:04:19 beta kernel: [8372848.910216] [<c11d301e>] ? __alloc_skb+0x4a/0x115
Jun 4 06:04:19 beta kernel: [8372848.910238] [<c11d3da5>] ? __netdev_alloc_skb+0x14/0x2f
Jun 4 06:04:19 beta kernel: [8372848.910285] [<e09196d8>] ? tg3_alloc_rx_skb+0xa7/0x12d [tg3]
Jun 4 06:04:19 beta kernel: [8372848.910316] [<e092047e>] ? tg3_poll+0x3e8/0x820 [tg3]
Jun 4 06:04:19 beta kernel: [8372848.910341] [<c11d9081>] ? net_rx_action+0x96/0x194
Jun 4 06:04:19 beta kernel: [8372848.910365] [<c10354c8>] ? __do_softirq+0xaa/0x151
Jun 4 06:04:19 beta kernel: [8372848.910387] [<c10355a0>] ? do_softirq+0x31/0x3c
Jun 4 06:04:19 beta kernel: [8372848.910408] [<c1035676>] ? irq_exit+0x26/0x58
Jun 4 06:04:19 beta kernel: [8372848.910431] [<c1004699>] ? do_IRQ+0x78/0x89
Jun 4 06:04:19 beta kernel: [8372848.910452] [<c10037f0>] ? common_interrupt+0x30/0x38
Jun 4 06:04:19 beta kernel: [8372848.910473] Mem-Info:
Jun 4 06:04:19 beta kernel: [8372848.910489] DMA per-cpu:
Jun 4 06:04:19 beta kernel: [8372848.910507] CPU 0: hi: 0, btch: 1 usd: 0
Jun 4 06:04:19 beta kernel: [8372848.910526] Normal per-cpu:
Jun 4 06:04:19 beta kernel: [8372848.910544] CPU 0: hi: 186, btch: 31 usd: 128
Jun 4 06:04:19 beta kernel: [8372848.910567] active_anon:50191 inactive_anon:50293 isolated_anon:0
Jun 4 06:04:19 beta kernel: [8372848.910569] active_file:9325 inactive_file:10661 isolated_file:0
Jun 4 06:04:19 beta kernel: [8372848.910571] unevictable:0 dirty:0 writeback:6580 unstable:0
Es gibt bei dieser Sache ein paar seltsame Dinge:
1. Obwohl sowas zu einer Kernel-Panic passt, ist das System NICHT abgestürzt und ist auch nicht neu gestartet. Der Server hat weiterhin eine Uptime von 97 Tagen.
2. Der betroffene Prozess ist NICHT abgestürzt. Er läuft normal weiter und speichert auch weiterhin Zwischenergebnisse.
3. Es ist genügend Speicher auf dem System vorhanden und das System wird nur für Backups verwenden. Zum Zeitpunkt sollte es nicht zu einem Speicherengpass gekommen sein (außerdem gibt es noch genügend Swap-Platz)
4. Das Programm, das ich selbst in C99 geschrieben und kompiliert habe, benötigt zwar rund 200 MB Arbeitsspeicher für komplexe Berechnungen, aber alle malloc() und realloc() werden geprüft und führend zum Programm-ENDE, wenn sie == NULL ergeben (= malloc/realloc Fehler). Ich verstehe also nicht, wieso das Programm noch läuft, obwohl die Allocation angeblich nicht gelungen war.
Meine Frage ist nun, wie ich das Ganz interpretieren soll. Das System sowie mein immortal-Prozess laufen einwandfrei.
Allerdings: Ich bin mir unsicher, ob die Daten im 200-MB-Datenarray noch in Ordnung sind oder ob sich durch durch diesen seltsamen Fehler Rechenfehler eingeschlichen haben könnten. Das Problem ist, dass ich mathematisch nicht prüfen kann, ob die Daten konsistent sind. Sollte irgendeine Zahl falsch sein, würden alle nachfolgenden Ergebnisse ebenfalls unkorrekt sein, ohne dass man das nachprüfen könnte. (Der Array wird ständig um 10 MB erweitert und dann mit Ergebnissen, die aus dem vorherigen Array-Elementen resultieren, gefüllt)
Gruß
blackdrake
Code: Alles auswählen
$uname -a
Linux beta 2.6.32-5-686 #1 SMP Wed Jan 12 04:01:41 UTC 2011 i686 GNU/Linux