We were conducting some performance/load testing on Aerospike for geospatial queries, but we are not very satisfied by the result. For GeoContaingPoint queries, we saw average 100 TPS, and it varies a lot (20-2k) depending on the input point.
The test dataset we were using is from OpenStreetMap, which has roughly 173K polygons(~1.7G). We then performs
GeoContainingPoint queries using Go client library, and capture the result from the benchmark tool(slightly modified):
./benchmark_geo -h 10.60.4.5 -p 3000 -w RU:100 -c 64 -n osm -s mapzen-level-8 -i city.res -L 5,1 2017/03/09 02:29:41 benchmark_geo.go:677: write(tps=0 timeouts=0 errors=0) read(tps=166 timeouts=0 errors=0) total(tps=166 timeouts=0 errors=0, count=166) 2017/03/09 02:29:41 benchmark_geo.go:685: Min(ms) Avg(ms) Max(ms) |<= 1 ms |> 1 ms |> 2 ms |> 4 ms |> 8 ms |> 16 ms 2017/03/09 02:29:41 benchmark_geo.go:692: READ 0 306.796 409 | 0/0.00% | 166/99.40% | 166/99.40% | 166/99.40% | 166/99.40% | 166/99.40% 2017/03/09 02:29:41 benchmark_geo.go:699: WRITE 0 0.000 0 | 0/0.00% | 0/0.00% | 0/0.00% | 0/0.00% | 0/0.00% | 0/0.00%
Some further investigation facts:
- The performance varies a great deal depending on the input geopoint. For densely populated area(e.g. LA/SF), performance degrades to around 20TPS, whereas for uninhabited area we saw almost 2K TPS. Is this expected?
- CPU utilization on the cluster are very low(<2%), but increasing the client parallelization would only increase latency but not TPS, why?
Here are our cluster setup:
Aerospike Version: 184.108.40.206 Community Cluster size: 3 Machine: GCE n1-highmem-32 (32 vCPUs, 208 GB memory) storage-engine memory replication-factor 2
We’d be very interested in gathering some performance metrics from your team, and wanna know the upper limit of the Aerospike cluster. Please advice.