建议

建议

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

MySQL 复制性能

我们有一个新的主数据库服务器(服务器版本:5.5.27-log MySQL Community Server)位于裸机服务器上,其规格如下:

  • 2 个英特尔 E5-2620-v2
  • 64GB 内存
  • 2 个 Fusion-io 600Gb 卡 (Raid 1),用于 MySql
  • 1 个适用于 Centos 6.5 的 SSD
  • 1Gbps 网络

超线程尚未在服务器上禁用,因为对于这是否有助于大内存系统存在不同的看法,但我们并不反对尝试它。

我们目前将数据复制到在 SSD 集群上虚拟化的 3 个从属服务器。我们原本要复制到 4 个从属服务器,但这似乎对 SSD 集群来说太多了,而且我们出现了一段时间的延迟。

所有表都是 InnoDB,主数据库和从数据库写入介于3.5K - 2.5K QPS, 同时 阅读在主人身上7.5k - 10k QPS

主DB的设置如下:

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 负载,尤其是 Sys Cpu。从 mpstat 中可以看到,iowait 为 0%,而 %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

之前从来没有出现过任何问题,尽管 SQL 吞吐量较低,但服务器运行多年且没有故障。

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

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

连接数范围约为 200-400,其中约 100-200 个正在运行。Innodb 缓冲池命中率为 100%。从未创建过交换内存,因此我看不出这是问题所在:

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

我们与 New Relic 有大量的合作历史,但不幸的是我无法在这里粘贴截图。

我已经浏览过无数类似这样的博客和问答,但找不到任何原因或解决方案,所以我把它放在那里。有什么想法吗?

更新

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

系统负载

查询加载

答案1

InnoDB 和 FusionIO 单独运行时对 CPU 的占用非常大,而组合使用时则更是如此。

我有关于此的旧帖子

这里的关键是调整 InnoDB 时要更自由一些。

建议

您需要选择以下一项或多项建议:

试一试 !!!

相关内容