我看到了一些专用的MySQL服务器,它们从未使用过多个内核。我比MySQL的DBA开发人员更多,因此需要一些帮助
设定
这些服务器非常繁重,并带有OLAP / DataWarehouse(DW)类型的负载:
- 主:96GB RAM,8核心+单个RAID 10阵列
- 测试:具有4核的32GB RAM
- 最大的数据库为540 GB,总容量约为1.1TB,大部分为InnoDB表
- Solaris 10 Intel-64
- MySQL 5.5.x
注意:最大的数据库是从OLTP DR服务器复制的数据库,而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分钟)
问题
- 要使用多个内核需要什么设置或补丁?
也就是说,为什么MySQL不使用所有可用的内核?(与其他RDBMS一样) - 是复制的结果吗?
其他注意事项
- 我了解RDBMS“线程”和OS“线程”之间的区别
- 我不是在问任何形式的并行性
- InnoDB和线程的一些系统变量不是最优的
(寻找快速的胜利) - 短期而言,我无法更改磁盘布局
- 可以根据需要调整操作系统
- 最小的桌子上的单个ALTER TABLE需要4.5分钟(震惊IMO)
编辑1
- 两者的innodb_thread_concurrency都设置为8。是的,这是错误的,但不会使MySQL使用多个内核
- innodb_buffer_pool_size在主数据库上为80GB,在测试中为10GB(另一个实例已关闭)。现在可以了。
- innodb_file_per_table =开
编辑2
- innodb_flush_log_at_trx_commit = 2
- innodb_use_sys_malloc =开
- 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个线程设置
结果:>用于测试的1个核心=阳性结果
\G
。另外,我觉得SHOW INNODB STATUS
赞成不赞成SHOW ENGINE INNODB STATUS
在5.5(我得到运行在命令行前的错误。