我正在运行一个具有大量数值计算负载的控制台应用程序。它已成功运行多次,但目前因“内存耗尽”消息而崩溃。以下是崩溃期间的两张最重要的快照。
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。除非有人有其他好的智慧,否则我会假设源中内存分配方法中的某些内容导致了阻塞。如果有人有评论,我仍然想对此有所了解。
感谢您的关注。