我的 ubuntu 服务器运行了一个月,没有任何问题。但上周我开始使用需要更多内存的程序。当可用内存约为 100MB 时,系统完全冻结。我无法输入任何内容,无法移动光标,无法从 putty 连接……什么都做不了……但奇怪的是,硬盘仍在工作(闪烁)。我可以完全重现这个问题,它几乎每次在可用内存约为 100MB 时都会发生。但我有交换文件,并且这个交换文件中有足够的可用空间。这是冻结前 1 秒的内存状态。
每 1.0 秒免费 -mh 2018 年 3 月 19 日星期一 17:05:33 总计已用免费共享 buff/缓存可用 内存:11G 10G 115M 1.2G 1.5G 115M 交换:7.9G 2.4G 5.5G
这是我的 Linux 内核
Linux xxx 4.15.1-041501-通用#201802031831 SMP 星期六 2月 3 日 18:32:13 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
这是我的 ubuntu 版本
无可用的 LSB 模块。 分销商 ID:Ubuntu 描述:Ubuntu 17.10 版本:17.10 代号:巧妙
这是我的 swappines、overcommit_memory 和 overcommit_ratio 配置
vm.swappiness = 60 vm.overcommit_memory = 0 vm.overcommit_ratio = 50
这是我的硬件配置
主板:PRIME B350-PLUS CPU:AMD Ryzen 7 1700 八核处理器 内存:4GB + 8GB DDR4 硬盘:三星 960 evo 250GB
当然,我可以将内存升级到 16GB,但我仍然希望系统稳定。有人知道可能出了什么问题吗?
答案1
我相信这是一个与此相同的问题,即使您启用了交换:https://unix.stackexchange.com/q/373312/306023
基本上,内核(或 kswapd0)会驱逐每个活动进程的代码(可执行)页面,以释放更多的 RAM,因此在每个上下文切换当一个进程恢复执行的时候,需要把它从磁盘重新读入内存,然后才能恢复执行。
每秒需要发生很多次,再加上磁盘比 RAM 慢得多,操作系统被视为实际上冻结了。就好像 RAM 暂时被磁盘取代了,而这一切都是因为内核犯了错误是驱逐正在运行的进程的文件支持的可执行页面,而不仅仅是非活动的页面。
如果你想尝试看看如果内核不驱逐这些进程会发生什么,你可以使用以下命令重新编译内核这补丁,见于这问题。应该发生的是,操作系统现在应该最多冻结 1 秒钟,而不是几分钟(或永久冻结),并且应该很少或没有磁盘抖动。