找回密码
 注册
搜索
热搜: 超星 读书 找书
查看: 299|回复: 0

[【推荐】] 内存还是硬盘? 数据库IO瓶颈时的抉择

[复制链接]
发表于 2009-11-17 10:16:34 | 显示全部楼层 |阅读模式
很多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会小很多,因为这时磁盘每秒能读入的页面数增加了。

http://database.51cto.com/art/200911/163350.htm

点评:

数据库IO瓶颈有两个解决方法:一是增加内存;二是增加磁盘。到底是加内存合算,还是加磁盘实惠呢,Jim Gray在20年前给出的“五分钟规则”也许可以帮到我们。比如如果你机器上的RAID卡已经满了不能加硬盘,那就只好加内存了,如果内存槽插满了,那就只好加硬盘了。如果硬盘和内存都加不了,那就加机器吧。另外上述计算假设页面访问是完全随机的,如果是顺序访问,那就大不相同了,这时的RI会小很多,因为这时磁盘每秒能读入的页面数增加了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|网上读书园地

GMT+8, 2024-11-20 23:14 , Processed in 0.139189 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表