blob: 11981eff6d3552e5c702f4b402a4321ffb9a475c [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Generated by Apache Maven Doxia at 2021-11-12 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Apache James Project &#x2013; Apache James Server 3 - Performance</title>
<style type="text/css" media="all">
@import url("../css/james.css");
@import url("../css/maven-base.css");
@import url("../css/maven-theme.css");
@import url("../css/site.css");
@import url("../js/jquery/css/custom-theme/jquery-ui-1.8.5.custom.css");
@import url("../js/jquery/css/print.css");
@import url("../js/fancybox/jquery.fancybox-1.3.4.css");
</style>
<script type="text/javascript" src="../js/jquery/js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="../js/jquery/js/jquery-ui-1.8.5.custom.min.js"></script>
<script type="text/javascript" src="../js/fancybox/jquery.fancybox-1.3.4.js"></script>
<link rel="stylesheet" href="../css/print.css" type="text/css" media="print" />
<meta name="Date-Revision-yyyymmdd" content="20211112" />
<meta http-equiv="Content-Language" content="en" />
<!-- Google Analytics -->
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-1384591-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script').item(0); s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body class="composite">
<div id="banner">
<a href="../index.html" id="bannerLeft" title="james-logo.png">
<img src="../images/logos/james-logo.png" alt="James Project" />
</a>
<a href="https://www.apache.org/index.html" id="bannerRight">
<img src="images/logos/asf_logo_small.png" alt="The Apache Software Foundation" />
</a>
<div class="clear">
<hr/>
</div>
</div>
<div id="breadcrumbs">
<div class="xleft">
<span id="publishDate">Last Published: 2021-11-12</span>
</div>
<div class="xright"> <a href="../index.html" title="Home">Home</a>
|
<a href="../documentation.html" title="James">James</a>
|
<a href="../mime4j/index.html" title="Mime4J">Mime4J</a>
|
<a href="../jsieve/index.html" title="jSieve">jSieve</a>
|
<a href="../jspf/index.html" title="jSPF">jSPF</a>
|
<a href="../jdkim/index.html" title="jDKIM">jDKIM</a>
</div>
<div class="clear">
<hr/>
</div>
</div>
<div id="leftColumn">
<div id="navcolumn">
<h5>James components</h5>
<ul>
<li class="collapsed">
<a href="../documentation.html" title="About James">About James</a>
</li>
<li class="expanded">
<a href="../server/index.html" title="Server">Server</a>
<ul>
<li class="none">
<a href="../server/advantages.html" title="Advantages">Advantages</a>
</li>
<li class="none">
<a href="../server/objectives.html" title="Objectives">Objectives</a>
</li>
<li class="expanded">
<a href="../server/quick-start.html" title="User Manual">User Manual</a>
<ul>
<li class="expanded">
<a href="../server/features.html" title="1. Features">1. Features</a>
<ul>
<li class="none">
<a href="../server/feature-mailetcontainer.html" title="Mailet Container">Mailet Container</a>
</li>
<li class="none">
<a href="../server/feature-queue-priority.html" title="Queue Priority">Queue Priority</a>
</li>
<li class="none">
<a href="../server/feature-persistence.html" title="Persistence">Persistence</a>
</li>
<li class="none">
<a href="../server/feature-protocols.html" title="Protocols">Protocols</a>
</li>
<li class="none">
<a href="../server/feature-smtp-hooks.html" title="SMTP Hooks">SMTP Hooks</a>
</li>
<li class="none">
<strong>Performance</strong>
</li>
<li class="none">
<a href="../server/feature-security.html" title="Security">Security</a>
</li>
</ul>
</li>
<li class="none">
<a href="../server/packaging.html" title="2. Packaging">2. Packaging</a>
</li>
<li class="collapsed">
<a href="../server/install.html" title="3. Install James">3. Install James</a>
</li>
<li class="collapsed">
<a href="../server/config.html" title="4. Configure James">4. Configure James</a>
</li>
<li class="collapsed">
<a href="../server/manage.html" title="5. Manage">5. Manage</a>
</li>
<li class="collapsed">
<a href="../server/monitor.html" title="6. Monitor">6. Monitor</a>
</li>
<li class="collapsed">
<a href="../server/upgrade.html" title="7. Upgrade">7. Upgrade</a>
</li>
<li class="collapsed">
<a href="../server/dev.html" title="8. Developers Corner">8. Developers Corner</a>
</li>
</ul>
</li>
<li class="none">
<a href="../mail.html#James_Mailing_lists" title="Mailing Lists">Mailing Lists</a>
</li>
<li class="none">
<a href="../server/release-notes.html" title="Release Notes">Release Notes</a>
</li>
<li class="none">
<a href="../server/apidocs/index.html" title="Javadoc">Javadoc</a>
</li>
<li class="none">
<a href="https://issues.apache.org/jira/browse/JAMES" title="Issue Tracker">Issue Tracker</a>
</li>
<li class="none">
<a href="https://github.com/apache/james-project" title="Sources">Sources</a>
</li>
<li class="none">
<a href="../server/rfcs.html" title="RFCs">RFCs</a>
</li>
<li class="none">
<a href="../download.cgi#Apache_James_Server" title="Download releases">Download releases</a>
</li>
</ul>
</li>
<li class="collapsed">
<a href="../mailet/index.html" title="Mailets">Mailets</a>
</li>
<li class="collapsed">
<a href="../mailbox/index.html" title="Mailbox">Mailbox</a>
</li>
<li class="collapsed">
<a href="../protocols/index.html" title="Protocols">Protocols</a>
</li>
<li class="collapsed">
<a href="../mpt/index.html" title="MPT">MPT</a>
</li>
</ul>
<h5>Apache Software Foundation</h5>
<ul>
<li>
<strong>
<a title="ASF" href="http://www.apache.org/">ASF</a>
</strong>
</li>
<li>
<a title="Get Involved" href="http://www.apache.org/foundation/getinvolved.html">Get Involved</a>
</li>
<li>
<a title="FAQ" href="http://www.apache.org/foundation/faq.html">FAQ</a>
</li>
<li>
<a title="License" href="http://www.apache.org/licenses/" >License</a>
</li>
<li>
<a title="Sponsorship" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
</li>
<li>
<a title="Thanks" href="http://www.apache.org/foundation/thanks.html">Thanks</a>
</li>
<li>
<a title="Security" href="http://www.apache.org/security/">Security</a>
</li>
</ul>
<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
<img class="poweredBy" alt="Built by Maven" src="../images/logos/maven-feather.png" />
</a>
</div>
</div>
<div id="bodyColumn">
<div id="contentBox">
<section>
<h2><a name="Performance"></a>Performance</h2>
<section>
<h3><a name="Gatling_load_testing"></a>Gatling load testing</h3>
<p>In mail servers, performance do matters. Users expect good, and fast responding commands. Thus performance is a
priority concern for Apache James developers.</p>
<p>As part of our work on the project, we need rock-solid tools to benchmark our software. And this across all protocols
(JMAP, IMAP and SMTP). We used third-party Gatling load testing implementations for :</p>
<img src="images/performances/gatling_1.png" alt="" />
<ul>
<li>Testing main <a class="externalLink" href="https://github.com/linagora/james-gatling">JMAP</a> commands</li>
<li>Testing main <a class="externalLink" href="https://github.com/linagora/gatling-imap">IMAP</a> commands</li>
<li>Testing basic <a class="externalLink" href="https://github.com/linagora/james-gatling/tree/master/src/main/scala-2.11/org/apache/james/gatling/smtp">SMTP</a> scenarios</li>
</ul>
<img src="images/performances/gatling_2.png" alt="" />
<p>Load testing was conducted both on top of JPA and Cassandra + ElasticSearch implementations. We succeeded to support
1.000 Thunderbird like users on top of both backends.</p>
<p>The following results were obtained on a server with an Intel Xeon CPU (E3&#x2013;1231 3.40GHz 4 cores 8 threads) with 32
GB of RAM. We run Gatling on the same host, thus it has performance impact on the results. So far Gatling is run
manually when we take time for it. This might eventually become part of our CI.</p>
</section>
<section>
<h3><a name="Metric_collection"></a>Metric collection</h3>
<p> Additionally, we added metrics a bit everywhere in James using the brand new metrics API. We collect and export
everything in ElasticSearch using <a class="externalLink" href="http://metrics.dropwizard.io/3.2.1/">Dropwizard metrics</a>. Then we
graph it all using <a class="externalLink" href="http://grafana.com/">Grafana</a>. This allows us to collect all statistics and percentiles.
Boards can be downloaded <a class="externalLink" href="https://github.com/apache/james-project/tree/master/grafana-reporting">here</a>.</p>
<img src="images/performances/metrics.png" alt="" />
<ul>We track so far:
&#x200a;
<li>Protocols detailed time execution (and counts)</li>
<li>Percentile of mailet and matcher executions</li>
&#x200a;
<li>Enqueue and Dequeue time</li>
</ul>
<ul>All these solutions allow us to identify the components that need improvement. Here are some example of classical
metrics James can reach with a mono server Guice + Cassandra + ElasticSearch installation:
&#x200a;
<li>About 100 users</li>
&#x200a;
<li>So far a number of 1.500.000 e-mails, that we imported using IMAP-sync scripts</li>
<li>Around 15.000 incoming e-mails a day</li>
&#x200a;
<li>42.500 IMAP commands a day</li>
&#x200a;
<li>20.000 JMAP requests a day</li>
</ul>
<p>More details on metrics are available on <a href="metrics.html">the metric page</a>.</p>
</section>
<section>
<h3><a name="Measuring_dequeueing_speed"></a>Measuring dequeueing speed</h3>
<p>James can spool more than 65 mails per second (configured with Maildir mail storage and the FileMailQueue).</p>
<p>We ran some SMTP Gatling load testing during 5 minutes (https://github.com/linagora/james-gatling)</p>
<div class="source">
<pre>sbt
gatling:testOnly org.apache.james.gatling.smtp.scenari.NoAuthenticationNoEncryptionScenario</pre></div>
<p>The result was:</p>
<ol style="list-style-type: decimal">
<li>During these 5 minutes, 29.924 mails where enqueued (~100 email per second)</li>
<li>The dequeueing of these emails took 7 minutes and 40 seconds (~65 emails per second)</li>
</ol>
<p>We thus have a throughput of more than <b>65 mails/second</b>.</p>
<p>These numbers are obtained with the out-of-the-box configuration (not optimized), on a HDD disk. Better performance is expected with
better hardware and further JVM tuning (-XX:+UseParallelGC -XX:+AggressiveOpts -XX:+UseFastAccessorMethods).</p>
</section>
</section>
</div>
</div>
<div class="clear">
<hr/>
</div>
<div id="footer">
<div class="xright">Copyright &#169; 2006-2021
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All Rights Reserved.
</div>
<div class="clear">
<hr/>
</div>
</div>
</body>
</html>