我在 AWS 服务器上的两个相同的 EC2 云实例上运行 Ubuntu,这些实例具有 1 个 CPU 和 1GB RAM。第一个实例运行的是 Ubuntu 20.04,第二个实例运行的是 Ubuntu 16.04
我在两个实例上以完全相同的方式安装了 apache2、php7.3 和 mysql。
我在编写简单的 PHP 脚本时注意到了一种奇怪的行为,该脚本从 XML 中读取大量数据并将其保存在数组中并进行处理。我必须将其保存在数组中,因为我需要根据某些条件更改值。我使用 unset() 函数对变量进行处理,该函数在使用后立即保存大型数组,不再需要。
在最新的 Ubuntu 20.04 LTS 上,该脚本第一次和第二次运行正常,但第三次运行时会卡住。我使用 top 命令观察了资源的使用情况,发现内存已满且未被释放。
有趣的是,我在 Ubuntu 16.04 上测试了相同的脚本,它运行非常顺畅。我使用 top 命令观察了资源的使用情况,并注意到脚本执行后内存就会被释放。因此下一次执行也运行顺利。
我在同一类型的服务器上运行这两个脚本:1CPU、1GB RAM、1GB Swap
交换不是问题,因为我已经在没有交换的更好的服务器上尝试过:2CPU 和 2GB RAM,带有 Ubuntu 20.04,它也冻结了。
这是 Ubuntu 20.04 上 top 命令的屏幕截图:
现在什么都没有执行,但是交换空间已满,而且在我运行脚本时交换空间并没有减少。在我运行脚本 2-3 次后就会发生这种情况。
这是 Ubuntu 16.04 上的 top 命令的屏幕截图:
现在什么都没执行,内存使用率始终保持在 500-600MB。即使我反复运行该脚本,内存使用率也会自动达到 500-600MB。并且脚本的运行从未中断。
这不是 AWS 的问题,因为我在 Digital Ocean 上进行了测试,也发生了同样的事情。
而且我相信内存不足也不是问题,因为一开始有很多内存可用。只是在 Ubuntu 20.04 上没有释放。而 Ubuntu 16.04 在脚本运行完成后立即释放内存,并且始终将内存保持在同一水平,而 20.04 会让内存满了,并且不想释放它。
有人知道 Ubuntu 20.04 出了什么问题吗?是内存管理中的错误吗?
我之所以问这个问题,是因为在 Ubuntu 16.04 上一切都运行良好。如果在那里运行不正常,我会说这就是它的工作原理,我会尝试优化我的脚本。唯一的区别是操作系统。两台服务器上的其他一切都相同。