我正在使用Asp.Net和MySQL。 在.Net连接string中,我将“最大池大小”设置为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创build的池,我打开了很多连接(其中大部分都处于睡眠状态)。 我仍然需要设置thread_cache_size
因为我仍然会重用连接池中的连接吗? 如果池大小是150你认为一个很好的价值是将thread_cache_size
设置为150+? 这会影响CPU和内存吗?
基于MySQL文档中的信息,您应该执行以下操作:查找使用Connections , Threads_created和Max_used_connections的最大同时连接数mysqld的数量,
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
。 至less, thread_cache_size
应该大于Max_used_connections
。
根据MySQL文档,您应该设置thread_cache_size
以便大多数新连接使用caching中的线程而不是新创build的线程。 这节省了一些线程创build的开销,尽pipe通常不会产生显着的性能改进:
如果可能的话,重用使用高速caching的线程来满足线程请求,并且只有当高速caching为空时才创build新的线程。 如果您有很多新的连接,可以增加此variables以提高性能。 通常情况下,如果你有一个好的线程实现,这不会提供显着的性能改进 。 但是,如果您的服务器每秒看到数百个连接,则通常应将thread_cache_size设置为足够高,以便大多数新连接使用caching线程 。 (资源)
这意味着你应该设置你的thread_cache_size
以便Threads_created / Connections
(导致创build新线程的连接的百分比)相当低。 如果你从字面上(“最”)的MySQL文档,值应该是<50%。 RolandoMySQLDBA的回答是<1%。 我不知道谁更接近真相。
您不应该将thread_cache_size
设置为高于Max_used_connections
。 RolandoMySQLDBA答案中的最后一句(至lessthread_cache_size应该大于Max_used_connections)似乎不合理,因为它说你应该在caching中保留比你的服务器更多的线程。 无论如何,MySQL永远不会把那么多的线程放在caching中 – 它不会先把线程放入caching中 – 它只会在客户端创build一个线程并断开连接后才将它们放到那里。 如果您从未有X客户端同时连接,则caching中永远不会有X个线程:
当客户端断开连接时,如果线程数less于thread_cache_size,客户端的线程将被放入caching中。 (资源)
另请参阅Michael的这个答案 :
将thread_cache_size设置为一个大于max_connections的值看起来是非常不利的build议……caching不可能比max_connections大,甚至在任何接近该大小的caching中,只有在线程上有大量的stream失时才有意义…在一个乖巧的应用程序中,情况并非如此。
在平常的工作日,“新雇用”可能需要一个连接? 大多数魔术师不知道在接下来的几天里可以雇多less人。 MySQL的V8build议CAP的thread_cache_size为100,以防止过载而不pipemax_used_connections。 对我来说,100是一个很好的CAP。