thread_cache_size减少CPU和最大连接?

时间:2011-12-29 07:48:43

标签: mysql

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

使用默认设置以及my.cnf中的以下内容

max_connections = 500
max_allowed_packet = 16M

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

因此,而不是使用我调整的默认设置

innodb_buffer_pool_size = 2G #32bit linux server
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
table_cache = 1028
thread_cache_size = 16
key_buffer_size=32M
query_cache_size=32M
join_buffer_size=1M

通过相同的负载测试,CPU下降到10%以下...... 但是我注意到max_connection永远不会达到500。 现在不到50 ......

这是由我调整过的thread_cache_size造成的吗?默认情况下为0。 或者某处有什么问题...我想知道在这种情况下是否使用max连接正确测试了mysql服务器。我想测试并发线程如何能够达到max_connections但不知何故它从未以我之前测试的相同数量命中。 自改变以来,它现在永远不会达到50以上。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

创建新线程(因为我猜你的应用程序不使用连接池)需要相当大的开销。由于MySQL以这种方式重用线程(最多16个),它不再使用额外的CPU来创建线程,并且很可能及时完成操作,因此更快地关闭连接并因此保持一次打开更少的连接。

只是猜测: - )

答案 1 :(得分:0)

您使用

innodb_thread_concurrency = 16 

是限制活动的主要参与者。参见

https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_thread_concurrency

详细说明和测试建议。

默认值为0 =无限制使用并发innodb_threads - 但危险在于过多地同时运行的有效innodb_threads系统上下文切换。