2014-03-26 90 views
3

我有一個程序有一個相當大的內存佔用,大約30GB,核心轉儲。核心轉儲文件出現然後消失

當程序正在轉儲(頂部顯示爲D - Defunct)時,轉儲文件是可見和可讀的。它位於預期的目錄中,具有預期的文件名格式。一切都在本地磁盤上。我甚至可以在gdb中加載文件。顯然,轉儲需要幾分鐘的時間處理這個大小的進程。

該文件最多可達13GB,然後進程退出......核心文件消失!噗。

平臺:紅帽EL6(2.6.32-220.4.2.el6.x86_64)

系統足夠的空間的文件,500GB以上免費。

$ df . 
Filesystem   1K-blocks  Used Available Use% Mounted on 
blahblahblah   834006872 270024424 521617316 35% /data 

的ulimit沒有顯示任何適用的限制:

$ ulimit -a 
core file size   (blocks, -c) unlimited 
file size    (blocks, -f) unlimited 
<snipped> 

編輯:更小的核心轉儲不會消失。包括這個相同的程序。這似乎是特定於巨大的核心轉儲。

tune2fs 1.41.12 (17-May-2010) 
<snip> 
Block size:    4096 
Fragment size:   4096 
Reserved GDT blocks:  1020 
Blocks per group:   32768 
Fragments per group:  32768 
Inodes per group:   8192 
Inode blocks per group: 512 
<snip> 
+0

你有程序的源代碼嗎? –

+0

@Basile不知道爲什麼這是相關的。無論如何,來源將是巨大的。 – Underhill

+1

Underhill,爲什麼不在gdb下運行該程序並運行,或者在運行時連接它。當程序得到SIGSEGV時,gdb會得到它,你將能夠在不需要保存coredump的情況下調試程序。 – osgx

回答

1

假設您使用的是ext2/ext3/ext4,您可能會面臨文件系統最大文件大小的限制。 This page(警告:俄語)告訴下限對於ext *文件系統中最大文件大小的有效值範圍等於16 GB(確切值取決於您的驅動器的簇大小)。所以我們不能排除你超出這個限制的事實。

有很多工具可以幫助您找出哪個進程已經擦除了您的文件:lsofinotifyauditd。它們都在你的內核中得到支持,它們都是不同的,現在很難說它們中的哪一個最適合你。

+0

這是一種可能性。核心文件肯定超過了20GB。 – Underhill

+1

@ Underhill,如果這不是祕密,那麼這個過程會如何嚴重地消耗記憶?你把一些數據庫完全放到內存中了嗎? –

+0

「此頁面(警告:用俄語)告訴」,但仍然沒有關於ext2,3,4的16GB限制的參考。 – osgx