一尘不染

可以让 MySQL 使用多个内核吗?

mysql

我收到了一些专用的 MySQL 服务器,它们从不使用超过一个内核。我比 MySQL 的 DBA 更像开发人员,所以需要一些帮助

设置

这些服务器在 OLAP/DataWarehouse (DW) 类型的负载下非常庞大:

  • 主要:96GB RAM,8 核 + 单个 RAID 10 阵列
  • 测试:4 核 32GB RAM
  • 最大的 DB 为 540 GB,总量约为 1.1TB,主要是 InnoDB 表
  • Solaris 10 Intel-64
  • MySQL 5.5.x

注意:最大的 DB 是从 OLTP DR 服务器复制的 DB,DW 是从这里加载的。它不是一个完整的 DW:仅持续 6 个月到 6 周,因此它比 OLTP DB 小。

测试服务器上的观察

  • 3个独立的连接
  • 每个都有一个并发的(和不同的)ALTER TABLE...DROP KEY...ADD INDEX
  • 这 3 个表有 2.5、3.8 和 450 万行
  • CPU 使用率高达 25%(一个核心被最大化)并且没有更高
  • 3 个 ALTER 需要 12-25 分钟(最小的单个需要 4.5)

问题

  1. 需要什么设置或补丁才能允许使用多个内核?
    也就是说,为什么 MySQL 不使用所有可用的内核?(与其他 RDBMS 一样)
  2. 这是复制的结果吗?

其他注意事项

  • 我了解 RDBMS“线程”和操作系统“线程”之间的区别
  • 我不是在问任何形式的并行性
  • InnoDB 和线程的一些系统变量不是最佳的
    (寻求快速获胜)
  • 短期内,我无法更改磁盘布局
  • 如果需要,可以调整操作系统
  • 最小表上的单个 ALTER TABLE 需要 4.5 分钟(令人震惊的 IMO)

编辑 1

  • innodb_thread_concurrency 在两者上都设置为 8。是的,这是错误的,但不会让 MySQL 使用多核
  • innodb_buffer_pool_size 在主数据库上是 80GB,在测试上是 10GB(另一个实例已关闭)。现在可以了。
  • innodb_file_per_table = ON

编辑 2

  • innodb_flush_log_at_trx_commit = 2
  • innodb_use_sys_malloc = ON
  • innodb_flush_method 应该是 O_DIRECT (但是 SHOW VARIABLES 没有显示这个)
  • innodb_doublewrite = 关闭
  • 文件系统 = ZFS(我的系统管理员发现了这个:http: //blogs.oracle.com/realneel/entry/mysql_innodb_zfs_best_practices)

去测试

  • innodb_flush_method 不应该显示为 O_DIRECT
  • 将遵循 RolandoMySQLDBA 的设置

如果我错过了任何重要的事情,请告诉我

干杯

更新

在 RolandoMySQLDBA 的答案中更改了 innodb_flush_method + 3 x 线程设置
结果:> 1 个核心用于测试 = 阳性结果


阅读 62

收藏
2022-10-08

共1个答案

一尘不染

我学到了一些令人惊讶的东西:尽管有文档,最好离开innodb_thread_concurrency0(无限并发)。这样,InnoDB 决定innodb_concurrency_tickets为给定的 MySQL 实例设置打开的最佳数量。

设置innodb_thread_concurrency为 0 后,您可以将innodb_read_io_threadsinnodb_write_io_threads(从 MySQL 5.1.38 开始)设置为最大值 64。这应该会占用更多内核。

2022-10-08