集中的なディスク、ネットワークI / O、さらにCPU計算が発生するC ++プログラムは、メモリマップされた領域を配列として使用します。
非常に小さいデータの場合、非常にうまく機能します。ただし、大量のデータでプログラムを実行すると、アプリケーションがクラッシュします。 (私はOSがすべてのI / Oとバッファリングを処理するので、mmap領域のサイズが問題にならないことを確実に理解しています。)
これをLinuxのせいに戻したくはありませんが、mmapが不安定になり、OSがクラッシュする可能性があるかどうか疑問に思います。
OSがクラッシュしたら、画面に次のいくつかの「write_back」に関連するカーネルパニックメッセージを見ることができます...(問題を再現した後にここにメッセージを追加します)
//このプログラムは、メモリマップ領域(InfinibandのRDMAが有効なIntel MPI)でMPIネットワーク操作を使用します。ここで、RDMAはオペレーティングシステムのカーネルを迂回し、いくつかのデータをメモリに直接書き込むことができます。
呼び出しスタックを調べたところ、いくつかのカーネルコードが見つかりました。http://lxr.free-electrons.com/source/fs/ext4/inode.c#L2313)
このエラーは #L2386 BUG_ON(PageWriteback(page)) の "BUG_ON" トラップで発生したようです。カーネルバージョンは3.19.0です(https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.19.tar.xz)
ベストアンサー1
できない理由システムコールを不適切に使用してカーネルパニックがmmap
発生しました。システム呼び出しインターフェースは、カーネルデータ構造を破壊するための資金を呼び出し元に提供しません。
私はハードウェアの問題を見つけ、システムログ(たとえば、/var/log/kernel.log
実験的にディスクが失敗する可能性が最も高いコンポーネントであるため、同じサイズのファイルを別のファイルシステムにマップしてみました。
それ可能カーネルのバグが発生しました。クイック検索書き換えそしてパニック[この古いバグ]が登場しました。1 非常に古いカーネルを実行している場合は、もちろんアップグレードする時期でしょう。