Application C ++. avec mmap tue le kernel? (panique du kernel avec mmap)

Dans mon programme C ++ où disque intensif, E / S réseau et même calcul de CPU se produisent, j'utilise la région mappée memory comme un tableau.

Avec de très petites données, cela fonctionne très bien. Cependant quand j'ai couru le programme avec des données énormes mon application plante. (Je comprends tout à fait que la taille de la région mmap ne devrait pas être une préoccupation car l'OS traitera toutes les E / S et la mise en memory tampon)

Je ne veux pas blâmer sur Linux pour cela, mais j'aimerais savoir s'il y a un cas 'mmap' devient instable et peut faire planter le operating system?

Lorsque l'OS se bloque, dans l'écran, je peux voir le message de panique du kernel associé à un blah blah 'write_back' … (j'appendai le msg ici dès que je reproduirai le problème)

// Le programme utilise les opérations de réseau MPI sur la région mappée en memory (Intel MPI avec RDMA activé par Infiniband) où RDMA contourne éventuellement le kernel du operating system et écrit directement certaines données dans la memory.

J'ai enquêté sur le callstack et trouvé quelques codes de kernel: ( http://lxr.free-electrons.com/source/fs/ext4/inode.c#L2313 )

Je suppose que les erreurs proviennent du piège 'BUG_ON' dans # L2386 BUG_ON (PageWriteback (page)); le ver du kernel est 3.19.0 ( https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.19.tar.xz )

entrer la description de l'image ici

Vous ne pouvez pas provoquer une panique du kernel en cas d'utilisation incorrecte de tout appel système, mmap inclus. L'interface syscall ne fournit pas à l'appelant les moyens de corrompre les data structures du kernel.

Je chercherais un problème matériel et prêterais attention à tous les indices dans les journaux du système, par exemple /var/log/kernel.log . À titre expérimental, j'essayerais de mapper le même file de taille sur un système de files différent, car le disque est le composant le plus susceptible d'échouer.

Il est possible que vous ayez chatouillé un bug du kernel. Une search rapide pour l' écriture différée et la panique apparaît [ce vieux bug]. 1 Si vous utilisez un kernel très ancien, il est probablement time de le mettre à niveau.

Par la description dans cooments, son est un kernel crash (panique). Cela ne devrait absolument jamais arriver.

Quelle dissortingbution est-ce? Quelle version du kernel? Architecture?

Tout d'abord tout mettre à jour. Si votre dissortingbution est en fin de vie, mettez à niveau. Puis réessayez.

S'il persiste, vous devriez pouvoir le reproduire avec un petit programme C, qui fait le mmap() énorme comme votre programme C ++, et répétez sur cette memory une danse similaire à celle du C ++ (essayez peut-être juste d'accéder à " loin dans cela "est suffisant). Rassemblez tout et signalez-le via le canal de rapport d'erreur de votre dissortingbution.