我正在运行一个带有命令的 shell 脚本来连续运行几个内存密集型程序(2-5 GB)。当我回去检查我的脚本的进度时,我惊讶地发现我的一些进程是Killed,正如我的终端向我报告的那样。在后来Killed启动的程序之前已经连续完成了几个程序,但是之后的所有程序都因分段错误而失败(这可能是由于我的代码中的错误,也可能不是由于我的代码中的错误,请继续阅读)。
我查看了我正在使用的特定集群的使用历史记录,发现有人开始同时运行多个内存密集型进程,这样做耗尽了集群可用的实际内存(甚至可能是交换空间)。尽我所能,这些内存密集型进程在我的程序出现问题的同时开始运行。
一旦开始耗尽内存,Linux 是否有可能杀死我的程序?我后来遇到的分段错误是否可能是由于缺少可用于运行我的程序的内存(而不是我的代码中的错误)?
我发现这pidstat将是监控流程的好工具。我想计算特定进程的平均内存使用量。这是一些示例输出:
02:34:36 PM PID minflt/s majflt/s VSZ RSS %MEM Command
02:34:37 PM 7276 2.00 0.00 349212 210176 7.14 scalpel
Run Code Online (Sandbox Code Playgroud)
(这是输出的一部分pidstat -r -p 7276。)
我应该使用常驻集大小 (RSS) 或虚拟大小 (VSZ) 信息来计算平均内存消耗吗?我在维基百科和论坛上阅读了一些内容,但我不确定是否完全理解这些差异。另外,似乎它们都不可靠。那么,如何监视进程以获取其内存使用情况?
对此事的任何帮助都会有所帮助。
我的计算机最近内存不足(在处理大型 GIS 数据集时编译软件的意外后果)。在详细说明它如何处理 OOM 条件的系统日志中,有以下行:
Out of memory: Kill process 7429 (java) score 259 or sacrifice child
Run Code Online (Sandbox Code Playgroud)
那是or sacrifice child关于什么的?肯定不是在考虑一些黑暗的仪式来让事情继续下去吗?
根据RHEL 文档,系统上可用的共享内存总量等于shmall*PAGE_SIZE。
我完成RHEL 6的安装后,shmall内核参数的值默认为4294967296\xef\xbc\x8c,这意味着系统范围内可以使用的共享内存页面总数为4294967296,页面大小为4096 B. 因此,根据公式,共享内存的大小为
4294967296*4096/1024/1024/1024/1024 = 16 TB\nRun Code Online (Sandbox Code Playgroud)\n...这远远大于操作系统的 RAM (8 GB) 大小。操作系统如何找到 16 TB 的共享内存来分配?
\n那么, 的大小是否/dev/shm等于共享内存的大小呢?如果不是,我怎样才能得到共享内存的实际大小?