集中的なディスク、ネットワーク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 非常に古いカーネルを実行している場合は、もちろんアップグレードする時期でしょう。
答え2
coomentsの説明によると、彼の状況はカーネルパニックでした。必ずしなければならないいいえ発生する。
これは何のディストリビューションですか?どのカーネルバージョンですか?建築学?
まず、すべてを更新してください。展開が中断された場合はアップグレードしてください。それからもう一度やり直してください。
問題が解決しない場合は、C ++プログラムのように大きな操作を実行し、そのメモリでC ++のようなダンスを繰り返す小さなCプログラムを使用してそれを再現できる必要がありますmmap()
(おそらく「Get into it」にアクセスしようとした可能性があります)。 )すべてを収集し、ディストリビューションのバグ報告チャンネルを通じて報告します。