内存耗尽——为什么?

内存耗尽——为什么?

我正在运行一个具有大量数值计算负载的控制台应用程序。它已成功运行多次,但目前因“内存耗尽”消息而崩溃。以下是崩溃期间的两张最重要的快照。

top - 19:22:32 up 10:33,  4 users,  load average: 1.05, 1.06, 1.05  
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie  
%Cpu(s):  8.3 us,  0.1 sy,  0.0 ni, 91.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st  
KiB Mem:  13195763+total, 97249256 used, 34708380 free,   137332 buffers  
KiB Swap:        0 total,        0 used,        0 free.   973400 cached Mem
  
  PID ... USER ... PR ... NI ... VIRT ... RES ... SHR ... S ... %CPU ... %MEM ... TIME+ ...  COMMAND  
 3591 .. hexi ...... 20 .... 0 ... 92.976g  0.089t  18720 .. R ... 99.9 ........ 72.2 ...   614:50.72 . RobustPure+
  
top - 19:22:35 up 10:33,  4 users,  load average: 0.97, 1.05, 1.04  
Tasks:   0 total,   0 running,   0 sleeping,   0 stopped,   0 zombie  
%Cpu(s):  3.6 us,  1.2 sy,  0.0 ni, 95.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st  
KiB Mem:  13195763+total,  1827172 used, 13013046+free,   137332 buffers  
KiB Swap:        0 total,        0 used,        0 free.   973400 cached Mem  
  
  PID ... USER ... PR ... NI ... VIRT ... RES ...  SHR ... S ... %CPU ... %MEM ... TIME+ ... COMMAND

在上面的第一个快照中,一切看起来都很顺利,超过 27% 的内存显示为可用。但不到三秒,应用程序就崩溃了,如第二个快照所示,其中 PID 消失了。其间进程的数量或状态没有发生变化。场地是Mint 17.3,内核是3.19。 (我无法选择在任何其他平台上运行。)以下是 ulimit -a 命令的输出。

hexi@mint17 ~ $ ulimit -a  
core file size          (blocks, -c) ...0  
data seg size           (kbytes, -d) ...unlimited  
scheduling priority             (-e) ...0  
file size               (blocks, -f) ...unlimited  
pending signals                 (-i) ...515091  
max locked memory       (kbytes, -l) ...64  
max memory size         (kbytes, -m) ...unlimited  
open files                      (-n) ...1024  
pipe size            (512 bytes, -p) ...8  
POSIX message queues     (bytes, -q) ...819200  
real-time priority              (-r) ...0  
stack size              (kbytes, -s) ...8192  
cpu time               (seconds, -t) ...unlimited  
max user processes              (-u) ...515091  
virtual memory          (kbytes, -v) ...unlimited  
file locks                      (-x) ...unlimited**  

内存用memtest86测试过,得到了一个完美的鹅蛋。它在默认条件下运行(无 XMP)。谁能告诉我这起事故的可能原因是什么?

一些硬件细节。内存模块有四个,每个 32 GB。虽然free、top、memtest86都可以看到所有的内存,但是有没有可能内核因为某种原因无法分配呢?

我发现问题:https://stackoverflow.com/questions/30173133/linux-cannot-allocate-more-than-32-gb-64-gb-of-memory-in-a-single-process-due-t,这适用于我拥有的内核,但不是专门针对我的问题。使用其中包含的测试代码,我能够测试分配 124 GB 的 RAM。除非有人有其他好的智慧,否则我会假设源中内存分配方法中的某些内容导致了阻塞。如果有人有评论,我仍然想对此有所了解。

感谢您的关注。

相关内容