在我的 C++ 程式中,發生密集型磁碟、網路 I/O 甚至 CPU 計算,我使用記憶體映射區域作為陣列。
對於非常小的數據,它工作得很好。然而,當我運行帶有大量數據的程式時,我的應用程式崩潰了。 (我絕對理解 mmap 區域的大小不應該成為問題,因為作業系統將處理所有 I/O 和緩衝)
我不想將其歸咎於Linux,但我想知道是否有任何情況下'mmap'變得不穩定並可能導致作業系統崩潰?
當作業系統崩潰時,在螢幕中我可以看到與一些諸如此類的「write_back」相關的核心恐慌訊息...(一旦重現問題,我將在此處添加訊息)
// 該程式在記憶體映射區域(啟用了 Infiniband 的 RDMA 的英特爾 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
。作為實驗,我嘗試將相同大小的檔案對應到不同的檔案系統上,因為磁碟是最有可能發生故障的元件。
它是可能的你已經惹惱了一個核心錯誤。快速搜尋回寫和恐慌出現了[這個老bug]。1 如果您運行的是非常舊的內核,那麼當然,可能是時候升級了。
答案2
根據cooments中的描述,他的情況是內核崩潰(panic)。絕對應該絕不發生。
這是什麼分佈?什麼內核版本?建築學?
首先更新一切。如果您的發行版已停產,請升級。然後再試一次。
如果它持續存在,您應該能夠使用一個小型 C 程式來重現這一點,該程式可以mmap()
像您的C++ 程式一樣完成巨大的工作,並在該記憶體上重複類似於C++ 的舞蹈(也許只是嘗試存取“深入其中”) “ 足夠的)。收集所有內容並透過您的發行版的錯誤報告管道進行報告。