我有一个 CentOS7.9 系统,显示 56GiB 可用 RAM(free -m),但只有 1MiB 可用交换,并且它已经处于这种状态三天了。最初的问题报告是一个大型(EE 模拟)应用程序不断崩溃。
谁能帮助我理解什么可以使记忆陷入这种情况?
答案1
您没有提到实际使用了多少交换空间,但除非数量很大,否则这种情况可以用一个进程(或多个进程)消耗所有可用内存或导致其被消耗来解释(例如通过读取许多文件而不指示它们不应被缓存)。这会导致尽可能多的数据被推出内存,其中一些最终会进入交换区。
交换区中的数据只有在需要使用时才会被拉回到内存中,因此系统通常会在交换区中累积数据(对应于在某个时刻使用过但不经常需要的数据)。即使数据被使用,它也可以保存在交换区中——这样,如果内存需要再次释放,则不需要将其复制回交换区(如果它没有改变)。
可靠地减少交换使用量的唯一方法是让交换中包含数据的进程退出(或被终止),或者减少可用交换本身 ( swapoff
)。
你所描述的那种情况不应该造成无法克服的问题。如果交换中的数据正在被积极使用,系统将减慢相当多的速度,直到将其重新加载到内存中,但由于您有大量可用内存,您的系统远不会崩溃(它花费所有时间来整理数据以进行交换和交换)后退)。
答案2
当这个大型应用程序填满内存时,“不活动”软件的其他部分将被推送到交换区域(/proc/sys/vm/swappiness
可以进行更改以影响它将内容从 RAM 移动到交换区域的积极程度)。当它最终退出/崩溃时,所有内存都会被释放,在交换区域中留下一堆其他软件和一堆空闲 RAM。
内存不会从交换区移回,直到它所属的任何应用程序使用它为止。如果交换区中的内存不经常使用,则可能需要一段时间才能被拉回 RAM。您可以关闭交换区 ( swapoff -a
) 以强制其将所有内容刷新回 RAM 并清空交换区(然后swapon -a
重新打开交换区)。