mysql thread_cache_size 减少 CPU 和最大连接数?

mysql thread_cache_size 减少 CPU 和最大连接数?

最近发现我的 MySQL 服务器在模拟超过 100-500 个线程的并发请求时 CPU 利用率达到 90%

使用默认设置,并在 my.cnf 中添加以下内容

最大连接数 = 500
最大允许数据包 = 16M

我注意到 max_connection 可以达到 500,threads_created 也可以达到 200-500,我认为这实际上导致了 CPU 异常高

因此我没有使用默认设置而是进行了调整

innodb_buffer_pool_size = 2G #32位linux服务器
innodb_log_file_size = 256M
innodb_log_buffer_size = 8M
innodb_thread_concurrency = 16
innodb_flush_method = O_DIRECT
innodb_additional_mem_pool_size = 20M
表缓存 = 1028
线程缓存大小 = 16
密钥缓冲区大小=32M
查询缓存大小=32M
连接缓冲区大小=1M

使用相同的负载测试,CPU 下降到 10% 甚至更低...但是我注意到 max_connection 再也没有达到 500。现在小于 50...

这是由我调整的thread_cache_size引起的吗?默认情况下,它是0。还是哪里出了问题...我想知道在这种情况下,mysql服务器是否使用最大连接进行了正确的测试。我想测试并发线程是否可以达到max_connections,但不知何故它从未达到我之前测试的相同数量。自从改变以来,它现在从未超过50。

任何想法?

答案1

这是由我调整了thread_cache_size引起的吗?

我认为不是。您改进了许多设置,这样您的查询将更快地完成,从而减少线程数。thread_cache_size应该在出现大量连接时启动,并根据http://dev.mysql.com/doc/refman/5.1/en/miscellaneous-optimization-tips.html

使用持久连接来避免连接开销。如果您无法使用持久连接,并且正在启动许多新的数据库连接,则可能需要更改 thread_cache_size 变量的值。

答案2

我认为是的。每次关闭连接时,MySQL 都会将线程缓存中处于空闲状态的线程数与 的值进行比较thread_cache_size。如果缓存中已经有这么多线程,则销毁为断开连接的会话提供服务的线程。如果没有,则将线程放入缓存中。

每次建立新连接时,服务器都会检查线程缓存,看看缓存中是否有可用的线程来为新连接提供服务。如果有,则将其从缓存中删除并分配给新连接。如果没有,则生成一个新线程。

显然,重用线程比创建和销毁线程占用的 CPU 更少,所以是的,拥有非零线程缓存很有用,特别是当您频繁连接和断开连接时......可能会以增加内存利用率为代价,因为缓存中的线程(据我所知)不会释放它们分配给自己的任何内存,即使该内存高于分配给每个新线程的基线。

计数器threads_created告诉您线程缓存无法提供多少个连接。

相关内容