IO和性能

sulong 于 2009-07-03 说两句 »

最近几天看了几家互联网公司的和架构有关的PPT,有支付宝,linkedin,douban等。这些公司所使用的具体的技术有差别,但是为了能做到支持大规模访问,他们都在与缓慢的IO做斗争! 比如说豆瓣网的历次架构变迁,不是因为磁盘IO成为瓶颈,就是因为网络IO成为瓶颈。如果能把IO的问题解决掉,那么对于互联网企业来说,性能问题就解决掉一半了,我想。

与飞速的CPU和内存相比,磁盘和网络的IO慢如蜗牛,这是问题的根源。如果没有大规模廉价而又足够快的存储方案出现的话,这个问题还将继续下去。我们只能期待这一革命性的技术出现来从根本上解决这一问题吧!

那对于现在的我们该怎么办呢?大家的想法可能都是一样的,一是加快IO速度,二是避免不必要的IO。豆瓣曾经通过购买更高性能的硬盘来解决这个问题,如果想要更好的效果,需要投入更多的资金来购买整套的高性能存储方案,但是这成本太高了,很多公司后来都会放弃。于是大部分公司都会极力采用后者,就是避免不必要的IO,缓存就是用来做这样的事的。

将低速介质上的数据放到高速介质上,访问者先访问高速介质,在找不到需要数据时才访问低速介质,以此来提升访问数据的速度,这样的技术就是缓存了。设在一段时间内有m次没有命中缓存,n次命中,而访问一次缓存的时间是t1, 访问慢速介质的时间是t2,那么为了是缓存有效就得满足不等式: m * (t1 + t2) + n * t1 < (m + n) * t2, 于是有 m / n < t2 / t1 -1 。由此可见,在介质的速度比一定的情况下,命中比率要高于一定的值,缓存才有效果。提高命中比率,就是要把那些最常用的数据放到缓存里。另一方面,缓存里数据如果被修改了,就要同步到低速存储介质中,同样的,如果低速存储介质的数据被修改了,也要同步到缓存里。如果加上同步的开销,就需要更高的命中率。提高命中率和保证数据的同步,是使用缓存的两个艰巨的任务。

豆瓣网使用memcache,还使用专门的nigix服务器来提供图片的服务,其实也是cache。linkedin则使用了数十台大内存的服务器作为缓存服务器,运行着用c++写的专门的缓存程序。可见这些网站在使用缓存方面都是不遗余力呀。如果能把缓存用好,那么就把一大半的IO问题解决掉了。

IO往往会成为程序的瓶颈,因此,程序员应当时刻的注意,你写的代码是否在进行IO操作,是否可以减少IO操作,等等。

  • Share/Bookmark
Advertisement

6 comments

  1. imlsq says:

    ding

    大家都是内存缓存来,缓存去,但是像银行那样的系统,需要高可靠性,安全性,一致性,数据完整性,事务性。 单靠内存缓存还是有很大的风险。

    不过网上大多都是WEB2.0的网站,数据的重要性,不是那么重要,如果是像支付宝这样的数据,估计还是需要大量IO。

  2. sulong says:

    内存缓存也可以做到安全性,一致性,数据完整性,事务性,这些都不是它的弱项。内存的问题是不能持久,一断电就什么都没了。像linkedin基本上是把所有的数据都放到了内存里,这个不应该再叫做缓存,而是内存数据库,硬盘只是用来做数据持久化用的了。如果能保证硬件的可靠性,能有良好的机制去保证数据同步到硬盘上,那么,linkedin这种方法显然会去得非常大的性能提升。

    使用不当的缓存固然问题很多,但是没有缓存那肯定是无法支持那么大的访问量的。

  3. ywdblog says:

    其实什么也没说

  4. sulong says:

    什么也没说是什么意思?

  5. wuwei says:

    缓存不错,还能做到对事务和数据完整性的处理那就堪比数据库了。
    瓶颈出来对硬盘的读写I/O上,可以对内存的数据做定时保存操作。或者是关键的数据做保存,当然起一个集群也是不错的呀。

Trackbacks /
Pingbacks

  1. I/O与性能 | haohtml's blog

说两句