我正在为很多连接到它的人管理一个数据库服务器,我们使用的工具之一没有得到很好的优化,所以它使用了很多没有索引的 JOIN 查询。
问题是最近我们正在试验一些崩溃,因为 InnoDB 缓冲池达到了 90~95%,所以我不得不检查 MySQL 是否需要更大的池大小,所以我运行了:
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;
它返回给我:
+-------+
| RIBPS |
+-------+
| 33 |
+-------+
1 row in set, 48 warnings (0.19 sec)
所以我需要innodb_buffer_pool_size
33G,这必须是我总 RAM 的 60~70% 左右。好的,这似乎是一个相当高的价值,但是我对此没有任何问题,所以我将该 VM 中的 RAM 设置为 64G。
问题
我每天都在查看和检查 InnoDB 缓冲区使用值,现在,运行 16 天后,它的使用率为 39%,但它每天都在变高,而且不会减少。会达到>90%?它会再次崩溃吗?
这些是我在mysql.cnf
文件中设置的一些变量:
innodb_buffer_pool_instances = 44
innodb_buffer_pool_size = 42G
innodb_flush_method = O_DIRECT
innodb_log_file_size = 5G
innodb_page_cleaners = 4
innodb_purge_threads = 4
innodb_read_io_threads = 64
innodb_thread_concurrency = 0
innodb_write_io_threads = 64
max_connections = 512
open_files_limit = 262144
table_open_cache = 131072
innodb_io_capacity = 1900
thread_cache_size = 100
read_rnd_buffer_size = 128K
read_buffer_size = 128K
我需要知道我应该调整或调整哪些变量以使其保持稳定,以及是否需要刷新或清除该缓冲池。
这很正常。
buffer_pool 是一个“缓存”。块(每个 16KB)根据需要从磁盘加载。修改后的块最终会写回磁盘并留在 buffer_pool 中。一个典型的应用程序会逐渐触及所有的块;您看到的是 buffer_pool 随着时间的推移而增长,直到达到某个限制。
但是,buffer_pool 中还有其他东西,所以它比数据大 50% 左右会很好。因此,它将继续增长,通过您的 33GB 数据,直到大约 50GB。
您应该设置
innodb_buffer_pool_size
为大约 70% 的可用RAM。也就是说,在考虑了在同一台机器上运行的其他产品之后。如果你有比 buffer_pool 更多的数据;它仍然可以工作,但需要额外的 I/O。
崩溃 我看不出它崩溃的任何原因。
您是否为操作系统分配了任何交换空间?如果不是,那么超过 100% 的 RAM 将导致崩溃。有了一些交换空间,事情就会变得非常缓慢。在这两种情况下,低
innodb_buffer_pool_size
以避免任何交换。(最好允许 I/O 用于缓存而不是交换。)buffer_pool 故意留下大约 5% 的“净空”。当它接近时,它会将缓存中的东西撞出——而不是崩溃。