注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风轻扬

活着就是为了追求幸福

 
 
 

日志

 
 
关于我

关注互联网应用架构、分布式与海量数据处理技术、云计算、数据库技术

网易考拉推荐

数据库IO瓶颈时要加内存还是磁盘?  

2008-07-23 23:06:05|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
很多数据库应用通常都会遇到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。

针对当前常用硬件来计算一下。设页面大小为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会小很多,因为这时磁盘每秒能读入的页面数增加了。
  评论这张
 
阅读(2546)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017