我正忙着将用PHP / MySQL编写的客户应用程序从Hetzner迁移到AWS。一切正常,但一些脚本。这些脚本编写得很糟糕,循环遍历数百万条记录,在每次循环运行中创建数百个局部变量,将每一行写入excel文件,打开另一个文件,编写状态更新并在每次循环运行中关闭文件。该脚本使用主Web应用程序中的shell_exec
作为独立进程生成。
当我第一次在EC2上测试脚本时,由于我的EC2实例上的php memory_limit
参数设置为128M
,因此崩溃的速度非常快。错误类似于下面的错误:
Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)
我将memory_limit
从128M
增加到256M
,然后再增加到512M
,然后增加到1024M
,4096M
,最终设置为{ {1}}了解问题所在。
将它设置为-1
最初似乎有效,但它会冻结整个实例(t2.micro)。然后我意识到这是由于缺少交换空间而达到了系统内存限制,所以仅为了测试目的,我添加了-1
的交换空间并将4GB
设置为memory_limit
。这确实按预期工作,脚本从未崩溃,但随着脚本的运行,它逐渐变慢。例如,它将前10%的记录写入excel文件的速度比50%后的10%快得多。所有这一切,我看着内存使用量扩大到6 GB。
以下是脚本运行时来自-1
的屏幕截图:
我正在使用php安装的默认htop
,但设置为-1的php.ini
除外。
但是,当我在另一台服务器(在这种情况下是Hetzner共享主机)上运行此非常相同的脚本时,服务器会以某种方式限制内存使用情况,并且脚本在memory_limit
上运行正常128M
设置。虽然这不完全正确(正如服务器上的memory_limit
所证实的),但它似乎不会在服务器上崩溃,因为内存/交换空间比我的EC2实例少得多。
以下是在Hetzner上运行的htop
的屏幕截图:
第三个截图是在脚本结束时拍摄的 - 正如您所看到的,内存在开始和结束之间没有太大变化。以下是服务器的htop
设置:
php.ini
数据库和代码库在两个实例中都是精确的副本。在两种情况下,生成的excel文件大小约为225MB。
那么,任何想法可能导致这种行为,我应该如何在我的EC2实例上修复它?
感谢您的帮助!
答案 0 :(得分:0)
EasyPHP-Devserver-17-depanne-erreur致命错误:允许的内存大小
的134217728字节已用尽(尝试分配471698889字节) C:\ Program档案 (x86)\ EasyPHP-Devserver-17 \ eds-binaries \ httpserver \ apache2425vc11x86x180705170153 \ eds-app-dashboard.php 在第77行
解决方案
在我的情况下,这是因为Easyphp试图加载太大的error.log文件。
删除 eds-binaries \ httpserver \ apache2418x160331124251 \ logs中的服务器 log 文件 测试正常