我正在将 Asp.Net 与 MySQL 一起使用。在 .Net 连接字符串中,我已将 Max Pool Size 设置为 150。
如果我运行以下命令,我会获得以下值:
SHOW GLOBAL STATUS LIKE 'max_used_connections'; gives 66
SHOW GLOBAL STATUS LIKE 'Threads_created'; gives 66
SHOW GLOBAL STATUS LIKE 'connections'; gives 474
由此得出 Threads_created / Connections = 0,1392。
因此,看来我需要增加thread_cache_size
。
但是如果我运行,SHOW PROCESSLIST
我总是会看到由于 .Net 创建的池,我打开了很多连接(其中大多数处于休眠状态)。我是否仍需要设置,thread_cache_size
因为我仍将重用连接池中的连接?如果池大小为 150,您认为将值设置thread_cache_size
为 150+ 是否比较好?这会对 CPU 和内存产生很大影响吗?
答案1
根据 MySQL 文档中的信息,你应该执行以下操作:找出 mysqld 使用的最大同时连接数連接,Threads_created, 和最大使用连接数,
SHOW GLOBAL STATUS LIKE 'Connections';
SHOW GLOBAL STATUS LIKE 'Threads_created';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
尝试计算以下内容
Threads_created / Connections
:如果超过 0.01,则增加thread_cache_size
。至少thread_cache_size
应该大于Max_used_connections
。
答案2
根据 MySQL 文档,您应该进行设置thread_cache_size
,以便大多数新连接使用来自缓存的线程而不是新创建的线程。这可以节省一些线程创建开销,但通常不会带来显著的性能提升:
如果可能的话,通过重用从缓存中获取的线程来满足线程请求,并且只有当缓存为空时才会创建新线程。如果有大量新连接,可以增加此变量以提高性能。通常情况下,这不会带来明显的性能提升如果你有一个好的线程实现。但是,如果你的服务器每秒有数百个连接,你通常应该将thread_cache_size设置得足够高,以便大多数新连接使用缓存线程。(来源)
这意味着您应该设置您的,thread_cache_size
以便Threads_created / Connections
(导致创建新线程的连接百分比)相当低。如果您按字面意思理解 MySQL 文档(“大多数”),则该值应小于 50%。RolandoMySQLDBA 的答案是小于 1%。我不知道谁更接近事实。
你应该不是设置thread_cache_size
为高于Max_used_connections
。RolandoMySQLDBA 的回答中的最后一句话(“至少,thread_cache_size 应该大于 Max_used_connections”)似乎没有道理,因为它说你应该在缓存中保留比服务器更多的线程曾经用途。MySQL 永远不会将那么多线程放入缓存中——它不会预先将线程放入缓存中——它只会将它们放在那里后客户端创建一个线程并断开连接。如果你从来没有同时有 X 个客户端连接,那么缓存中就永远不会有 X 个线程:
当客户端断开连接时,如果缓存中的线程数少于 thread_cache_size,则该客户端的线程将被放入缓存中。(来源)
也可以看看这个答案作者:迈克尔:
将 thread_cache_size 设置为大于 max_connections 的值似乎是非常无用的建议...缓存不可能变得大于 max_connections,甚至接近该大小的缓存也只有在您的线程有大量流失时才有意义...在表现良好的应用程序中,情况并非如此。
答案3
在普通的工作日中,新员工可能需要连接吗?大多数魔术师都不知道未来几天会招聘多少人。MySQL V 8 建议将 CAP thread_cache_size 设置为 100,以防止过载,无论 max_used_connections 如何。对我来说,100 是一个很好的 CAP。
请查看此链接。
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_thread_cache_size