我想升级我们的 MariaDB 服务器的内存(10.1.25-MariaDB-1~xenial)
来处理更多的连接。
我一直在确定最大连接数,主要是根据这篇文章建议使用这个公式
(Available_RAM - Global_buffers) / Thread_buffers
Global_buffers 它是这些变量的总和。
key_buffer_size
innodb_buffer_pool_size
innodb_log_buffer_size
innodb_additional_mem_pool
net_buffer_length
Thread_buffers 是这些变量的总和。
sort_buffer_size
myisam_sort_buffer_size
read_buffer_size
join_buffer_size
read_rnd_buffer_size
这似乎有效,对我来说它给出了大约。15 个连接作为我的理论最大值。
当我查询SHOW STATUS LIKE 'max_used_connections'
时,据我所知,这给了我历史maximum connections
请求,我得到46 个连接。
对于背景,当我运行时,SHOW VARIABLES LIKE 'max_connections'
我得到151,我相信这是默认设置值。
15 个连接实际上是我的理论最大值吗?额外的31 个连接是否失败但 MySQL 注册了它们?
我的数学是错的还是我更可能遗漏了一些变量?
我发现的每个公式在某些方面都是错误的。我遇到的几乎每台计算机都有“过度使用”的 RAM;也就是说,公式会说可能会使用过多的 RAM。
他们的列表缺少两个重要设置:
max_heap_table_size
和tmp_table_size
. 这两个中的最小值用于 complex 中的内部临时表SELECTs
。 单个查询中可能有多种用途! 我建议将每个限制为 1% 的 RAM。全面的...
key_buffer_size
为仅 20M。innodb_buffer_pool_size
如果您有超过 4GB 的 RAM,请设置为大约 70% 的可用 RAM。(小型机器的百分比较低。)如果发生交换,这是首先要解决的问题。忽略您的问题所提出的公式。
至于“连接太多”,主要有两个原因,调优 MySQL/MariaDB 不是万能的。
在最后一个项目中,想想一家杂货店,那里有很多购物者,他们甚至无法将购物车推到下一个过道,更不用说完成了。
换句话说,如果你让太多的连接进入,吞吐量会停滞(达到某个限制)并且延迟会受到严重影响。
需要注意的事项:
在您的情况下,默认
MAX_CONNECTION
值为 151 个连接,而 MySQL 实例仅达到 46 个连接MAX_USED_CONNECTIONS
(到目前为止,该实例只有 46 个并发连接)。为了
RAM
根据max_connection
限制增加,您可以通过在以下站点上填写您的实例参数值来获得估计值,这将获得RAM
当您的实例达到MAX_CONNECTION
限制时将使用的近似值:https://www.mysqlcalculator.com/
除了 Rick James在他的回答中所说的,人为发起的数据库连接可能是长期存在的,但大多数时候它们往往保持空闲状态,不必要地占用数据库服务器资源。考虑在您的应用程序中使用连接池,并且您认为最多 15 个连接很可能足以支持池,而不会导致应用程序端等待。