最近发现我的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以上。
有什么想法吗?
答案 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系统上下文切换。