MySql Fusion-io服务器上的高CPU

我刚刚阅读了这个旧的问答,其中有一些与我们类似的设置非常详细的信息,不幸的是我们的问题(现在)不是复制。

MySQL复制性能

我们有一个新的master数据库服务器(服务器版本: 5.5.27 -log MySQL社区服务器),在裸机服务器上有以下规格:

  • 2个英特尔E5-2620-v2
  • 64Gb内存
  • 2个Fusion-io 600Gb卡(Raid 1),用于MySql
  • 1个SSD为Centos 6.5
  • 1Gbpsnetworking

HyperThreading在服务器上没有被禁用,因为对这是否对大内存系统有帮助有不同的看法,但我们并不反对尝试它。

我们目前正在复制到在SSD集群上虚拟化的3个从站。 我们正在复制到4,但这对于SSD集群来说似乎太多了,我们有一段时间的滞后。

所有的表都是InnoDB,master DB和slave Writer都在3.5K到2.5K之间,而master上的读取大约是7.5k到10k qps

主数据库的设置如下所示:

long-query-time=10 slow-query-log max_connections=500 max_tmp_tables=1024 key_buffer = 1024M max_allowed_packet = 32M net_read_timeout=180 net_write_timeout=180 table_cache = 512 thread_cache = 32 thread_concurrency = 4 query_cache_type = 0 query_cache_size = 0M innodb_file_per_table innodb_file_format=barracuda innodb_buffer_pool_size=49152M innodb_buffer_pool_instances=2 innodb_read_io_threads=16 innodb_write_io_threads=16 innodb_io_capacity = 500 innodb_additional_mem_pool_size=20M innodb_log_file_size=1024M innodb_log_files_in_group = 2 innodb_doublewrite=0 innodb_flush_log_at_trx_commit=2 innodb_flush_method=O_DIRECT 

我们的问题是与CPU负载,尤其是系统Cpu。 从mpstat中可以看到,我们有0%的iowait和非常高的%sys。

 Linux 2.6.32-431.29.2.el6.x86_64 13/11/14 _x86_64_ (24 CPU) 13:57:18 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 13:57:19 all 23.35 0.00 74.65 0.00 0.00 0.88 0.00 0.00 1.13 13:57:20 all 21.95 0.00 75.50 0.00 0.00 0.96 0.00 0.00 1.59 13:57:21 all 23.74 0.00 72.63 0.00 0.00 1.00 0.00 0.00 2.63 13:57:22 all 23.88 0.00 71.64 0.00 0.00 1.17 0.00 0.00 3.31 13:57:23 all 23.26 0.00 73.89 0.00 0.00 0.92 0.00 0.00 1.92 13:57:24 all 22.87 0.00 74.87 0.00 0.00 1.00 0.00 0.00 1.25 13:57:25 all 23.41 0.00 74.51 0.00 0.00 0.96 0.00 0.00 1.12 

以前,主数据库在虚拟化服务器(与从服务器相同的SSD群集)上运行。 它在vSphere群集中拥有一台主机,其中包含:

  • 2个英特尔X5570
  • 32Gb的内存
  • SSD从集群共享

以前从来没有任何问题,服务器运行多年没有错误,尽pipeSQL吞吐量较低。

查询都很简单,并且索引已针对插入和更新进行了优化,因为在从站上执行复杂的客户端查询。 没有删除,只有插入和更新。 大多数表(都是大的表)都有主键。

一旦内存缓冲区已满,CPU使用率似乎会增加,MySql是在服务器上运行的唯一应用程序。

连接范围从大约200-400与大约100-200的那些运行。 Innodb缓冲液池命中率为100%。 没有创build交换内存,所以我不能看到这是问题:

http://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/

我们有很多New Relic的历史,但不幸的是我不能在这里粘贴截图。

我已经经历了无数的博客和Q&A这样,但无法find任何原因或解决scheme,所以我把它放在那里..任何想法?

UPDATE

看来我现在可以发布截图了。 New relic的这两个捕获在6小时窗口显示服务器上的系统负载和查询负载,中间重启mysql。

系统负载

查询负载

InnoDB和FusionIO分别是非常积极的CPU,但更是如此。

我有这个老post

  • Aug 25, 2013 : MySQL / Fusion IOconfiguration问题
  • Jun 19, 2013 : MySQL使用太多的CPU

这里的关键是在调整InnoDB时稍微宽松些。

几点build议

您需要select以下一个或多个build议:

  • 决定你想要哪个版本的MySQL
    • 升级到MySQL 5.6.21( 更好的InnoDB存储引擎 + 最新的安全补丁
    • 升级到MySQl 5.5.40( 最新的安全补丁
  • innodb_buffer_pool_instances改为8(这是MySQL 5.6的默认值)
  • 最大限度地减lessIO线程
    • innodb_read_io_threads = 64
    • innodb_write_io_threads = 64
  • 增加innodb_log_file_size = 128M以获得更好的日志写入性能
  • innodb_io_capacity到1000
  • innodb_io_capacity_max增加到2000(仅限MySQL 5.6)
  • innodb_purge_threads增加到4(仅限MySQL 5.6)
  • 比较innodb_flush_log_at_trx_commit设置为0而不是2来查看哪个刷新更平滑 (也许是其他六个中的六个)

试一试 !!!