内存还是硬盘? 数据库IO瓶颈时的抉择

运维 数据库运维
数据库IO瓶颈有两个解决方法:一是增加内存;二是增加磁盘。到底是加内存合算,还是加磁盘实惠呢,Jim Gray在20年前给出的“五分钟规则”也许可以帮到我们。

很多DBA在进行数据库管理时通常都会遇到数据库IO瓶颈,在硬件成本预算有限的情况下,解决这一瓶颈有两个方法:一是增加内存;二是增加磁盘(假设不增加机器的情况下)。到底是加内存合算,还是加磁盘实惠呢,这是个头疼的问题。

已经神秘消失的数据库大师Jim Gray早在20年前就为我们考虑过这个问题了,并且得出一个结论叫“五分钟规则”(Five Minutes Rule),就是说如果一个页面每五分钟就会被访问一次的话,就应该把它放到内存中去,否则就应该把它存储在磁盘上。这样,数据库只要统计一下有多少页面的访问频率超过五分钟一次,就知道需要多少内存了。

当然五分钟是个典型值,或者表示一个数量级,具体的值要看硬件条件。Jim Gray给出的公式是:

RI = 每M数据页数 * 一块磁盘的价格 / 磁盘每秒能进行的随机IO次数 / 每M内存的价格

其中RI即为要放到内存的页面访问时间周期阈值。

这个一公式可以这么理解。假设你拿到一个页面,它的访问周期是I。你要决定是买内存来存储这个页面还是买磁盘来存储它。假设买内存来存储,开销很容易算出来是"每M内存价格/每M数据页数"。如果买磁盘来存,则开销是"一块磁盘的价格 / 磁盘每秒能进行的随机IO次数 / I",意思是说,我买个磁盘花的钱是“一块磁盘的价格”这么多,再我这个页一秒只会访问"1/I"次,因此我只占用了磁盘带宽的"1/I/磁盘每秒能进行的随机IO次数",因此为这个页花的开销就是“一块磁盘的价格 / 磁盘每秒能进行的随机IO次数 / I"。

这样,导致内存开销"每M内存价格/每M数据页数"与磁盘开销"一块磁盘的价格 / 磁盘每秒能进行的随机IO次数 / I"相等的I值即为访问时间周期阈值,计算出来就是公式中的RI。

在数据库IO瓶颈时,针对当前常用硬件来计算一下。设页面大小为16K(InnoDB默认页面大小),也就是每M数据页数64,一块SAS盘算3000块,每秒能进行200次随机IO,4G的内存算3000块一条,也就是每M内存0.75元。这样算出来RI是1280秒,也就是20分钟左右。

可惜的是MySQL并不提供页面的访问频率统计功能。可以用一个方法来代替,就是把数据库关掉,起来后看20分钟内数据库的缓存有没有满,若没有满,表示内存太大,否则表示内存太小。只是在热门时间段肯定是不会去做这个实验的,非热门时间段倒是可以把数据库重起下,但这时负载轻又不准了。即使是哪天MySQL crash了,在热门时间段crash后要做很多redo,又不准了。

实际上这一功能是可以实现的,统计有多少个20分钟访问一次的页面可以近似的转化为统计20分钟内有多少个不同的页面被访问。假设系统中内存大小与理想值相差不太大,则只需要多用不到1/1000的内存就可以统计出来,当然每次页面访问时要多搜索一个哈希表。嗯,在NTSE里准备实现吧,哈哈。

当然这一计算已经忽略了很多实际因素,比如如果你机器上的RAID卡已经满了不能加硬盘,那就只好加内存了,如果内存槽插满了,那就只好加硬盘了。如果硬盘和内存都加不了,那就加机器吧。另外上述计算假设页面访问是完全随机的,如果是顺序访问,那就大不相同了,这时的RI会小很多,因为这时磁盘每秒能读入的页面数增加了。

 

【编辑推荐】

  1. MySQL数据库性能优化的关键参数
  2. 磁盘排序对Oracle数据库性能的影响
  3. 优化数据库大幅度提高Oracle的性能
  4. 数据库机时代将到来 DBA面临新挑战
  5. 高手详解SQL性能优化十条经验
责任编辑:佚名 来源: Web思想
相关推荐

2013-07-02 09:34:58

数据库HadoopNoSQL

2024-05-08 08:14:18

数据库IO备份

2011-04-14 09:38:55

内存数据库

2015-10-28 14:45:35

ORACLE AIO异步IO

2015-10-28 17:39:04

ORACLE AIO异步IO

2023-12-18 14:55:00

Oracle数据库监控

2021-07-01 10:45:08

硬盘数据库性能

2009-12-31 09:23:59

2021-08-20 10:41:47

开发工具代码

2009-06-30 15:22:00

Java还是.NET

2011-04-14 09:27:37

内存数据库

2022-12-07 18:45:22

内存数据库Redis

2019-08-15 07:00:54

SQLite数据库内存数据库

2010-11-04 09:07:25

2011-08-03 14:02:02

数据库连接ACCESS

2023-01-24 15:58:39

数据库架构编程语言

2018-07-13 15:56:39

缓存数据库数据

2011-07-27 15:01:48

MySQL数据库内存表

2011-03-17 16:51:51

SQLServer数据加速剂

2020-02-24 21:50:24

瓶颈数据库
点赞
收藏

51CTO技术栈公众号