3.2 性能分析

给定一个问题,往往会有多种设计方案,而方案评估的一个重要指标就是性能,如何在系统设计之初估算存储系统的性能是存储工程师的必备技能。性能分析用来判断设计方案是否存在瓶颈点,权衡多种设计方案,另外,性能分析也可作为后续性能优化的依据。性能分析与性能优化是相对的,系统设计之初通过性能分析确定设计目标,防止出现重大的设计失误,等到系统试运行后,需要通过性能优化方法找出系统中的瓶颈点并逐步消除,使得系统达到设计之初确定的设计目标。

性能分析的结果是不精确的,然而,至少可以保证,估算的结果与实际值不会相差一个数量级。设计之初首先分析整体架构,接着重点分析可能成为瓶颈的单机模块。系统中的资源(CPU、内存、磁盘、网络)是有限的,性能分析就是需要找出可能出现的资源瓶颈。本节通过几个实例说明性能分析方法。

1.生成一张有30张缩略图(假设图片原始大小为256KB)的页面需要多少时间?

●方案1:顺序操作,每次先从磁盘中读取图片,再执行生成缩略图操作,执行时间为:30×10ms(磁盘随机读取时间)+30×256K/30MB/s(假设缩略图生成速度为30MB/s)=560ms

●方案2:并行操作,一次性发送30个请求,每个请求读取一张图片并生成缩略图,执行时间为:10ms+256K/300MB/s=18ms

当然,系统实际运行的时候可能有缓存以及其他因素的干扰,这些因素在性能估算阶段可以先不考虑,简单地将估算结果乘以一个系数即为实际值。

2.1GB的4字节整数,执行一次快速排序需要多少时间?

Google的Jeff Dean提出了一种排序性能分析方法:排序时间=比较时间(分支预测错误)+内存访问时间。快速排序过程中会发生大量的分支预测错误,所以比较次数为228×log(228)≈233,其中,约1/2的比较会发生分支预测错误,所以比较时间为1/2×233×5ns=21s,另外,快速排序每次分割操作都需要扫描一遍内存,假设内存顺序访问性能为4GB/s,所以内存访问时间为28×1GB/4GB=7s。因此,单线程排序1GB 4字节整数总时间约为28s。

3.Bigtable系统性能分析

Bigtable是Google的分布式表格系统,它的优势是可扩展性好,可随时增加或者减少集群中的服务器,但支持的功能有限,支持的操作主要包括:

●单行操作:基于主键的随机读取,插入,更新,删除(CRUD)操作;

●多行扫描:扫描一段主键范围内的数据。Bigtable中每行包括多个列,每一行的某一列对应一个数据单元,每个数据单元包括多个版本,可以按照列名或者版本对扫描结果进行过滤。

假设某类Bigtable系统的总体设计中给出的性能指标为:

●系统配置:同一个机架下40台服务器(8核,24GB内存,10路15000转SATA硬盘);

●表格:每行数据1KB,64KB一个数据块,不压缩。

a)随机读取(缓存不命中):1KB/item×300item/s=300KB/s

Bigtable系统中每次随机读取需要首先从GFS中读取一个64KB的数据块,经过CPU处理后返回用户一行数据(大小为1KB)。因此,性能受限于GFS中ChunkServer(GFS系统中的工作节点)的磁盘IOPS以及Bigtable Tablet Server(Bigtable系统中的工作节点)的网络带宽。先看底层的GFS,每台机器拥有10块SATA盘,每块SATA盘的IOPS约为100,因此,每台机器的IOPS理论值约为1000,考虑到负载均衡等因素,将随机读取的QPS设计目标定为300,保留一定的余量。另外,每台机器每秒从GFS中读取的数据量为300×64KB=19.2MB,由于所有的服务器分布在同一个机架下,网络不会成为瓶颈。

b)随机读取(内存表):1KB/item×20000items/s=20MB/s

Bigtable中支持内存表,内存表的数据全部加载到内存中,读取时不需要读取底层的GFS。随机读取内存表的性能受限于CPU以及网络,内存型服务的QPS一般在10W,由于网络发送小数据有较多overhead且Bigtable内存操作有较多的CPU开销,保守估计每个节点的QPS为20000,客户端和Tablet Server之间的网络流量为20MB/s。

c)随机写/顺序写:1KB/item×8000item/s=8MB/s

Bigtable中随机写和顺序写的性能是差不多的,写入操作需要首先将操作日志写入到GFS,接着修改本地内存。为了提高性能,Bigtable实现了成组提示技术,即将很多写操作凑成一批(比如512KB~2MB)一次性提交到GFS中。Bigtable每次写一份数据需要在GFS系统中重复写入3份到10份,当写入速度达到8000 QPS,即8MB/s后Tablet Server的网络将成为瓶颈。

d)扫描:1KB/item×30000item/s=30MB/s

Bigtable扫描操作一次性从GFS中读取大量的数据(比如512KB~2MB),GFS的磁盘IO不会成为瓶颈。另外,批量操作减少了CPU以及网络收发包的开销,扫描操作的瓶颈在于Tablet Server读取底层GFS的带宽,估计为30MB/s,对应30000 QPS。

如果集群规模超过40台,不能保证所有的服务器在同一个机架下,系统设计以及性能分析都会有所不同。性能分析可能会很复杂,因为不同情况下系统的瓶颈点不同,有的时候是网络,有的时候是磁盘,有的时候甚至是机房的交换机或者CPU,另外,负载均衡以及其他因素的干扰也会使得性能更加难以量化。只有理解存储系统的底层设计和实现,并在实践中不断地练习,性能估算才会越来越准。