我是否正确计算了 MySQL 数据库的最大连接限制?

Am I calculating maximum connection limit on our MySQL db correctly?

我在生产中有一个 MySQL 数据库,我正在尝试计算优化数字以将 MySQL max_connections 值设置为 - 我是否正确地执行了此操作,因为我的总和看起来对我来说很高。

据我所知,下面 link 的逻辑如下,使用添加在此 post 末尾的 URL:

我已通过 ssh 连接到相关服务器,并在 MySQL 终端中使用类似于此的查询找到了相关变量 SHOW VARIABLES LIKE '%buffer%'; 这给了我这样的变量信息..

Available RAM = Global Buffers + (Thread Buffers x max_connections)

max_connections = (Available RAM – Global Buffers) / Thread Buffers

要找出可用的 RAM,我只需在 运行 free -b 终端中 returns this :

为了计算相关的 Globa 缓冲区和线程缓冲区,我只是根据这些值将值相加

Global Buffers: key_buffer_size, innodb_buffer_pool_size, innodb_log_buffer_size, innodb_additional_mem_pool_size, net_buffer_size, query_cache_size

Thread Buffers: sort_buffer_size, myisam_sort_buffer_size, read_buffer_size, join_buffer_size, read_rnd_buffer_size, thread_stack

这给了我以下数字:

Global Buffers = (67108864 + 2147483648 + 16777216 + 0 + 0 + 33554432) = 2264924160

Thread Buffers = (1048576 + 67108864 + 1048576 + 1048576 + 8388608 + 262144) = 78905344

所以使用这个逻辑 - max_connections = (Available RAM – Global Buffers) / Thread Buffers

我认为计算是正确的 - 这给了我 1680 max_connections.. 这看起来正确吗?

max connections = (134902571008 - 2264924160) / 78905344 = 1680.97165698

你的推理很有道理,但你没有考虑到一些事情。

  • 操作系统需要一些 RAM 用于其他进程、OS 内核本身和文件系统缓存。需要多少是可变的,很难预测。因此,尝试“优化”RAM 分配量并不是一个好主意。留出一些余量。

  • MySQL 服务器进程还需要一些额外的 RAM,用于不计入全局缓冲区配置值或 per-thread 配置值的内容。没有好的计算方法。

  • 一些你认为是 per-thread 的值在理论上可以被单个线程多次使用,比如 tmp_table_sizejoin_buffer_size

  • 所有线程不太可能同时使用它们的最大允许per-thread分配。在 运行 MySQL 服务器中,您可能连接了 1000 个客户端,但如果您在 SHOW PROCESSLIST 中查看它们,其中 990 个处于“休眠”状态。也就是说,它们已连接,但在任何给定时刻都没有 运行 查询。有点像当你通过 ssh 连接到服务器,但你的 shell 只是在提示符下,而不是 运行 命令。

底线是 RAM 分配不是一门精确的科学。你不应该试图通过计算来优化它。

相反,通过随着时间的推移观察系统并尝试逐步提高值来优化它,看看它是否可以在不过度分配 RAM 的情况下提高 SQL 性能。这样,分配的大小将适合您需要它服务的 SQL 客户端流量。