EC2 執行個體自動變成不可用 - 504 閘道逾時

EC2 執行個體自動變成不可用 - 504 閘道逾時

我有一個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:8488

[5674.174673]記憶體不足:殺死進程1788(apache2)total-vm:624936kB,anon-rss:51952kB,file-rss:0kB,shmem-rss:34184kB,UID:33 pgtables:85666

[5763.820732]記憶體不足:殺死進程1815(apache2)total-vm:550384kB,anon-rss:51604kB,file-rss:0kB,shmem-rss:34532kB,UID:33 pgtables:8366

[5773.275938]記憶體不足:殺死進程1973(apache2)total-vm:624744kB,anon-rss:52260kB,file-rss:0kB,shmem-rss:32136kB,UID:33 pgtables:85668

[5959.347157]記憶體不足:殺死進程2014(apache2)total-vm:552440kB,anon-rss:54020kB,file-rss:0kB,shmem-rss:28856kB,UID:33 pgtables:84k1

[6438.787255]記憶體不足:殺死進程2165(apache2)total-vm:624756kB,anon-rss:51948kB,file-rss:0kB,shmem-rss:29836kB,UID:33 pgtables:85668

簡單介紹一下 OOM (Out of memory) Killer,如果記憶體被進程耗盡,達到了威脅系統穩定性的程度,那麼 OOM Killer 就會啟動。使核心嘗試運行的進程的其餘部分順利運行。從輸出看來,您的實例可能已耗盡內存,因此 Linux 核心正在呼叫 OOM 殺手。

他們建議監視每個進程的記憶體使用情況,並終止或修復該進程以不使用那麼多記憶體。當我運行 WordPress 時,這看起來不是一個非常實用的方法,即使它在幾分鐘內使用了太多內存,我也無法修改它。

我還有另一個例子t3.小號使用彈性beanstalk,在beanstalk提供的amazon linux AMI上託管具有nginx/tomcat環境的java Web應用程式。此實例也出現相同的問題,自動關閉並顯示 504 網關逾時。

問題:- 我不想升級我的實例,因為它們在當前流量下運行得非常好。是否有任何解決方案可以處理這些問題,而無需升級,當然也無需持續監控流程?

答案1

您的主要選擇是:

  • 找出正在使用 RAM 的內容並將其配置為使用更少的 RAM(最佳選擇)
  • 使用具有更多 RAM 的實例(這可能無法完全解決問題)
  • 使用交換文件作為增加 RAM 的廉價方法 - 我使用交換文件只是為了確保有一些備用文件來防止 OOM 情況,因此雖然它不能解決問題,但這是一個好主意。

我在 t3a.nano(512MB RAM)加上 512MB 交換空間上運行 5 個容量相當小的 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)

相關內容