6台机器具有相同的硬件配置。CPU为32核的 Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz;内存32G;可用于HDFS的磁盘为13*550G;千兆网卡。6台机器均为Linux操作系统,内核为Linux 2.6.32-358.el6.x86_64。
当前使用的HBase版本为0.96.1.1-cdh5.0.0。
测试的HBase表有两个列族(f1和f2),压缩后的表数据大小为230G左右,压缩率大约为1/5,也就是说原始数据大约为1T。测试的rowkey是Hash后的长度为32的字符串,所以数据在集群端分布比较均匀,f1的Value平均不超过200字符。
测试程序采用多线程的方式模拟并发读的场景,即测试程序启动时创建多个线程,每个线程持续进行多次查询,每次只查询一个rowkey。客户端连续的密集访问,将触发集群端密集的并发读请求。由于测试数据在集群端也分布比较均匀,所以当客户端均匀的发送查询请求时,集群端也会形成比较均匀的并发读请求。
每轮测试中,客户端将创建不同的线程数,并将均匀的发送25926672次查询请求,集群端将形成均匀的并发读请求。测试程序将记录每次查询的耗时(ms),并据此统计平均耗时、最大耗时和耗时的分段比例。
测试程序每次查询将获取一个rowkey对应的Cell的所有版本个数,但不要求返回对应的Value。表定义的Cell版本数为10000,测试数据中发现实际的版本数平均不超过50.
QPS为700
此轮测试中,客户端测试程序启动5个线程,这些线程持续的完成25926672次查询请求。此时,集群端显示的QPS大约为700,如下图所示。
本轮测试耗时约12.5小时,结果表明:在集群端QPS达到700左右时,客户端查询平均响应时间为8.6ms,最大响应时间4220ms,至少99%的响应时间都在100ms以内,只有大约0.00001%的请求响应超过了1s。
集群端每个Regsion Server的5分钟的Load average大约在2左右。
QPS为7K
此轮测试中,客户端测试程序启动80个线程,这些线程持续的完成25926672次查询请求。此时,集群端显示的QPS大约为7K。
本轮测试耗时约70分钟,结果表明:在集群端QPS达到7K左右时,客户端查询平均响应时间为12.5ms,最大响应时间5337ms,至少99%的响应时间都在100ms以内,只有大约0.00009%的请求响应超过了1s。
集群端每个RegionServer的5分钟Load average接近于20。
QPS为9K
此轮测试中,客户端测试程序启动150个线程,这些线程持续的完成25926672次查询请求。此时,集群端显示的QPS大约为9K。
本轮测试耗时约55分钟,结果表明:在集群端QPS达到9K左右时,客户端查询平均响应时间为17.8ms,最大响应时间4696ms,并且至少98%的响应时间都在100ms以内,只有大约0.00009%的请求响应超过了1s。
集群端每个Region Server 5分钟的Load average已经达到了25左右。由于查询请求比较持续和均匀,所以实际上15分钟的Load average也达到了25左右。对于32核的CPU来说,这已经算是接近上限了。
测试结论
1. 在集群QPS(Queries Per Second,每秒查询次数)不大于7K时,99.9%以上查询请求响应时间将在100ms内,并且所有查询请求的平均耗时不超过13ms;
2. 本集群的QPS上限可以达到10K,如果持续超过此上限,集群将会工作于超负荷状态;
3. 考虑到QPS为7K时集群的负载,以及集群上同时运行的其它程序,可认为本集群实际并发查询数7K为宜。