为 MySQL 找到 I/O、CPU 和 RAM 的最佳平衡

为 MySQL 找到 I/O、CPU 和 RAM 的最佳平衡

长期以来,我一直想知道当您向服务器添加更多内存时,MySQL 如何扩展。我们在尽可能利用硬件、限制系统复杂性和降低性价比之间寻找平衡。请针对此问题提出适当的解决方案。

答案1

虽然没有一种万能的解决方案可以适用于所有环境,但性能调优的过程总是相同的。性能调优是一个迭代过程:

  1. 基准测试和跟踪指标
  2. 找到瓶颈
  3. 解决瓶颈
  4. 重复

当你解决每个瓶颈时,你可能会发现系统的另一部分现在成了限制因素。这就是为什么你需要重复这个过程,直到你对结果满意。

在各个级别的绩效分析中,主要需要关注的是潜伏哪些活动占用了最多的时间?哪些活动处于用户活动的关键路径中?关键路径中的延迟是衡量用户痛苦的直接指标,而吞吐量、iops、cpu 和内存使用率等其他指标则没有明显的含义。

确定您的慢查询并对其进行优化——如果可能,请重写查询或添加索引,但如果不可能,请添加硬件。如果您的指标显示查询的大部分时间都花在等待从磁盘读取上,那么添加内存以增加缓存将有助于解决该瓶颈。如果大部分时间都花在等待同步写入磁盘上,请获取更多磁盘或获取更快的磁盘(例如 SSD)。如果大部分时间都花在等待 CPU 时间或 CPU 上,请获取更多或更快的 CPU。

如果你有机会在具有 DTrace 的系统上运行数据库,请阅读Brendan Gregg 的 DTrace 书并得到启发。

答案2

长期以来,我一直想知道 MySQL 在服务器中添加更多内存时如何扩展

非常类似于 Oacle、SQL Server 和所有其他数据库服务器。ACID 条件下的数据库操作的物理原理不会改变。

我们在尽可能利用硬件、限制系统复杂性和降低性价比之间寻求平衡。请针对此问题提出适当的解决方案。

最佳汽车是什么样的?

相同的答案:视情况而定。你没有说出任何与答案相关的内容,投票关闭。

瞧,我运行一个 SQL 服务器。小型安装 - 仅 16GB 内存、4 个内核、8 个快速硬盘和 1 个 SSD + 启动驱动器。是的,这很小 - 在另一个世界(另一个合同)我使用一个 Oracle Exadata,它有 21000 GB 的数据库空间,比大多数超级跑车都要贵。因为我们需要它。我下次升级我的 SQL 服务器时,将有 80 个磁盘、128GB 内存和更多的 SSD。这里的大多数人会认为这很大,我认为它是一个不错的低端服务器。

您可能认为 60GB SSD 很贵。您不会说。您没有说您需要做什么,有多少负载。您指望我们回答什么?

唯一明智的答案是:调整瓶颈,并规划扩展。例如,SuperMicro 拥有 4 个机架单元高服务器机箱,最多可容纳 72 个磁盘,外加主板。2 个机架单元 = 24 个磁盘。其中之一为您提供计算机可扩展性。获得多处理器 CPU 板,然后插入一个。RAM 也一样。在瓶颈出现时解决它们。知道你在做什么 ;) 当您获得更高端的数据库时,降低系统复杂性是徒劳的。这就像一个 5 星级厨师说他不想做饭,而更喜欢预制食物。更高性能的数据库系统很复杂。处理它。

答案3

这取决于您使用的引擎。最常见的 MyISAM 引擎在这方面相当笨拙 - 它本身不进行任何有意义的内存管理。几乎所有事情都留给操作系统。如果操作系统的分页算法能够确定引擎下一步可能需要什么,它会将正确的内存页留在文件系统缓存中。如果不能,它会将它们丢弃,并且必须再次从磁盘加载它们以进行下一个查询。

由于操作系统不了解 MyISAM 数据结构,因此它不会优先考虑数据库的索引页,除非它们与数据库中“最近使用”的数据相似。计算世界中的所有其他“适当”DBMS 都会进行自己的内存管理,有时甚至在操作系统之上进行自己的线程管理作为性能优化措施 - 因此在缓存时优先考虑索引表,并将更改的数据行页在内存中保留一段时间,然后再将它们写入磁盘(“惰性写入器”)。

因此,对于主要读取 MyISAM 数据库的明确衡量标准是在系统上获取比其所服务的数据库大小更多的 RAM - 这样您可以确保缓存所有索引页并减少昂贵的 I/O 操作。

如果您正在寻找具有“真实世界”查询的平衡且可调的性能(超过用于 PHP 应用程序的“SELECT * from A LIMIT 10”),那么您绝对应该寻找不同的 DBMS。

相关内容