我最近将我的旧款 4GB Core2duo Mac 和 OS X 10.6.8 换成了 16GB 4 核 i5、SSD 和 10.7.2。
新系统除了 mysqld 之外,其他一切都非常快。在轻负载下运行良好,但当我给它一些实际工作时,它的行为就非常奇怪了。
我尝试过 mysql-5.1.59-osx10.6-x86_64 和 mysql-5.5.16-osx10.6-x86_64,结果类似。
工作负载是一个批处理文件,它使用我们从供应商处获得的大型数据库,并将数据处理成可在生产服务器上的应用程序中使用的格式。在旧 Mac 上,它需要 3 到 4 个小时才能运行。
在新版本上,它会在一段时间内快速运行,然后陷入停滞,之后每个查询运行速度都慢得惊人,IO 很少,CPU 在一个核心上固定在 100%(批处理文件通过常规 mysql cli 客户端一次只运行一个查询)。其他应用程序的速度也严重下降,并且占用大量 CPU,尽管根据 top 的说法,有 10GB 的非活动内存。
例如,现在 mysqld 正在运行
select t.t_id, a.a_id from t inner join a on a.x=t.x into outfile;
此查询已运行约一小时,而在旧系统上仅需 4 分钟。它在一个核心上使用 100% 的 CPU,并且每分钟左右将 1MB 块写入输出文件。使用 iosnoop,我看不到表 a 或 t(均为 MyISAM)的任何读取,因此我猜它们缓存在 VM 中。相关索引已预加载到 MyISAM 键缓冲区中。因此肯定不存在 IO 瓶颈。然而,这个新系统比旧系统慢得多(约 20 倍)。
我有 5.5 性能模式,但我不理解它。我有 dtrace,但除了使用 iosnoop 等给定实用程序外,我不太擅长驱动它。
到底发生了什么?我该怎么做才能发现相关信息?
编辑:这是 my.cnf 对 mysqld 的全部内容 — 其它所有内容均为默认设置。
[mysqld]
datadir = /Users/fsb/mysql
port = 3306
socket = /tmp/mysql.sock
key_buffer_size = 1536M
performance_schema = ON
答案1
您的观察一点也不令人惊讶。
如果说我多年来作为 MySQL DBA 学到了一件事,那就是:MySQL 的性能提升完全取决于您的配置。我可以绝对肯定地说这一点,因为我已经安装了 PostgreSQL 和 MySQL,并且已经看到 PostgreSQL 的“开箱即用”性能比 MySQL 的“开箱即用”性能好得多。
为了证明这一点,除了我自己的观点之外,
Percona 最近在 MySQL 的多个版本之间进行了一场“大逃杀”
- MySQL 4.1
- MySQL 5.0
- MySQL 5.1(内置 InnoDB)
- 带有 InnoDB 插件的 MySQL 5.1
- MySQL 5.5
- MySQL 5.6
所有测试都是在未配置 MySQL 的情况下进行的。结果如何?
- MySQL 4.1 在单线程环境中表现最佳
- 带有 InnoDB 插件的 MySQL 5.1 在多核上的扩展性优于内置 InnoDB 5.1、5.5 和 5.6
我能从中得到什么?您必须配置 MySQL 5.5/5.6 才能使用多核增强功能。
鉴于您正在使用的 my.cnf,MySQL 仍然在运行,就所有意图和目的而言,“开箱即用”。
请执行必要的尽职调查(查询调整、所需配置、数据库基础设施、适当的存储引擎选择和调整),以使 MySQL 达到最佳性能并为您提供更好的服务。
答案2
您有足够的交换空间吗?
您的 /tmp 和 /var/tmp 空间是否足够?
我只是提出一个大胆的猜测,但是 MySQL 数据库的 tmp 空间怎么样?