# Cube Server 社区版本性能报告
## 机器配置
Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz

## 测试方法
请参考[压测文档](./press.md)

## 测试数据
100w条样例kv 数据。 key为uint_64类型，单条value长度 40 Byte （一般实际场景对应一个10维特征向量）。

## 单Key高qps访问场景
一般来说实际预估服务生产环境下，单key访问场景较少，不过单机qps依然是一个比较重要的性能指标，故在下表提供了不同qps下单机Cube server性能指标。


| qps | 10w | 50w | 100w | 
|---|---|---|---|
|kps|10w|50w|100w|
|cpu(top)| 6.5% | 38.3% | 71.4% | 
|client端延迟|  avg            196 us<br>50%            160 us<br>70%            188 us<br>90%            292 us<br>95%            419 us<br>97%            547 us<br>99%            835 us<br>99.9%         1556 us<br>99.99%        1779 us|  avg            563 us<br>50%            342 us<br>70%            502 us<br>90%           1063 us<br>95%           1703 us<br>97%           2399 us<br> 99%           4036 us<br>99.9%         7195 us<br>99.99%        7340 us|    avg           4234 us<br>50%           3120 us<br>70%           5459 us<br>90%          10657 us<br>95%          14074 us<br>97%          16215 us<br> 99%          19434 us<br>99.9%        29398 us<br>99.99%       33921 us|

## 高kps场景
生产环境下，预估服务更多的会以batch形式访问cube server，这类情况kps相对qps能更准确的判断服务性能。我们以单次100key为例，给出不同kps下cube server的相关性能指标。


| qps | 2w | 10w | 20w | 
|---|---|---|---|
|kps|200w|1000w|2000w|
|cpu(top)| 3.5% | 17.8% | 37.6% | 
|client端延迟|  avg            375 us<br>50%            346 us<br>70%            390 us<br>90%            498 us<br>95%            582 us<br>97%            648 us<br>99%            908 us<br>99.9%         1623 us<br>99.99%        3312 us|  avg           1141 us<br>50%            900 us<br>70%           1237 us<br>90%           2028 us<br>95%           2662 us<br>97%           3173 us<br>99%           4614 us<br> 99.9%         6786 us<br>99.99%        6273 us|    avg           1940 us<br>50%           1299 us<br>70%           1876 us<br>90%           3629 us<br>95%           5535 us<br>97%           7365 us<br>99%          10529 us<br>99.9%        14060 us<br>99.99%       16028 us|

## 分布式场景客户端延迟
在batch查询场景下，单次batch查询耗时是业务方（特别是在线预估服务）非常关心的敏感指标。在分布式场景下，单次batch查询往往要并发请求下游所有分片server，此时batch查询耗时取决于最慢的分片请求。我们在下文给出了一个典型分布式场景下的batch查询耗时。

测试条件:
cube分片数:10 
client机器ping下游server机器约0.06ms


| batch size | 100 | 500 | 1000 | 
|---|---|---|---|
|qps|100|100|100|
|kps|1w| 5w| 10w|
|client端延迟|avg            324 us<br>80%            346 us<br>99%            1190 us<br>99.9%            3662 us<br>99.99%            9392 us|avg            466 us<br>80%            488 us<br>99%            1492 us<br>99.9%            4122 us<br>99.99%            10612 us|avg            675 us<br>80%            691 us<br>99%            2101 us<br>99.9%            5169 us<br>99.99%            14867 us|

## 结语
上述表格主要阐述了cube server单机性能，在生产环境下，对于更高的kps(qps)压力我们可以方便地通过增加副本的方式来增强集群负载能力。 在模型大小超过单机内存限制时，我们亦可通过部署多数据分片的分布式集群来提供服务。
整体来说，cube性能能够满足当前业界各类预估服务的kv访问需求。

## PS
本文所列性能均为cube原始代码版本性能，如果根据实际情情况做适当调优：如链入tcmalloc or jemalloc、 进行numa绑定 以及 打开编译优化参数等等，都有可能进一步明显提升cube server的性能表现。
