From d99406fe633cdb753c25c1eb93c6ae5237923154 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Tue, 27 Sep 2022 16:20:00 +0200 Subject: [PATCH] Add latency amplification part --- content/blog/2022-perf/amplification.png | Bin 145685 -> 147625 bytes content/blog/2022-perf/index.md | 22 ++++++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/content/blog/2022-perf/amplification.png b/content/blog/2022-perf/amplification.png index 8962b65a4f51d5569d4c51f29709ae884090f9bb..92eac3fb12402706c0bac95c47e2d241473d64f0 100644 GIT binary patch delta 24084 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 delta 22128 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 diff --git a/content/blog/2022-perf/index.md b/content/blog/2022-perf/index.md index 5238c1a..eb54b3a 100644 --- a/content/blog/2022-perf/index.md +++ b/content/blog/2022-perf/index.md @@ -117,19 +117,29 @@ Such freezes could lead to request timeouts and failures. If it occures on our t document how to avoid it or change how we handle our I/O. At the same time, this was a very stressful test that will probably not be encountered in many setups: we were adding 273 object per seconds for 30 minutes! -As a conclusion, Garage can ingest 1 million tiny objects in 30 minutes in a very restricted environment. As a comparison, our production cluster at [deuxfleurs.fr](https://deuxfleurs) manages a bucket with 116k objects. This bucket contains real data as it is used by our Matrix instance to store people's media files (profile picture, shared pictures, videos, audios, documents...). Thanks to this benchmark, we have identified two points of vigilance: putting object duration seems linear with the number of existing objects in the cluster, and we have some volatility in our measured data that could be a symptom of our system freezing under the load. Despite these 2 points, we are confident that Garage could scale way above 1M+ objects, but it remains to be proved! +As a conclusion, Garage can ingest 1 million tiny objects in 30 minutes in a very restricted environment. As a comparison, our production cluster at [deuxfleurs.fr](https://deuxfleurs) manages a bucket with 116k objects. This bucket contains real data as it is used by our Matrix instance to store people's media files (profile picture, shared pictures, videos, audios, documents...). Thanks to this benchmark, we have identified two points of vigilance: putting object duration seems linear with the number of existing objects in the cluster, and we have some volatility in our measured data that could be a symptom of our system freezing under the load. Despite these two points, we are confident that Garage could scale way above 1M+ objects, but it remains to be proved! ## In an unpredictable world, stay resilient -- low bandwidth +**Latency amplification** - We designed Garage with low-tech geo-distributed setups in mind. For example, our production cluster is hosted [on old Lenovo Thinkcentre Tiny Desktop computers](https://guide.deuxfleurs.fr/img/serv_neptune.jpg) behind consumer-grade fiber links across France and Belgium. With these kind of networks, the observed latency is in the 50ms range between nodes. -![]() +When latency is not negligible, you will observe that your requests completion time is a factor of your observed latency. That's expected: in many cases, the node of the cluster you are contacting can not directly answer your request, it needs to reach other nodes of the cluster to get your information. Each sequential request it does add to the final request duration, which can quickly become expensive. +This ratio between request duration and network latency is what we refer as *latency amplification*. -- high network latency. phenomenon we name amplification +For example, on Garage, a GetObject request does two sequential calls: first, it asks for the descriptor of the requested object containing the block list of the requested object, then it retrieves its blocks. +We can expect that the request duration of a small GetObject request will be close to twice the network latency. -![](amplification.png) +On the following graph, we test experimentally some standard endpoints, including GetObject: -- complexity (constant time) +![Latency amplification](amplification.png) + +As Garage has been optimized for this use case from the beginning, we don't see any significant evolution from one version to another (garage v0.7.3 and garage v0.8.0 beta here). +Compared to Minio, these values are either similar (for ListObjects and ListBuckets) or way better (for GetObject, PutObject, and RemoveObject). +It is understandable: Minio has not been designed for environment with high latencies, you are expected to build your clusters in the same datacenter, and then possibly connect them with their asynchronous [Bucket Replication](https://min.io/docs/minio/linux/administration/bucket-replication.html?ref=docs-redirect) feature. + +*Minio also has a [Multi-Site Active-Active Replication System](https://blog.min.io/minio-multi-site-active-active-replication/) but it is even more sensitive to latency: "Multi-site replication has increased latency sensitivity, as MinIO does not consider an object as replicated until it has synchronized to all configured remote targets. Replication latency is therefore dictated by the slowest link in the replication mesh."* + +**Node count amplification** - ![](complexity.png)