Mar*_*tin 26 mysql tuning .net connections
我正在将 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
Run Code Online (Sandbox Code Playgroud)
这给出了 Threads_created / Connections = 0,1392。
所以从那看来我需要增加thread_cache_size.
但是,如果我运行,SHOW PROCESSLIST我总是会看到由于 .Net 创建的池,我有很多连接打开(其中大部分在休眠)。我是否仍然需要设置,thread_cache_size因为我仍然会重用连接池中的连接?如果池大小为 150,您认为将其设置thread_cache_size为 150+ 是否合适?这会大大影响 CPU 和内存吗?
Rol*_*DBA 44
根据 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。至少,thread_cache_size应该大于Max_used_connections。
Tom*_*ski 13
根据 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 甚至任何接近该大小的缓存只有在您的线程中有大量流失时才有意义...在一个表现良好的应用程序中,情况并非如此。
https://dba.stackexchange.com/a/28701
| 归档时间: |
|
| 查看次数: |
74851 次 |
| 最近记录: |