我有一个t3a.micro实例运行 wordpress,流量非常低。此实例自动不可用,导致 504 网关超时错误。此时,我也无法使用 ssh 连接 EC2。这种情况一天中任何时候都会发生,有时每天都会发生,有时整周都不会发生。当它关闭时也不会出现流量高峰。我也向 AWS Support 询问了这个问题,并得到了以下答案:
在我这边检查后,我发现该实例在过去 24 小时内多次未通过实例状态检查[1],这表明该实例在操作系统级别存在问题。进一步检查控制台日志后,我看到了以下内存不足错误:
[5626.002561] 内存不足:已终止进程 2050(apache2)total-vm:552924kB、anon-rss:54868kB、file-rss:0kB、shmem-rss:32076kB、UID:33 pgtables:848kB oom_score_adj:0
[5674.174673] 内存不足:已终止进程 1788(apache2)total-vm:624936kB、anon-rss:51952kB、file-rss:0kB、shmem-rss:34184kB、UID:33 pgtables:856kB oom_score_adj:0
[5763.820732] 内存不足:已终止进程 1815(apache2)total-vm:550384kB、anon-rss:51604kB、file-rss:0kB、shmem-rss:34532kB、UID:33 pgtables:836kB oom_score_adj:0
[5773.275938] 内存不足:已终止进程 1973(apache2)total-vm:624744kB、anon-rss:52260kB、file-rss:0kB、shmem-rss:32136kB、UID:33 pgtables:856kB oom_score_adj:0
[5959.347157] 内存不足:已终止进程 2014 (apache2) total-vm:552440kB、anon-rss:54020kB、file-rss:0kB、shmem-rss:28856kB、UID:33 pgtables:844kB oom_score_adj:0
[6438.787255] 内存不足:已终止进程 2165(apache2)total-vm:624756kB、anon-rss:51948kB、file-rss:0kB、shmem-rss:29836kB、UID:33 pgtables:856kB oom_score_adj:0
关于 OOM(内存不足)终止程序,如果内存被进程耗尽,达到威胁系统稳定性的程度,则 OOM 终止程序就会启动。OOM 终止程序的任务是继续终止进程,直到释放足够的内存,以便内核尝试运行的其余进程能够顺利运行。从输出来看,您的实例可能已经耗尽了内存,因此 Linux 内核正在调用 OOM 终止程序。
他们建议监控每个进程的内存使用情况,然后终止或修复该进程以减少使用那么多内存。当我运行 wordpress 时,这看起来不是一种非常实用的方法,即使它在几分钟内使用了太多内存,我也无法修改它。
我还有另一个例子t3.小使用 elastic beanstalk 在 beanstalk 提供的 amazon linux AMI 上托管带有 nginx/tomcat 环境的 java web 应用程序。此实例发生相同的问题,自动关闭并显示 504 网关超时。
问题:- 我不想升级我的实例,因为它们在当前流量下运行良好。有没有解决方案可以解决这些问题,而无需升级,当然也无需持续监控进程?
答案1
您的主要选择是:
- 找出使用 RAM 的内容并将其配置为使用较少的 RAM(最佳选择)
- 使用具有更多 RAM 的实例(这可能无法完全解决问题)
- 使用交换文件作为增加 RAM 的廉价方法 - 我使用交换文件只是为了确保有一些备用文件来防止 OOM 情况,因此虽然它不能解决问题但这是个好主意。
我在 t3a.nano(512MB RAM)和 512MB 交换空间上运行了五个容量相当低的 Wordpress 网站、MySQL 和一些其他工具。
以下是一些减少典型 Wordpress 系统内存使用量的方法(我想到的):
- 限制 PHP 线程/工作者的数量。我想我可能允许 2-3 个线程,如果一个线程不可用,Web 服务器将等待,直到另一个线程可用,这通常不会持续很长时间。这一点很关键,因为 PHP/Wordpress 占用大量内存。
- 限制每个 PHP 线程可用的最大内存。
- 关闭 MySQL 性能模式
- 调整 MySQL 参数以减少内存使用量。基本上,您只需阅读文档,但我将在下面复制我当前的配置。这是从我的 Windows PC 上获取的,但 Linux 也类似。
- 检查您的网络服务器内存使用情况,如果是 Apache 并且内存使用量很高,您可以考虑使用速度快且体积小的 Nginx。
您还应该搜索“LAMP(或LEMP)wordpress 减少内存使用量”
这是我正在使用的 MySQL 配置。这是我针对 MySQL 8.x 的新配置,尚未经过测试,但它与我的 MySQL5 配置非常相似,所以应该没问题。它针对低内存使用率进行了优化,而不是高性能,而且我不是 MySQL 专家,所以它可能不是很好。
[mysqld]
# set basedir to your installation path
basedir=(insert here)
# set datadir to the location of your data directory
datadir=(insert here)
# Turn off performance schema
performance_schema=OFF
# Turn off binary log
skip-log-bin
log_bin = OFF
# Disable monitoring
innodb_monitor_disable=all
# RAM optimisation settings overall
innodb_buffer_pool_size=50M
innodb_buffer_pool_instances=1
innodb_flush_method=unbuffered
innodb_log_buffer_size=1048576
innodb_log_file_size=4194304
innodb_max_undo_log_size=10485760
innodb_sort_buffer_size=64K
innodb_ft_cache_size=1600000
innodb_max_undo_log_size=10485760
max_connections=20
key_buffer_size=1M
# Reduce RAM: per thread or per operation settings
thread_stack=140K
thread_cache_size = 2
read_buffer_size=8200
read_rnd_buffer_size=8200
max_heap_table_size=16K
tmp_table_size=128K
temptable_max_ram=2097152
bulk_insert_buffer_size=0
join_buffer_size=128
net_buffer_length=1K
# Slow query log
slow_query_log=OFF
#long_query_time=5
#log_slow_rate_limit=1
#log_slow_rate_type=query
#log_slow_verbosity=full
#log_slow_admin_statements=ON
#log_slow_slave_statements=ON
#slow_query_log_always_write_time=1
#slow_query_log_use_global_control=all
# Logs
log_error = (wherever)
general_log = ON
general_log_file = (wherever)