Mysql
AWS RDS MySQL 上難以捉摸的問題
我有一個預配置的單主 RDS 數據庫 (5.6.mysql_aurora.1.23.0),帶有一個寫入器和一個讀取器。客戶端是一堆碼頭應用程序,每個應用程序池最多有 250 個連接。
一段時間以來,我一直在與間歇性問題作鬥爭:連接嘗試開始超時,主要是。它似乎與高負載相關,我已經開始
information_schema.processlist
定期將整個複製到日誌表(顯然帶有時間戳),當連接數達到 2000 時,問題似乎變得最明顯。它永遠不會接近max_connections
或max_user_connections
:mysql> show variables like "%max%conn%"; +------------------------------+-------+ | Variable_name | Value | +------------------------------+-------+ | aurora_max_connections_limit | 16000 | | max_connect_errors | 100 | | max_connections | 3000 | | max_user_connections | 0 | +------------------------------+-------+ 4 rows in set (0.03 sec)
那麼,為了解決這個問題,我應該關注哪些參數?我沒有發現任何可能的東西,這解釋了為什麼 2000 個連接似乎會導致這種情況;當然,出現這樣的整數可能只是巧合。
這很可能是記憶體耗盡的結果。每個到數據庫的連接都需要一點記憶體,如果每個連接需要 1MB(一個小數字),您可能會看到大約 2GB 的記憶體僅用於連接。
此 SQL 查詢將讓您知道任何單個連接可以使用的最大記憶體量:
SELECT ( @@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size + @@join_buffer_size + @@binlog_cache_size + @@thread_stack + @@tmp_table_size + 2*@@net_buffer_length ) / (1024 * 1024) AS MEMORY_PER_CON_MB;
檢查這個數字是否太高(這是一個基於特定數據庫經驗的主觀數字)。如果數據庫定期耗盡記憶體,那麼您可能需要記憶體優化實例或對每個連接可能消耗的資源數量進行更嚴格的限制。