我是否正确计算了 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_size
和 join_buffer_size
。
所有线程不太可能同时使用它们的最大允许per-thread分配。在 运行 MySQL 服务器中,您可能连接了 1000 个客户端,但如果您在 SHOW PROCESSLIST
中查看它们,其中 990 个处于“休眠”状态。也就是说,它们已连接,但在任何给定时刻都没有 运行 查询。有点像当你通过 ssh 连接到服务器,但你的 shell 只是在提示符下,而不是 运行 命令。
底线是 RAM 分配不是一门精确的科学。你不应该试图通过计算来优化它。
相反,通过随着时间的推移观察系统并尝试逐步提高值来优化它,看看它是否可以在不过度分配 RAM 的情况下提高 SQL 性能。这样,分配的大小将适合您需要它服务的 SQL 客户端流量。
我在生产中有一个 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_size
和join_buffer_size
。所有线程不太可能同时使用它们的最大允许per-thread分配。在 运行 MySQL 服务器中,您可能连接了 1000 个客户端,但如果您在
SHOW PROCESSLIST
中查看它们,其中 990 个处于“休眠”状态。也就是说,它们已连接,但在任何给定时刻都没有 运行 查询。有点像当你通过 ssh 连接到服务器,但你的 shell 只是在提示符下,而不是 运行 命令。
底线是 RAM 分配不是一门精确的科学。你不应该试图通过计算来优化它。
相反,通过随着时间的推移观察系统并尝试逐步提高值来优化它,看看它是否可以在不过度分配 RAM 的情况下提高 SQL 性能。这样,分配的大小将适合您需要它服务的 SQL 客户端流量。