最近发现我的 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
告诉您线程缓存无法提供多少个连接。