数据存储的性能指标主要包括吞吐率与延迟,其中吞吐率指单位时间内数据存储系统能完成的操作数目,而延迟是指完成单个操作所需要的时间。高性能数据存储追求更高的吞吐率与更低的延迟,这是由持续增长的上层应用需求所驱动的。例如,“双十一”购物节的成交额逐年提升,这就要求存储系统的吞吐率匹配其上升的趋势;在延迟方面,用户越来越关注服务质量,因此存储系统要尽快地完成每一个数据访问操作,最小化用户所能感知的延迟。
为了达到高性能指标,需要对存储硬件和存储软件共同进行设计。如图1.1所示,现有的存储硬件种类多样,在性能、容量和价格方面各有优劣,例如HDD(Hard Disk Drive,硬盘驱动器)的延迟为10 ms左右,而SSD的延迟仅有10~100 μs。因此,提升存储系统性能最自然的方法就是采用更快速的存储硬件。但这面临着两个关键问题:首先,存储硬件的性能越好,通常它的成本会越高,导致整体系统价格昂贵,难以普及使用;其次,存储硬件的吞吐率越大,一般其容量会越小,这将限制整体系统能容纳的数据量,难以满足持续增长的海量数据的需求。因此,高性能目标的达成还需要存储软件的设计。
图1.1 存储金字塔
由于单个存储硬件的性能有限,存储软件经常将大量存储硬件组合起来,以提供更高的吞吐率。最早的技术包括美国加利福尼亚大学伯克利分校提出的RAID技术 [1] 。其中RAID 0将数据分散至多块磁盘,同时发挥多块磁盘的性能。除此之外,分布式存储系统也被普遍使用,该存储系统通过网络将多台存储服务器连接起来,向外部提供极高的聚合吞吐率,例如图1.2展示了我国超级计算机“神威·太湖之光”的分布式文件系统架构,它由80个I/O转发节点、144个存储节点,以及72个磁盘阵列构成,每个磁盘阵列包含60块磁盘。
提升性能还可以通过充分利用数据局部性原理设计缓存、预取等机制。数据局部性包括时间局部性和空间局部性:时间局部性是指当某份数据被访问后,在不久后将被再次访问,例如在线购物平台上某些热门商品对应的数据会被频繁地读写;空间局部性是指当某份数据被访问后,其相邻的数据也将在不久后被访问,例如当某个文件被访问后,和它处于同一个文件夹中的其余文件也很有可能被访问。利用时间局部性,存储软件在各个层级设计高效的缓存机制,将经常被访问的数据放置在更快速的系统组件中,由此能同时提升吞吐率和降低延迟。例如,在单个存储服务器中,Linux文件系统将文件数据以页缓存(Page Cache)的形式缓存在内存中,并通过LRU(Least Recently Used,最近最少使用)算法等替换算法提高缓存的命中率;在数据中心中,经常存在由Memcached等软件构建的分布式缓存集群,用于作为后端基于磁盘的存储系统的读缓存。利用空间局部性,存储软件也在各个层级设计了预取机制,也就是将未来可能要访问的数据提前从低速组件调换至高速组件。例如Linux文件系统采用了readahead预取算法,当文件被顺序访问时,会将后面的内容提前调至页缓存中。
图1.2 “神威·太湖之光”的分布式文件系统架构 [2]