我们正在为一个小社区运行一个基于 Wowonder 的社交网站,一旦在线用户达到 100 人,我们的网站就会因 CPU 使用率过高而变得非常慢。脚本本身应该没问题,因为其他客户都没有遇到这个问题,所以我相信我们这边肯定出了问题。这是我们在线 100 名用户的浏览报告: 浏览报告。 如您所见,即使设置了缓存策略,我们的 CPU 使用率仍然太高。我们尝试在没有 query_cache 的情况下运行,但结果是一样的。
[mysqld] innodb_buffer_pool_instances = 26 innodb_file_per_table = 1 innodb_read_io_threads = 16 innodb_write_io_threads = 16 innodb_buffer_pool_size = 26G innodb_io_capacity=300 innodb_log_file_size=3G performance_schema=ON table_definition_cache=10000 join_buffer_size=256M skip-name-resolve key_buffer_size = 512M max_allowed_packet = 512M thread_stack = 192K thread_cache_size = 10 myisam_recover_options = BACKUP max_connections = 1000 query_cache_type = 1 query_cache_limit = 256K query_cache_min_res_unit = 2k query_cache_size = 50M
如前所述,代码本身应该没问题,因为它在其他实例上运行良好,但在这个实例上运行不佳。任何想法都将不胜感激。如果我能以某种方式提供帮助,请告诉我,我没有主意了。
答案1
一般来说,CPU 使用率高意味着查询速度慢(索引不良或设计不良)。配置通常影响要小得多,而配置不当通常会降低 CPU 使用率并降低查询速度。
话虽如此,您的配置的某些部分非常糟糕:
join_buffer_size=256M
这很可能会增加你的 CPU 使用率和这会降低您的性能。将其注释掉,保留默认值。
您几乎肯定不需要触及这些默认值,因此可以考虑将它们注释掉:
thread_stack = 192K
thread_cache_size = 10
这些通常弊大于利:
query_cache_type = 1
query_cache_limit = 256K
query_cache_min_res_unit = 2k
query_cache_size = 50M
考虑替换为:
query_cache_type = 0
query_cache_size = 0
答案2
我的答案是补充@Gordan Bobic
检查哪些查询很慢:
mysql -e "SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND<>'Sleep' and TIME > 5"
对于每个缓慢的查询,运行解释在查询中。您可以安装 Percona Tools 并运行pt-visual-解释以便更好地表述该EXPLAIN
陈述。
如果您使用 InnoDB 引擎,您可以看到它正在执行的操作:
mysql -e "show engine innodb status \G"
其他详细信息请参阅MySQL 性能架构其中包括剖析器也。这里这是一篇关于分析器的 Percona 文章。
如果你想更好地了解 CPU 利用率,可以使用perf
+火焰图。