blob: 6d6a76a8b9fdf5f6371f9403882efcbcdec8fb2d [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Distributed James Server&#8201;&#8212;&#8201;Database benchmarks :: Apache James</title>
<meta name="generator" content="Antora 3.1.2">
<link rel="stylesheet" href="../../../_/css/site.css">
</head>
<body class="article">
<header class="header">
<nav class="navbar">
<div class="navbar-brand">
<a class="navbar-item" href="https://james.apache.org"><img src="/_/img/james.svg" alt="james logo"> Apache James</a>
<button class="navbar-burger" data-target="topbar-nav">
<span></span>
<span></span>
<span></span>
</button>
</div>
<div id="topbar-nav" class="navbar-menu">
<div class="navbar-end">
<a class="navbar-item" href="#">Home</a>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Products</a>
<div class="navbar-dropdown">
<div class="navbar-item"><strong>James server</strong></div>
<a class="navbar-item" href="https://github.com/apache/james-project">Repository</a>
<a class="navbar-item" href="https://issues.apache.org/jira/projects/JAMES/issues">Issue Tracker</a>
<hr class="navbar-divider">
<a class="navbar-item" href="https://james.apache.org/mime4j/index.html">Mime4J</a>
<a class="navbar-item" href="https://james.apache.org/jsieve/index.html">jSieve</a>
<a class="navbar-item" href="https://james.apache.org/jspf/index.html">jSPF</a>
<a class="navbar-item" href="https://james.apache.org/jdkim/index.html">jDKIM</a>
<a class="navbar-item" href="https://james.apache.org/hupa/index.html">HUPA</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Community</a>
<div class="navbar-dropdown">
<!-- Not ideal but dropping the version in the href requires tweaking james-projet docs module first -->
<a class="navbar-item" href="/james-project/3.6.0/community/mailing-lists.html">Mailing lists</a>
<a class="navbar-item" href="https://gitter.im/apache/james-project"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" class="logo-gitter-sign" data-v-44ebcb1a=""><rect x="15" y="5" width="2" height="10"></rect> <rect x="10" y="5" width="2" height="20"></rect> <rect x="5" y="5" width="2" height="20"></rect> <rect width="2" height="15"></rect></svg> Gitter</a>
<a class="navbar-item" href="https://twitter.com/ApacheJames">
<span class="icon">
<svg aria-hidden="true" data-icon="twitter" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="#57aaee" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path>
</svg>
</span> Twitter
</a>
<a class="navbar-item" href="#"> <svg class="octicon octicon-mark-github v-align-middle" viewBox="0 0 16 16" version="1.1" aria-hidden="true"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"></path></svg> Github</a>
</div>
</div>
<!-- <div class="navbar-item">
<span class="control">
<a class="button is-primary" href="#">Download</a>
</span>
</div> -->
</div>
</div>
</nav>
</header>
<div class="body">
<div class="nav-container" data-component="james-distributed-app" data-version="3.8.0">
<aside class="nav">
<div class="panels">
<div class="nav-panel-menu is-active" data-panel="menu">
<nav class="nav-menu">
<button class="nav-menu-toggle" aria-label="Toggle expand/collapse all" style="display: none"></button>
<h3 class="title"><a href="../index.html">Apache James Distributed Server</a></h3>
<ul class="nav-list">
<li class="nav-item" data-depth="0">
<ul class="nav-list">
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../index.html">Distributed James Application</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../objectives.html">Objectives and motivation</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../architecture/index.html">Architecture</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../architecture/implemented-standards.html">Implemented standards</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../architecture/consistency-model.html">Consistency Model</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../architecture/specialized-instances.html">Specialized instances</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../run/index.html">Run</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../run/run-java.html">Run with Java</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../run/run-docker.html">Run with Docker</a>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../run/run-kubernetes.html">Run with Kubernetes</a>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../run/k8s-checklist.html">Deployment Checklist</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../run/k8s-logsMetrics.html">Logs &amp; Metrics</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../run/k8s-values.html">values.yaml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../run/k8s-secrets.html">secrets.yaml</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../configure/index.html">Configuration</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">Protocols</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/imap.html">imapserver.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/jmap.html">jmap.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/jmx.html">jmx.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/smtp.html">smtpserver.xml &amp; lmtpserver.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/smtp-hooks.html">Packaged SMTP hooks</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/pop3.html">pop3server.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/webadmin.html">webadmin.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/ssl.html">SSL &amp; TLS</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/sieve.html">Sieve &amp; ManageSieve</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">Storage dependencies</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/blobstore.html">blobstore.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/cassandra.html">cassandra.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/opensearch.html">opensearch.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/rabbitmq.html">rabbitmq.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/redis.html">redis.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/tika.html">tika.properties</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">Core components</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/batchsizes.html">batchsizes.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/dns.html">dnsservice.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/domainlist.html">domainlist.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/healthcheck.html">healthcheck.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/mailetcontainer.html">mailetcontainer.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/mailets.html">Packaged Mailets</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/matchers.html">Packaged Matchers</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/mailrepositorystore.html">mailrepositorystore.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/recipientrewritetable.html">recipientrewritetable.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/search.html">search.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/usersrepository.html">usersrepository.xml</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">Extensions</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/vault.html">deletedMessageVault.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/extensions.html">extensions.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/listeners.html">listeners.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/spam.html">Anti-Spam setup</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/remote-delivery-error-handling.html">About RemoteDelivery error handling</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/collecting-contacts.html">Contact collection</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/collecting-events.html">Event collection</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configure/dsn.html">ESMTP DSN support</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../operate/index.html">Operate</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/guide.html">Operator guide</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/performanceChecklist.html">Performance checklist</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/logging.html">Logging</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/webadmin.html">WebAdmin REST administration API</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/metrics.html">Metrics</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/migrating.html">Migrating existing data</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/cli.html">Command Line Interface</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/cassandra-migration.html">Cassandra migration</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/security.html">Security checklist</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../extending/index.html">Extending server behavior</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../extending/mail-processing.html">Custom mail processing components</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../extending/mailbox-listeners.html">Custom Mailbox Listeners</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../extending/smtp-hooks.html">Custom SMTP hooks</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../extending/webadmin-routes.html">Custom WebAdmin routes</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../extending/imap.html">Custom IMAP processing</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="index.html">Performance benchmark</a>
<ul class="nav-list">
<li class="nav-item is-current-page" data-depth="3">
<a class="nav-link" href="db-benchmark.html">Database benchmarks</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="james-benchmark.html">James benchmarks</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</div>
<div class="nav-panel-explore" data-panel="explore">
<div class="context">
<span class="title">Apache James Distributed Server</span>
<span class="version">3.8.0 SNAPSHOT</span>
</div>
<ul class="components">
<li class="component is-current">
<div class="title"><a href="../index.html">Apache James Distributed Server</a></div>
<ul class="versions">
<li class="version is-current is-latest">
<a href="../index.html">3.8.0 SNAPSHOT</a>
</li>
</ul>
</li>
<li class="component">
<div class="title"><a href="../../../james-project/3.8.0/index.html">Apache James Server</a></div>
<ul class="versions">
<li class="version is-latest">
<a href="../../../james-project/3.8.0/index.html">3.8.0 SNAPSHOT</a>
</li>
<li class="version">
<a href="../../../james-project/3.6.0/index.html">3.6.0 Snapshot</a>
</li>
</ul>
</li>
<li class="component">
<div class="title"><a href="../../../james-site/latest/index.html">Apache James Site</a></div>
<ul class="versions">
<li class="version is-latest">
<a href="../../../james-site/latest/index.html">latest</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</aside>
</div>
<main class="article">
<div class="toolbar" role="navigation">
<button class="nav-toggle"></button>
<a href="../../../james-site/latest/homepage.html" class="home-link"></a>
<nav class="breadcrumbs" aria-label="breadcrumbs">
<ul>
<li><a href="../index.html">Apache James Distributed Server</a></li>
<li><a href="../index.html">Distributed James Application</a></li>
<li><a href="index.html">Performance benchmark</a></li>
<li><a href="db-benchmark.html">Database benchmarks</a></li>
</ul>
</nav>
<div class="edit-this-page"><a href="https://github.com/apache/james-project/blob/master/server/apps/distributed-app/docs/modules/ROOT/pages/benchmark/db-benchmark.adoc">Edit this Page</a></div>
</div>
<div class="content">
<aside class="toc sidebar" data-title="Contents" data-levels="2">
<div class="toc-menu"></div>
</aside>
<article class="doc">
<h1 class="page">Distributed James Server&#8201;&#8212;&#8201;Database benchmarks</h1>
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>This document provides basic performance of Distributed James' databases, benchmark methodologies as a basis for a James administrator who
can test and evaluate if his Distributed James databases are performing well.</p>
</div>
<div class="paragraph">
<p>It includes:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>A sample deployment topology</p>
</li>
<li>
<p>Propose benchmark methodology and base performance for each database. This aims to help operators to quickly identify
performance issues and compliance of their databases.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_sample_deployment_topology"><a class="anchor" href="#_sample_deployment_topology"></a>Sample deployment topology</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We deploy a sample topology of Distributed James with these following databases:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Apache Cassandra 4 as main database: 3 nodes, each node has 8 OVH vCores CPU and 30 GB memory limit (OVH b2-30 instance).</p>
</li>
<li>
<p>OpenDistro 1.13.1 as search engine: 3 nodes, each node has 8 OVH vCores CPU and 30 GB memory limit (OVH b2-30 instance).</p>
</li>
<li>
<p>RabbitMQ 3.8.17 as message queue: 3 Kubernetes pods, each pod has 0.6 OVH vCore CPU and 2 GB memory limit.</p>
</li>
<li>
<p>OVH Swift S3 as an object storage</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>With the above system, our email service operates stably with valuable performance.
For a more details, it can handle a load throughput up to about 1000 JMAP requests per second with 99th percentile latency is 400ms.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_benchmark_methodologies_and_base_performances"><a class="anchor" href="#_benchmark_methodologies_and_base_performances"></a>Benchmark methodologies and base performances</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We are willing to share the benchmark methodologies and the result to you as a reference to evaluate your Distributed James' performance.
Other evaluation methods are welcome, as long as your databases exhibit similar or even better performance than ours.
It is up to your business needs. If your databases shows results that fall far from our baseline performance, there&#8217;s a good chance that
there are problems with your system, and you need to check it out thoroughly.</p>
</div>
<div class="sect2">
<h3 id="_benchmark_cassandra"><a class="anchor" href="#_benchmark_cassandra"></a>Benchmark Cassandra</h3>
<div class="sect3">
<h4 id="_benchmark_methodology"><a class="anchor" href="#_benchmark_methodology"></a>Benchmark methodology</h4>
<div class="sect4">
<h5 id="_benchmark_tool"><a class="anchor" href="#_benchmark_tool"></a>Benchmark tool</h5>
<div class="paragraph">
<p>We use <a href="https://cassandra.apache.org/doc/latest/cassandra/tools/cassandra_stress.html">cassandra-stress tool</a> - an official
tool of Cassandra for stress loading tests.</p>
</div>
<div class="paragraph">
<p>The cassandra-stress tool is a Java-based stress testing utility for basic benchmarking and load testing a Cassandra cluster.
Data modeling choices can greatly affect application performance. Significant load testing over several trials is the best method for discovering issues with a particular data model. The cassandra-stress tool is an effective tool for populating a cluster and stress testing CQL tables and queries. Use cassandra-stress to:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Quickly determine how a schema performs.</p>
</li>
<li>
<p>Understand how your database scales.</p>
</li>
<li>
<p>Optimize your data model and settings.</p>
</li>
<li>
<p>Determine production capacity.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>There are several operation types:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>write-only, read-only, and mixed workloads of standard data</p>
</li>
<li>
<p>write-only and read-only workloads for counter columns</p>
</li>
<li>
<p>user configured workloads, running custom queries on custom schemas</p>
</li>
</ul>
</div>
</div>
<div class="sect4">
<h5 id="_how_to_benchmark"><a class="anchor" href="#_how_to_benchmark"></a>How to benchmark</h5>
<div class="paragraph">
<p>Here we are using a simple case to test and compare Cassandra performance between different setup environments.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">keyspace: stresscql
keyspace_definition: |
CREATE KEYSPACE stresscql WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};
table: mixed_workload
table_definition: |
CREATE TABLE mixed_workload (
key uuid PRIMARY KEY,
a blob,
b blob
) WITH COMPACT STORAGE
columnspec:
- name: a
size: uniform(1..10000)
- name: b
size: uniform(1..100000)
insert:
partitions: fixed(1)
queries:
read:
cql: select * from mixed_workload where key = ?
fields: samerow</code></pre>
</div>
</div>
<div class="paragraph">
<p>Create the yaml file as above and copy to a Cassandra node.</p>
</div>
<div class="paragraph">
<p>Insert some sample data:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">cassandra-stress user profile=mixed_workload.yml n=100000 "ops(insert=1)" cl=ONE -mode native cql3 user=&lt;user&gt; password=&lt;password&gt; -node &lt;IP&gt; -rate threads=8 -graph file=./graph_insert.xml title=Benchmark revision=insert_ONE</code></pre>
</div>
</div>
<div class="paragraph">
<p>Read intensive scenario:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">cassandra-stress user profile=mixed_workload.yml n=100000 "ops(insert=1,read=4)" cl=ONE -mode native cql3 user=&lt;user&gt; password=&lt;password&gt; -node &lt;IP&gt; -rate threads=8 -graph file=./graph_mixed.xml title=Benchmark revision=mixed_ONE</code></pre>
</div>
</div>
<div class="paragraph">
<p>In there:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>n=100000: The number of insert batches, not number of individual insert operations.</p>
</li>
<li>
<p>rate threads=8: The number of concurrent threads. If not specified it will start with 4 threads and increase until server reaches a limit.</p>
</li>
<li>
<p>ops(insert=1,read=4): This will execute insert and read queries in the ratio 1:4.</p>
</li>
<li>
<p>graph: Export results to graph in html format.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_sample_benchmark_result"><a class="anchor" href="#_sample_benchmark_result"></a>Sample benchmark result</h4>
<div class="imageblock">
<div class="content">
<img src="../_images/cassandra_stress_test_result_1.png" alt="cassandra stress test result 1">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="../_images/cassandra_stress_test_result_2.png" alt="cassandra stress test result 2">
</div>
</div>
</div>
<div class="sect3">
<h4 id="_references"><a class="anchor" href="#_references"></a>References</h4>
<div class="paragraph">
<p><a href="https://www.datastax.com/blog/improved-cassandra-21-stress-tool-benchmark-any-schema-part-1">Datastax - Cassandra stress tool</a></p>
</div>
<div class="paragraph">
<p><a href="https://www.instaclustr.com/deep-diving-cassandra-stress-part-3-using-yaml-profiles/">Deep Diving cassandra-stress – Part 3 (Using YAML Profiles)</a></p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_benchmark_opensearch"><a class="anchor" href="#_benchmark_opensearch"></a>Benchmark OpenSearch</h3>
<div class="sect3">
<h4 id="_benchmark_methodology_2"><a class="anchor" href="#_benchmark_methodology_2"></a>Benchmark methodology</h4>
<div class="sect4">
<h5 id="_benchmark_tool_2"><a class="anchor" href="#_benchmark_tool_2"></a>Benchmark tool</h5>
<div class="paragraph">
<p>We use <a href="https://github.com/opensearch-project/opensearch-benchmark">opensearch-benchmark</a> - an official OpenSearch benchmarking tool.
It provides the following features:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Automatically create OpenSearch clusters, stress tests them, and delete them.</p>
</li>
<li>
<p>Manage stress testing data and solutions by OpenSearch version.</p>
</li>
<li>
<p>Present stress testing data in a comprehensive way, allowing you to compare and analyze the data of different stress tests and store the data on a particular OpenSearch instance for secondary analysis.</p>
</li>
<li>
<p>Collect Java Virtual Machine (JVM) details, such as memory and garbage collection (GC) data, to locate performance problems.</p>
</li>
</ul>
</div>
</div>
<div class="sect4">
<h5 id="_how_to_benchmark_2"><a class="anchor" href="#_how_to_benchmark_2"></a>How to benchmark</h5>
<div class="paragraph">
<p>To install the <code>opensearch-benchmark</code> tool, you need Python 3.8+ including pip3 first, then run:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">python3 -m pip install opensearch-benchmark</code></pre>
</div>
</div>
<div class="paragraph">
<p>If you have any trouble or need more detailed instructions, please look in the <a href="https://github.com/opensearch-project/OpenSearch-Benchmark/blob/main/DEVELOPER_GUIDE.md">detailed installation guide</a>.</p>
</div>
<div class="paragraph">
<p>Let&#8217;s see which workloads (simulation profiles) that <code>opensearch-benchmark</code> provides: <code><code>opensearch-benchmark list worloads</code></code>.
For our James use case, we are interested in <code><code>pmc</code></code> workload: <code><code>Full-text benchmark with academic papers from PMC</code></code>.</p>
</div>
<div class="paragraph">
<p>Run the below script to benchmark against your OpenSearch cluster:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">opensearch-benchmark execute_test --pipeline=benchmark-only --workload=[workload-name] --target-host=[ip_node1:port_node1],[ip_node2:port_node2],[ip_node3:port_node3] --client-options="use_ssl:false,verify_certs:false,basic_auth_user:'[user]',basic_auth_password:'[password]'"</code></pre>
</div>
</div>
<div class="paragraph">
<p>In there:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>--pipeline=benchmark-only: benchmark against a running cluster</p>
</li>
<li>
<p>workload-name: the workload you want to benchmark</p>
</li>
<li>
<p>ip:port: OpenSearch Node' socket</p>
</li>
<li>
<p>user/password: OpenSearch authentication credentials</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_sample_benchmark_result_2"><a class="anchor" href="#_sample_benchmark_result_2"></a>Sample benchmark result</h4>
<div class="sect4">
<h5 id="_pmc_worload"><a class="anchor" href="#_pmc_worload"></a>PMC worload</h5>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">| Metric | Task | Value | Unit |
|---------------------------------------------------------------:|------------------------------:|------------:|--------:|
| Min Throughput | index-append | 734.63 | docs/s |
| Mean Throughput | index-append | 763.16 | docs/s |
| Median Throughput | index-append | 746.5 | docs/s |
| Max Throughput | index-append | 833.51 | docs/s |
| 50th percentile latency | index-append | 4738.57 | ms |
| 90th percentile latency | index-append | 8129.1 | ms |
| 99th percentile latency | index-append | 11734.5 | ms |
| 100th percentile latency | index-append | 14662.9 | ms |
| 50th percentile service time | index-append | 4738.57 | ms |
| 90th percentile service time | index-append | 8129.1 | ms |
| 99th percentile service time | index-append | 11734.5 | ms |
| 100th percentile service time | index-append | 14662.9 | ms |
| error rate | index-append | 0 | % |
| Min Throughput | default | 19.94 | ops/s |
| Mean Throughput | default | 19.95 | ops/s |
| Median Throughput | default | 19.95 | ops/s |
| Max Throughput | default | 19.96 | ops/s |
| 50th percentile latency | default | 23.1322 | ms |
| 90th percentile latency | default | 25.4129 | ms |
| 99th percentile latency | default | 29.1382 | ms |
| 100th percentile latency | default | 29.4762 | ms |
| 50th percentile service time | default | 21.4895 | ms |
| 90th percentile service time | default | 23.589 | ms |
| 99th percentile service time | default | 26.6134 | ms |
| 100th percentile service time | default | 27.9068 | ms |
| error rate | default | 0 | % |
| Min Throughput | term | 19.93 | ops/s |
| Mean Throughput | term | 19.94 | ops/s |
| Median Throughput | term | 19.94 | ops/s |
| Max Throughput | term | 19.95 | ops/s |
| 50th percentile latency | term | 31.0684 | ms |
| 90th percentile latency | term | 34.1419 | ms |
| 99th percentile latency | term | 74.7904 | ms |
| 100th percentile latency | term | 103.663 | ms |
| 50th percentile service time | term | 29.6775 | ms |
| 90th percentile service time | term | 32.4288 | ms |
| 99th percentile service time | term | 36.013 | ms |
| 100th percentile service time | term | 102.193 | ms |
| error rate | term | 0 | % |
| Min Throughput | phrase | 19.94 | ops/s |
| Mean Throughput | phrase | 19.95 | ops/s |
| Median Throughput | phrase | 19.95 | ops/s |
| Max Throughput | phrase | 19.95 | ops/s |
| 50th percentile latency | phrase | 23.0255 | ms |
| 90th percentile latency | phrase | 26.1607 | ms |
| 99th percentile latency | phrase | 31.2094 | ms |
| 100th percentile latency | phrase | 45.5012 | ms |
| 50th percentile service time | phrase | 21.5109 | ms |
| 90th percentile service time | phrase | 24.4144 | ms |
| 99th percentile service time | phrase | 26.1865 | ms |
| 100th percentile service time | phrase | 43.5122 | ms |
| error rate | phrase | 0 | % |
----------------------------------
[INFO] SUCCESS (took 1772 seconds)
----------------------------------</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_pmc_custom_workload"><a class="anchor" href="#_pmc_custom_workload"></a>PMC custom workload</h5>
<div class="paragraph">
<p>We customized the PMC workload by increasing search throughput target to figure out our OpenSearch cluster limit.</p>
</div>
<div class="paragraph">
<p>The result is that with 25-30 request/s we have a 99th percentile latency of 1s.</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_references_2"><a class="anchor" href="#_references_2"></a>References</h4>
<div class="paragraph">
<p>The <code>opensearch-benchmark</code> tool seems to be a fork of the official benchmark tool <a href="https://github.com/elastic/rally">EsRally</a> of Elasticsearch.
The <code>opensearch-benchmark</code> tool is not adopted widely yet, so we believe some EsRally references could help as well:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://www.alibabacloud.com/blog/esrally-official-stress-testing-tool-for-elasticsearch_597102">esrally: Official Stress Testing Tool for Elasticsearch</a></p>
</li>
<li>
<p><a href="https://esrally.readthedocs.io/en/latest/adding_tracks.html">Create a custom EsRally track</a></p>
</li>
<li>
<p><a href="https://discuss.elastic.co/t/why-the-percentile-latency-is-several-times-more-than-service-time/69630">Why the percentile latency is several times more than service time</a></p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_benchmark_rabbitmq"><a class="anchor" href="#_benchmark_rabbitmq"></a>Benchmark RabbitMQ</h3>
<div class="sect3">
<h4 id="_benchmark_methodology_3"><a class="anchor" href="#_benchmark_methodology_3"></a>Benchmark methodology</h4>
<div class="sect4">
<h5 id="_benchmark_tool_3"><a class="anchor" href="#_benchmark_tool_3"></a>Benchmark tool</h5>
<div class="paragraph">
<p>We use <a href="https://github.com/rabbitmq/rabbitmq-perf-test">rabbitmq-perf-test</a> tool.</p>
</div>
</div>
<div class="sect4">
<h5 id="_how_to_benchmark_3"><a class="anchor" href="#_how_to_benchmark_3"></a>How to benchmark</h5>
<div class="paragraph">
<p>Using PerfTestMulti for more friendly:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Provide input scenario from a single file</p>
</li>
<li>
<p>Provide output result as a single file. Can be visualized result file by the chart (graph WebUI)</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Run a command like below:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">bin/runjava com.rabbitmq.perf.PerfTestMulti [scenario-file] [result-file]</code></pre>
</div>
</div>
<div class="paragraph">
<p>In order to visualize result, coping [result-file] to <code><code>/html/examples/[result-file]</code></code>.
Start webserver to view graph by the command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">bin/runjava com.rabbitmq.perf.WebServer</code></pre>
</div>
</div>
<div class="paragraph">
<p>Then browse: <a href="http://localhost:8080/examples/sample.html" class="bare">http://localhost:8080/examples/sample.html</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_sample_benchmark_result_3"><a class="anchor" href="#_sample_benchmark_result_3"></a>Sample benchmark result</h4>
<div class="ulist">
<ul>
<li>
<p>Scenario file:</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">[{'name': 'consume', 'type': 'simple',
'uri': 'amqp://james:eeN7Auquaeng@localhost:5677',
'params':
[{'time-limit': 30, 'producer-count': 2, 'consumer-count': 4}]}]</code></pre>
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>Result file:</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">{
"consume": {
"send-bytes-rate": 0,
"recv-msg-rate": 4330.225080385852,
"avg-latency": 18975254,
"send-msg-rate": 455161.3183279743,
"recv-bytes-rate": 0,
"samples": [{
"elapsed": 15086,
"send-bytes-rate": 0,
"recv-msg-rate": 0,
"send-msg-rate": 0.06628662335940608,
"recv-bytes-rate": 0
},
{
"elapsed": 16086,
"send-bytes-rate": 0,
"recv-msg-rate": 1579,
"max-latency": 928296,
"min-latency": 278765,
"avg-latency": 725508,
"send-msg-rate": 388994,
"recv-bytes-rate": 0
},
{
"elapsed": 48184,
"send-bytes-rate": 0,
"recv-msg-rate": 3768.4918347742555,
"max-latency": 32969370,
"min-latency": 31852685,
"avg-latency": 32385432,
"send-msg-rate": 0,
"recv-bytes-rate": 0
},
{
"elapsed": 49186,
"send-bytes-rate": 0,
"recv-msg-rate": 4416.167664670658,
"max-latency": 33953465,
"min-latency": 32854771,
"avg-latency": 33373113,
"send-msg-rate": 0,
"recv-bytes-rate": 0
}]
}
}</code></pre>
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>Key result points:</p>
</li>
</ul>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Metrics</th>
<th class="tableblock halign-left valign-top">Unit</th>
<th class="tableblock halign-left valign-top">Result</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Publisher throughput (the sending rate)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">messages / second</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">3111</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Consumer throughput (the receiving rate)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">messages / second</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">4404</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_benchmark_s3_storage"><a class="anchor" href="#_benchmark_s3_storage"></a>Benchmark S3 storage</h3>
<div class="sect3">
<h4 id="_benchmark_methodology_4"><a class="anchor" href="#_benchmark_methodology_4"></a>Benchmark methodology</h4>
<div class="sect4">
<h5 id="_benchmark_tool_4"><a class="anchor" href="#_benchmark_tool_4"></a>Benchmark tool</h5>
<div class="paragraph">
<p>We use <a href="https://github.com/dvassallo/s3-benchmark">s3-benchmark</a> tool.</p>
</div>
</div>
<div class="sect4">
<h5 id="_how_to_benchmark_4"><a class="anchor" href="#_how_to_benchmark_4"></a>How to benchmark</h5>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Make sure you set up appropriate S3 credentials with <code>awscli</code>.</p>
</li>
<li>
<p>If you are using a compatible S3 storage of cloud providers like OVH, you would need to configure
<code>awscli-plugin-endpoint</code>. E.g: <a href="https://docs.ovh.com/au/en/storage/getting_started_with_the_swift_S3_API/">Getting started with the OVH Swift S3 API</a></p>
</li>
<li>
<p>Install <code>s3-benchmark</code> tool and run the command:</p>
</li>
</ol>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">./s3-benchmark -endpoint=[endpoint] -region=[region] -bucket-name=[bucket-name] -payloads-min=[payload-min] -payloads-max=[payload-max] threads-max=[threads-max]</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_sample_benchmark_result_4"><a class="anchor" href="#_sample_benchmark_result_4"></a>Sample benchmark result</h4>
<div class="paragraph">
<p>We did S3 performance testing with suitable email objects sizes: 4 KB, 128 KB, 1 MB, 8 MB.</p>
</div>
<div class="paragraph">
<p>Result:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">--- SETUP --------------------------------------------------------------------------------------------------------------------
Uploading 4 KB objects
100% |████████████████████████████████████████| [4s:0s]
Uploading 128 KB objects
100% |████████████████████████████████████████| [9s:0s]
Uploading 1 MB objects
100% |████████████████████████████████████████| [8s:0s]
Uploading 8 MB objects
100% |████████████████████████████████████████| [10s:0s]
--- BENCHMARK ----------------------------------------------------------------------------------------------------------------
Download performance with 4 KB objects (b2-30)
+-------------------------------------------------------------------------------------------------+
| Time to First Byte (ms) | Time to Last Byte (ms) |
+---------+----------------+------------------------------------------------+------------------------------------------------+
| Threads | Throughput | avg min p25 p50 p75 p90 p99 max | avg min p25 p50 p75 p90 p99 max |
+---------+----------------+------------------------------------------------+------------------------------------------------+
| 8 | 0.6 MB/s | 36 10 17 22 36 57 233 249 | 37 10 17 22 36 57 233 249 |
| 9 | 0.6 MB/s | 30 10 15 21 33 45 82 234 | 30 10 15 21 33 45 83 235 |
| 10 | 0.2 MB/s | 55 11 18 22 28 52 248 1075 | 55 11 18 22 28 52 249 1075 |
| 11 | 0.3 MB/s | 66 11 18 23 45 233 293 683 | 67 11 19 23 45 233 293 683 |
| 12 | 0.6 MB/s | 35 12 19 22 43 55 67 235 | 35 12 19 22 43 56 67 235 |
| 13 | 0.2 MB/s | 68 11 19 26 58 79 279 1037 | 68 11 19 26 58 80 279 1037 |
| 14 | 0.6 MB/s | 43 17 20 24 52 56 230 236 | 43 17 20 25 52 56 230 236 |
| 15 | 0.2 MB/s | 69 11 16 23 50 66 274 1299 | 69 11 16 24 50 66 274 1299 |
| 16 | 0.5 MB/s | 52 9 19 31 81 95 228 237 | 53 9 19 31 81 95 229 237 |
+---------+----------------+------------------------------------------------+------------------------------------------------+
Download performance with 128 KB objects (b2-30)
+-------------------------------------------------------------------------------------------------+
| Time to First Byte (ms) | Time to Last Byte (ms) |
+---------+----------------+------------------------------------------------+------------------------------------------------+
| Threads | Throughput | avg min p25 p50 p75 p90 p99 max | avg min p25 p50 p75 p90 p99 max |
+---------+----------------+------------------------------------------------+------------------------------------------------+
| 8 | 3.3 MB/s | 71 16 22 28 39 66 232 1768 | 73 16 23 29 43 67 233 1769 |
| 9 | 3.6 MB/s | 74 9 19 23 34 58 239 1646 | 75 10 20 24 37 59 240 1647 |
| 10 | 2.9 MB/s | 97 16 21 24 48 89 656 2034 | 99 17 21 26 49 92 657 2035 |
| 11 | 3.0 MB/s | 100 10 21 26 39 64 1049 2029 | 101 11 21 27 40 65 1050 2030 |
| 12 | 3.0 MB/s | 76 12 19 24 44 56 256 2012 | 77 13 20 25 48 69 258 2013 |
| 13 | 6.1 MB/s | 73 10 13 20 43 223 505 1026 | 74 10 15 21 43 224 506 1027 |
| 14 | 5.5 MB/s | 81 11 15 23 51 240 666 1060 | 82 12 16 23 54 241 667 1060 |
| 15 | 2.7 MB/s | 80 10 19 28 43 59 234 2222 | 84 11 25 34 47 60 236 2224 |
| 16 | 18.6 MB/s | 58 10 19 26 61 224 248 266 | 61 10 22 29 65 224 249 267 |
+---------+----------------+------------------------------------------------+------------------------------------------------+
Download performance with 1 MB objects (b2-30)
+-------------------------------------------------------------------------------------------------+
| Time to First Byte (ms) | Time to Last Byte (ms) |
+---------+----------------+------------------------------------------------+------------------------------------------------+
| Threads | Throughput | avg min p25 p50 p75 p90 p99 max | avg min p25 p50 p75 p90 p99 max |
+---------+----------------+------------------------------------------------+------------------------------------------------+
| 8 | 56.4 MB/s | 41 12 26 34 43 57 94 235 | 136 30 69 100 161 284 345 396 |
| 9 | 55.2 MB/s | 53 19 32 39 50 69 238 247 | 149 26 84 117 164 245 324 655 |
| 10 | 33.9 MB/s | 74 17 27 37 50 77 456 1060 | 177 29 97 134 205 273 484 1076 |
| 11 | 57.3 MB/s | 56 26 35 44 57 71 251 298 | 185 40 93 129 216 329 546 871 |
| 12 | 37.7 MB/s | 66 21 33 43 58 73 102 1024 | 202 24 81 125 205 427 839 1222 |
| 13 | 57.6 MB/s | 59 24 35 40 58 71 275 289 | 215 40 94 181 288 393 500 674 |
| 14 | 47.1 MB/s | 73 18 46 56 66 75 475 519 | 229 30 116 221 272 441 603 686 |
| 15 | 58.2 MB/s | 65 11 40 51 63 75 260 294 | 243 29 132 174 265 485 831 849 |
| 16 | 23.1 MB/s | 96 14 46 55 62 80 124 2022 | 278 31 124 187 249 634 827 2028 |
+---------+----------------+------------------------------------------------+------------------------------------------------+
Download performance with 8 MB objects (b2-30)
+-------------------------------------------------------------------------------------------------+
| Time to First Byte (ms) | Time to Last Byte (ms) |
+---------+----------------+------------------------------------------------+------------------------------------------------+
| Threads | Throughput | avg min p25 p50 p75 p90 p99 max | avg min p25 p50 p75 p90 p99 max |
+---------+----------------+------------------------------------------------+------------------------------------------------+
| 8 | 58.4 MB/s | 88 35 65 79 88 96 288 307 | 1063 458 564 759 928 1151 4967 6841 |
| 9 | 50.4 MB/s | 137 32 52 69 145 286 509 1404 | 1212 160 471 581 1720 2873 3744 4871 |
| 10 | 58.2 MB/s | 77 46 54 66 77 98 275 285 | 1319 377 432 962 1264 3232 4266 6151 |
| 11 | 58.4 MB/s | 97 32 63 72 80 91 323 707 | 1429 325 593 722 1648 3020 6172 6370 |
| 12 | 58.5 MB/s | 108 26 65 81 91 261 301 519 | 1569 472 696 1101 1915 3175 4066 5110 |
| 13 | 56.1 MB/s | 115 35 69 83 93 125 329 1092 | 1712 458 801 1165 2354 3559 3865 5945 |
| 14 | 58.6 MB/s | 103 26 70 78 88 112 309 656 | 1807 789 999 1269 1998 3258 5201 6651 |
| 15 | 58.3 MB/s | 113 31 55 67 79 134 276 1490 | 1947 497 1081 1756 2730 3557 3799 3974 |
| 16 | 58.0 MB/s | 99 35 67 79 96 146 282 513 | 2091 531 882 1136 2161 6034 6686 6702 |
+---------+----------------+------------------------------------------------+------------------------------------------------+</code></pre>
</div>
</div>
<div class="paragraph">
<p>We believe that the actual OVH Swift S3' throughput should be at least about 100 MB/s. This was not fully achieved due to
network limitations of the client machine performing the benchmark.</p>
</div>
</div>
</div>
</div>
</div>
</article>
</div>
</main>
</div>
<footer class="footer">
<p>This page was built using the Antora default UI.</p>
<p>The source code for this UI is licensed under the terms of the MPL-2.0 license.</p>
</footer>
<script id="site-script" src="../../../_/js/site.js" data-ui-root-path="../../../_"></script>
<script async src="../../../_/js/vendor/highlight.js"></script>
</body>
</html>