分类: 服务器与存储
2011-01-15 17:45:52
近20年来, CPU的速度提高了上百倍, 内存的速度提高了几十倍, 网络接入也从56K ADSL猫发展到了10Mb的拨号网络.
但是磁盘的IO速度却一直止步不前, 从IDE到15000转SCSI, 价格高了十几倍, IO性能却只提高了三倍左右.(按照2.5" 1500RPM Savvio计算)
随着英特网的发展, 服务器磁盘越来越显得力不从心, 一些服务器被迫使用磁盘阵列来解决问题.但是成本也随之大幅度增加.
磁盘IO瓶颈:
也许有人会说SAS的传输速度能达到6GB. 但是这对于大多数服务器来说是没有用的. 服务器需要的主要是磁盘的随机访问速度.(因为英特网用户访问的文件是随机的), 即IO速度. 而不是传输速度.
与CPU, 内存这些电子产品不同的是, 磁盘必须依赖于机械式的磁头, 当我们读/写磁盘时, 这个机械臂必须移动到相应的磁道上面来读取数据.
我们可以在磁盘的参数列表中, 看到机械臂的性能参数: 平均寻道时间.
对于7200转的IDE硬盘, 平均寻道时间在10-13ms左右. 让我们用1秒来除以10ms, 结果是100.
这意味着按照平均寻道时间来算, 我们每秒只能执行100次寻道操作. 对于大型服务器来说, 这是远远不够的.
传统文件系统的缺陷:
上一节我们指出了, 普通IDE硬盘每秒只能执行100次寻道操作. 那么这100次寻道操作, 能读取多少个文件呢??
1 在传统文件系统中, 每次读文件之前先要找到inode节点(通过open系统调用), inode节点也是存储在硬盘中的, 这就多出了一次磁盘寻道.
2 为了支持”修改文件”的功能, 传统文件系统会” 在每次需要用到新磁盘扇区时, 分配磁盘空间”. 例如我们写100KB的数据, 文件系统会分配200次空间, 每次一个磁盘扇区512字节. 文件系统会尽可能的保证连续分配空间. 但是当磁盘运行时间较长后, 碎片较多, 会导致很多文件无法连续存储, 每读一个文件都要跳跃几次.
从实际测试结果来看, 7200转IDE硬盘每秒读文件的个数仅仅在30次左右.(文件大小4-20KB, 总计40GB文件, 随机读).
服务器文件使用的特征和高速文件系统:
大部分服务器在对磁盘进行操作时, 可以保证”文件建立后, 可能会被删除, 但是永远不会进行修改”.
于是我们可以在创建文件时即确定好文件的大小, 分配磁盘空间, 保证文件一定是连续的. 这样就可以避免文件碎片对IO性能的影响.
简单的改动即可带来大幅度的性能提升.
我们还可以进一步优化. 将文件所在的磁盘起始地址存储在应用层的hash表中, 仅仅存储文件名, 磁盘地址, 长度, 时间戳(用于出错恢复)就足够了.
经过测试, 我们发现新文件系统的读IO速度是ext3的3-5倍. 并且测试时间越长,ext3的碎片就越多, 速度也会变慢;而新文件系统的IO速度一直都是稳定的.
这个文件系统的缺点在于会浪费磁盘空间. 我在三个大型网络中, 对采用这种文件系统的http缓存设备进行了为期一个月的测试(包括一个5000人的企业网, 和两个万人规模的宽带运营商); 结果表明对磁盘空间的浪费仅在15-20%之间.