我们的 AWS Aurora MySQL 实例出现可用内存不足并因此崩溃的问题。AWS的回应是升级到更大的实例,但我认为这不一定能解决问题。
我们使用的是 db.r5.large 实例,内存为 15GB。
重新启动后,RAM 会下降到 5GB,这几乎是预料之中的,但随后在一周内逐渐下降到 0GB RAM,然后重新启动 - 有时会失败,需要手动重新启动实例。
CPU 使用率通常徘徊在 15% 左右,当我们进行深夜处理时,该值会达到峰值。
来自mysql innodb_buffer_pool_size 应该有多大?
SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
(SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
FROM information_schema.tables WHERE engine='InnoDB') A;
Run Code Online (Sandbox Code Playgroud)
根据需要提供 10GB 来保存内存中的所有数据和索引。
SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM
(SELECT variable_value PagesData
FROM information_schema.global_status
WHERE variable_name='Innodb_buffer_pool_pages_data') A,
(SELECT variable_value PageSize
FROM information_schema.global_status
WHERE variable_name='Innodb_page_size') B;
Run Code Online (Sandbox Code Playgroud)
InnoDB 缓冲池中提供 4.6GB
SHOW FULL PROCESSLIST
Run Code Online (Sandbox Code Playgroud)
仅显示几个进程,没有挂起的线程。
我的问题是,有没有一种方法可以确保可释放内存永远不会超过某个点并被释放回来以供使用,例如它永远不会低于 2GB,因此如果内存占用很大,它不会耗尽内存。
我知道这可能会影响性能,但在我扩展到更大的实例(成本加倍)并经历同样缓慢下降到 0 之前,我想看看它的性能如何,因为它比生产更好机器随机崩溃。
附加信息:
我已将各种 MySQL 输出添加到https://pastebin.com/CkRxqL04
不太确定如何在 RDS 实例上运行 Unix …