我有一个 t2.medium RDS(4G 内存和 MySQL 5.7.22),具有以下全局变量:
- innodb_buffer_pool_chunk_size - 0.125G
- innodb_buffer_pool_instances - 8
- innodb_buffer_pool_size - 3G
这是SHOW ENGINE INNODB STATUS;的结果:
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 3298295808
Dictionary memory allocated 1021071
Buffer pool size 196608
Free buffers 8192
Database pages 182510
Old database pages 67208
Modified db pages 46
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 11507859, not young 812666330 1.12 youngs/s, 5324.32 non-youngs/s
Pages read 8720629, created 157094, written 2516637 5.27 reads/s, 0.00 creates/s, 12.40 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 22 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 182510, unzip_LRU len: 0
I/O sum[6344]:cur[0], unzip sum[0]:cur[0]
可用内存始终仅在 85Mb 到 105MB 之间,并且交换区使用了大约 70MB。即使 RDS 上几乎没有进程运行,该值也是恒定的。
如果我们需要更新 buffer_pool 变量,或者是否有其他方法来调试此内存问题,有人可以指导我吗?
最佳答案
仅使用 4G RAM,使 innodb_buffer_pool_size
不大于 2G。这可能足够低以消除交换问题。
我希望innodb_buffer_pool_instances - 8G
是一个拼写错误。我会推荐 1 或 2 个,而不是数千、数百万,当然也不是数十亿。
一般来说,RDS 应该将所有可调参数设置为合理的值。
定时任务
如果一次迭代有可能在下一次迭代启动之前未完成,请不要使用类似 cron 的机制。相反,有一个连续运行的脚本(或程序),它执行一个 block ,休眠一段时间,然后重复。这将 (1) 更快地完成任务,并且 (2) 不会由于实例相互碰撞而导致崩溃(或部分崩溃)(这种情况将会发生)。
关于mysql - AWS RDS 可用内存和交换空间使用量较低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52816409/