<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-28 -->
<h2 id="performance-benchmarking-in-geode" class="position-relative d-flex align-items-center group">
<span>Performance Benchmarking in Geode</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="performance-benchmarking-in-geode"
aria-haspopup="dialog"
aria-label="Share link: Performance Benchmarking in Geode">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h2><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
<div class="hsm-dialog" role="document">
<div class="hsm-header">
<h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2>
<button type="button" class="hsm-close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
</div>
<div class="hsm-body">
<label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label>
<div class="input-group mb-4 hsm-url-group">
<input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" />
<button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
<i class="fa-duotone fa-clipboard" aria-hidden="true"></i>
</button>
</div>
<div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div>
<div class="hsm-share-grid">
<a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-twitter me-2"></i>Twitter
</a>
<a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-linkedin me-2"></i>LinkedIn
</a>
<a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-facebook me-2"></i>Facebook
</a>
</div>
</div>
</div>
</div>
<style>
.heading-share-modal {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.6);
z-index: 1050;
padding: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.heading-share-modal[hidden] { display: none !important; }
.hsm-dialog {
max-width: 420px;
width: 100%;
background: var(--bs-body-bg, #fff);
color: var(--bs-body-color, #212529);
border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
border-radius: 1rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
overflow: hidden;
animation: hsm-fade-in 0.2s ease-out;
}
@keyframes hsm-fade-in {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
[data-bs-theme="dark"] .hsm-dialog {
background: #1e293b;
border-color: rgba(255,255,255,0.1);
color: #f8f9fa;
}
.hsm-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
background: rgba(0,0,0,0.02);
}
[data-bs-theme="dark"] .hsm-header {
background: rgba(255,255,255,0.02);
border-color: rgba(255,255,255,0.1);
}
.hsm-close {
background: transparent;
border: none;
color: inherit;
opacity: 0.5;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 1.2rem;
line-height: 1;
transition: opacity 0.2s;
}
.hsm-close:hover {
opacity: 1;
}
.hsm-body {
padding: 1.5rem;
}
.hsm-url-group {
display: flex !important;
align-items: stretch;
}
.hsm-url-group .form-control {
flex: 1;
min-width: 0;
margin: 0;
background: var(--bs-secondary-bg, #f8f9fa);
border-color: var(--bs-border-color, #dee2e6);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
height: 42px;
}
.hsm-url-group .btn {
flex: 0 0 auto;
margin: 0;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 1.25rem;
z-index: 2;
}
[data-bs-theme="dark"] .hsm-url-group .form-control {
background: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
.hsm-share-grid {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.hsm-share-grid .btn {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0.6rem;
border-color: var(--bs-border-color);
width: 100%;
}
[data-bs-theme="dark"] .hsm-share-grid .btn {
color: #e2e8f0;
border-color: #475569;
}
[data-bs-theme="dark"] .hsm-share-grid .btn:hover {
background: #334155;
border-color: #cbd5e1;
}
</style>
<script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest && e.target.closest('.h-share');
if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
</script><p>Benchmarking provides objective measurements of database performance, enabling informed decisions about configuration, capacity planning, and optimization. Effective benchmarking reveals performance characteristics under various workloads and helps identify bottlenecks before they impact production systems.</p>
<p>This guide covers benchmarking methodologies, tools, metrics, and best practices for measuring and comparing Geode performance.</p>
<h3 id="benchmarking-fundamentals" class="position-relative d-flex align-items-center group">
<span>Benchmarking Fundamentals</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="benchmarking-fundamentals"
aria-haspopup="dialog"
aria-label="Share link: Benchmarking Fundamentals">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="why-benchmark" class="position-relative d-flex align-items-center group">
<span>Why Benchmark?</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="why-benchmark"
aria-haspopup="dialog"
aria-label="Share link: Why Benchmark?">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Benchmarking serves multiple purposes:</p>
<p><strong>Capacity Planning</strong>: Determine hardware requirements for expected workloads</p>
<p><strong>Configuration Tuning</strong>: Measure impact of configuration changes</p>
<p><strong>Regression Detection</strong>: Ensure updates don’t degrade performance</p>
<p><strong>Comparison</strong>: Evaluate Geode against alternatives or previous versions</p>
<p><strong>Optimization Validation</strong>: Verify that optimizations achieve intended improvements</p>
<h4 id="key-performance-metrics" class="position-relative d-flex align-items-center group">
<span>Key Performance Metrics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="key-performance-metrics"
aria-haspopup="dialog"
aria-label="Share link: Key Performance Metrics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Throughput</strong>: Operations per second the system can sustain</p>
<ul>
<li>Queries per second (QPS)</li>
<li>Transactions per second (TPS)</li>
<li>Nodes/edges created per second</li>
</ul>
<p><strong>Latency</strong>: Time to complete individual operations</p>
<ul>
<li>Average latency</li>
<li>Percentiles (p50, p95, p99, p99.9)</li>
<li>Maximum latency</li>
</ul>
<p><strong>Scalability</strong>: How performance changes with load</p>
<ul>
<li>Vertical scaling (larger machines)</li>
<li>Horizontal scaling (more nodes)</li>
<li>Data volume scaling</li>
</ul>
<p><strong>Resource Utilization</strong>: System resource consumption</p>
<ul>
<li>CPU usage</li>
<li>Memory usage</li>
<li>Disk I/O</li>
<li>Network I/O</li>
</ul>
<h4 id="benchmarking-principles" class="position-relative d-flex align-items-center group">
<span>Benchmarking Principles</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="benchmarking-principles"
aria-haspopup="dialog"
aria-label="Share link: Benchmarking Principles">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Reproducibility</strong>: Results should be consistent across runs</p>
<p><strong>Isolation</strong>: Control for external factors</p>
<p><strong>Realistic Workloads</strong>: Test patterns that match production</p>
<p><strong>Statistical Rigor</strong>: Collect sufficient samples, report variance</p>
<p><strong>Warm-up</strong>: Allow system to reach steady state before measuring</p>
<h3 id="geode-benchmark-suite" class="position-relative d-flex align-items-center group">
<span>Geode Benchmark Suite</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="geode-benchmark-suite"
aria-haspopup="dialog"
aria-label="Share link: Geode Benchmark Suite">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="built-in-benchmark-tool" class="position-relative d-flex align-items-center group">
<span>Built-in Benchmark Tool</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="built-in-benchmark-tool"
aria-haspopup="dialog"
aria-label="Share link: Built-in Benchmark Tool">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode includes a benchmarking tool for common scenarios:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Run standard benchmark suite</span>
</span></span><span class="line"><span class="cl">./geode benchmark run <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --workload standard <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --duration <span class="m">300</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --connections <span class="m">100</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output /benchmarks/results/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Available workloads</span>
</span></span><span class="line"><span class="cl">./geode benchmark list-workloads
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Workloads:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - standard: Mixed read/write operations</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - read-heavy: 95% reads, 5% writes</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - write-heavy: 20% reads, 80% writes</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - traversal: Graph traversal patterns</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - analytics: Aggregation and analysis queries</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - import: Bulk data loading</span>
</span></span></code></pre></div>
<h4 id="benchmark-configuration" class="position-relative d-flex align-items-center group">
<span>Benchmark Configuration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="benchmark-configuration"
aria-haspopup="dialog"
aria-label="Share link: Benchmark Configuration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="c"># benchmark.toml</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">benchmark</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">name</span> <span class="p">=</span> <span class="s2">"production-baseline"</span>
</span></span><span class="line"><span class="cl"><span class="nx">description</span> <span class="p">=</span> <span class="s2">"Baseline performance measurement"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">benchmark</span><span class="p">.</span><span class="nx">workload</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">type</span> <span class="p">=</span> <span class="s2">"standard"</span>
</span></span><span class="line"><span class="cl"><span class="nx">read_ratio</span> <span class="p">=</span> <span class="mf">0.8</span>
</span></span><span class="line"><span class="cl"><span class="nx">write_ratio</span> <span class="p">=</span> <span class="mf">0.2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">benchmark</span><span class="p">.</span><span class="nx">load</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="c"># Concurrent connections</span>
</span></span><span class="line"><span class="cl"><span class="nx">connections</span> <span class="p">=</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl"><span class="c"># Queries per connection per second</span>
</span></span><span class="line"><span class="cl"><span class="nx">rate_per_connection</span> <span class="p">=</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl"><span class="c"># Total duration</span>
</span></span><span class="line"><span class="cl"><span class="nx">duration_seconds</span> <span class="p">=</span> <span class="mi">300</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">benchmark</span><span class="p">.</span><span class="nx">data</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="c"># Initial dataset size</span>
</span></span><span class="line"><span class="cl"><span class="nx">initial_nodes</span> <span class="p">=</span> <span class="mi">1000000</span>
</span></span><span class="line"><span class="cl"><span class="nx">initial_edges</span> <span class="p">=</span> <span class="mi">5000000</span>
</span></span><span class="line"><span class="cl"><span class="c"># Node/edge properties</span>
</span></span><span class="line"><span class="cl"><span class="nx">avg_properties_per_node</span> <span class="p">=</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl"><span class="nx">avg_properties_per_edge</span> <span class="p">=</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">benchmark</span><span class="p">.</span><span class="nx">queries</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="c"># Query distribution</span>
</span></span><span class="line"><span class="cl"><span class="nx">simple_lookup_percent</span> <span class="p">=</span> <span class="mi">40</span>
</span></span><span class="line"><span class="cl"><span class="nx">index_scan_percent</span> <span class="p">=</span> <span class="mi">30</span>
</span></span><span class="line"><span class="cl"><span class="nx">traversal_1hop_percent</span> <span class="p">=</span> <span class="mi">15</span>
</span></span><span class="line"><span class="cl"><span class="nx">traversal_3hop_percent</span> <span class="p">=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl"><span class="nx">aggregation_percent</span> <span class="p">=</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">benchmark</span><span class="p">.</span><span class="nx">output</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">format</span> <span class="p">=</span> <span class="s2">"json"</span>
</span></span><span class="line"><span class="cl"><span class="nx">directory</span> <span class="p">=</span> <span class="s2">"/benchmarks/results"</span>
</span></span><span class="line"><span class="cl"><span class="nx">include_histograms</span> <span class="p">=</span> <span class="kc">true</span>
</span></span></code></pre></div>
<h4 id="running-benchmarks" class="position-relative d-flex align-items-center group">
<span>Running Benchmarks</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="running-benchmarks"
aria-haspopup="dialog"
aria-label="Share link: Running Benchmarks">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Run with configuration file</span>
</span></span><span class="line"><span class="cl">./geode benchmark run --config benchmark.toml
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run specific workload</span>
</span></span><span class="line"><span class="cl">./geode benchmark run <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --workload read-heavy <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --duration <span class="m">600</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --connections <span class="m">200</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --data-size <span class="m">10000000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Incremental load test</span>
</span></span><span class="line"><span class="cl">./geode benchmark run <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --workload standard <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --ramp-up <span class="m">60</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --connections-start <span class="m">10</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --connections-end <span class="m">500</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --duration <span class="m">600</span>
</span></span></code></pre></div>
<h3 id="load-testing-patterns" class="position-relative d-flex align-items-center group">
<span>Load Testing Patterns</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="load-testing-patterns"
aria-haspopup="dialog"
aria-label="Share link: Load Testing Patterns">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="point-query-performance" class="position-relative d-flex align-items-center group">
<span>Point Query Performance</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="point-query-performance"
aria-haspopup="dialog"
aria-label="Share link: Point Query Performance">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Measure single-record lookup performance:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Benchmark</span><span class="w"> </span><span class="kd">query</span><span class="p">:</span><span class="w"> </span><span class="nc">lookup</span><span class="w"> </span><span class="nc">by</span><span class="w"> </span><span class="py">ID</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$id</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">email</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">created_at</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Benchmark Script</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">asyncio</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">time</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">statistics</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">geode_client</span> <span class="kn">import</span> <span class="n">Client</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">benchmark_point_queries</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">host</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">num_queries</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">concurrency</span><span class="p">:</span> <span class="nb">int</span>
</span></span><span class="line"><span class="cl"><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Benchmark point query performance"""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">latencies</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="n">errors</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Generate random user IDs</span>
</span></span><span class="line"><span class="cl"> <span class="n">user_ids</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s2">"user-</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">num_queries</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">semaphore</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">Semaphore</span><span class="p">(</span><span class="n">concurrency</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">def</span> <span class="nf">run_query</span><span class="p">(</span><span class="n">user_id</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="k">nonlocal</span> <span class="n">errors</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">semaphore</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"MATCH (u:User {id: $id}) RETURN u"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">user_id</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">latencies</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">errors</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Run queries</span>
</span></span><span class="line"><span class="cl"> <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">run_query</span><span class="p">(</span><span class="n">uid</span><span class="p">)</span> <span class="k">for</span> <span class="n">uid</span> <span class="ow">in</span> <span class="n">user_ids</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"> <span class="n">total_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Report results</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Total queries: </span><span class="si">{</span><span class="n">num_queries</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Errors: </span><span class="si">{</span><span class="n">errors</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Duration: </span><span class="si">{</span><span class="n">total_time</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">s"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Throughput: </span><span class="si">{</span><span class="n">num_queries</span><span class="o">/</span><span class="n">total_time</span><span class="si">:</span><span class="s2">.0f</span><span class="si">}</span><span class="s2"> QPS"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Latency avg: </span><span class="si">{</span><span class="n">statistics</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">latencies</span><span class="p">)</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">ms"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Latency p50: </span><span class="si">{</span><span class="n">statistics</span><span class="o">.</span><span class="n">median</span><span class="p">(</span><span class="n">latencies</span><span class="p">)</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">ms"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Latency p95: </span><span class="si">{</span><span class="nb">sorted</span><span class="p">(</span><span class="n">latencies</span><span class="p">)[</span><span class="nb">int</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">latencies</span><span class="p">)</span><span class="o">*</span><span class="mf">0.95</span><span class="p">)]</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">ms"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Latency p99: </span><span class="si">{</span><span class="nb">sorted</span><span class="p">(</span><span class="n">latencies</span><span class="p">)[</span><span class="nb">int</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">latencies</span><span class="p">)</span><span class="o">*</span><span class="mf">0.99</span><span class="p">)]</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">ms"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">asyncio</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">benchmark_point_queries</span><span class="p">(</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="mi">100000</span><span class="p">,</span> <span class="mi">100</span><span class="p">))</span>
</span></span></code></pre></div>
<h4 id="traversal-performance" class="position-relative d-flex align-items-center group">
<span>Traversal Performance</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="traversal-performance"
aria-haspopup="dialog"
aria-label="Share link: Traversal Performance">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Measure graph traversal efficiency:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">benchmark_traversals</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">host</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">num_queries</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">max_depth</span><span class="p">:</span> <span class="nb">int</span>
</span></span><span class="line"><span class="cl"><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Benchmark traversal performance at various depths"""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">depth</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">max_depth</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">query</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User </span><span class="se">{{</span><span class="s2">id: $id</span><span class="se">}}</span><span class="s2">)-[:FOLLOWS*1..</span><span class="si">{</span><span class="n">depth</span><span class="si">}</span><span class="s2">]->(friend)
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN DISTINCT friend.id, friend.name
</span></span></span><span class="line"><span class="cl"><span class="s2"> LIMIT 100
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">latencies</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num_queries</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="s2">"user-1"</span><span class="p">})</span>
</span></span><span class="line"><span class="cl"> <span class="n">latencies</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Depth </span><span class="si">{</span><span class="n">depth</span><span class="si">}</span><span class="s2">: avg=</span><span class="si">{</span><span class="n">statistics</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">latencies</span><span class="p">)</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">ms, "</span>
</span></span><span class="line"><span class="cl"> <span class="sa">f</span><span class="s2">"p95=</span><span class="si">{</span><span class="nb">sorted</span><span class="p">(</span><span class="n">latencies</span><span class="p">)[</span><span class="nb">int</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">latencies</span><span class="p">)</span><span class="o">*</span><span class="mf">0.95</span><span class="p">)]</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">ms"</span><span class="p">)</span>
</span></span></code></pre></div>
<h4 id="write-performance" class="position-relative d-flex align-items-center group">
<span>Write Performance</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="write-performance"
aria-haspopup="dialog"
aria-label="Share link: Write Performance">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Measure insert and update throughput:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">benchmark_writes</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">host</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">num_operations</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">batch_size</span><span class="p">:</span> <span class="nb">int</span>
</span></span><span class="line"><span class="cl"><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Benchmark write performance"""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Single inserts</span>
</span></span><span class="line"><span class="cl"> <span class="n">single_latencies</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num_operations</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (u:User {
</span></span></span><span class="line"><span class="cl"><span class="s2"> id: $id,
</span></span></span><span class="line"><span class="cl"><span class="s2"> name: $name,
</span></span></span><span class="line"><span class="cl"><span class="s2"> email: $email,
</span></span></span><span class="line"><span class="cl"><span class="s2"> created_at: datetime()
</span></span></span><span class="line"><span class="cl"><span class="s2"> })
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"id"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"bench-user-</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"name"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"User </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"email"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"user</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">@example.com"</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl"> <span class="n">single_latencies</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Single inserts: </span><span class="si">{</span><span class="n">num_operations</span><span class="o">/</span><span class="nb">sum</span><span class="p">(</span><span class="n">single_latencies</span><span class="p">)</span><span class="o">*</span><span class="mi">1000</span><span class="si">:</span><span class="s2">.0f</span><span class="si">}</span><span class="s2"> ops/sec"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Batch inserts</span>
</span></span><span class="line"><span class="cl"> <span class="n">batch_latencies</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">batch_start</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">num_operations</span><span class="p">,</span> <span class="n">batch_size</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">users</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"batch-user-</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"name"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"User </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"email"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"user</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">@example.com"</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">batch_start</span><span class="p">,</span> <span class="nb">min</span><span class="p">(</span><span class="n">batch_start</span> <span class="o">+</span> <span class="n">batch_size</span><span class="p">,</span> <span class="n">num_operations</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"> <span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> UNWIND $users AS u
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (n:User {
</span></span></span><span class="line"><span class="cl"><span class="s2"> id: u.id,
</span></span></span><span class="line"><span class="cl"><span class="s2"> name: u.name,
</span></span></span><span class="line"><span class="cl"><span class="s2"> email: u.email,
</span></span></span><span class="line"><span class="cl"><span class="s2"> created_at: datetime()
</span></span></span><span class="line"><span class="cl"><span class="s2"> })
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s2">"users"</span><span class="p">:</span> <span class="n">users</span><span class="p">})</span>
</span></span><span class="line"><span class="cl"> <span class="n">batch_latencies</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Batch inserts (</span><span class="si">{</span><span class="n">batch_size</span><span class="si">}</span><span class="s2">): "</span>
</span></span><span class="line"><span class="cl"> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">num_operations</span><span class="o">/</span><span class="nb">sum</span><span class="p">(</span><span class="n">batch_latencies</span><span class="p">)</span><span class="o">*</span><span class="mi">1000</span><span class="si">:</span><span class="s2">.0f</span><span class="si">}</span><span class="s2"> ops/sec"</span><span class="p">)</span>
</span></span></code></pre></div>
<h4 id="mixed-workload" class="position-relative d-flex align-items-center group">
<span>Mixed Workload</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="mixed-workload"
aria-haspopup="dialog"
aria-label="Share link: Mixed Workload">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Simulate realistic production workloads:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">random</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">benchmark_mixed_workload</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">host</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">duration_seconds</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">read_ratio</span><span class="p">:</span> <span class="nb">float</span> <span class="o">=</span> <span class="mf">0.8</span>
</span></span><span class="line"><span class="cl"><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Benchmark mixed read/write workload"""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">operations</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"read"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"write"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"read_latency"</span><span class="p">:</span> <span class="p">[],</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"write_latency"</span><span class="p">:</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">while</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span> <span class="o"><</span> <span class="n">duration_seconds</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span> <span class="o"><</span> <span class="n">read_ratio</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Read operation</span>
</span></span><span class="line"><span class="cl"> <span class="n">user_id</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"user-</span><span class="si">{</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100000</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl"> <span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"MATCH (u:User {id: $id}) RETURN u"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">user_id</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">operations</span><span class="p">[</span><span class="s2">"read"</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"> <span class="n">operations</span><span class="p">[</span><span class="s2">"read_latency"</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Write operation</span>
</span></span><span class="line"><span class="cl"> <span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"MATCH (u:User {id: $id}) SET u.updated_at = datetime()"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"user-</span><span class="si">{</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100000</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">operations</span><span class="p">[</span><span class="s2">"write"</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"> <span class="n">operations</span><span class="p">[</span><span class="s2">"write_latency"</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">elapsed</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Duration: </span><span class="si">{</span><span class="n">elapsed</span><span class="si">:</span><span class="s2">.0f</span><span class="si">}</span><span class="s2">s"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Read throughput: </span><span class="si">{</span><span class="n">operations</span><span class="p">[</span><span class="s1">'read'</span><span class="p">]</span><span class="o">/</span><span class="n">elapsed</span><span class="si">:</span><span class="s2">.0f</span><span class="si">}</span><span class="s2"> QPS"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Write throughput: </span><span class="si">{</span><span class="n">operations</span><span class="p">[</span><span class="s1">'write'</span><span class="p">]</span><span class="o">/</span><span class="n">elapsed</span><span class="si">:</span><span class="s2">.0f</span><span class="si">}</span><span class="s2"> TPS"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Read latency avg: </span><span class="si">{</span><span class="n">statistics</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">operations</span><span class="p">[</span><span class="s1">'read_latency'</span><span class="p">])</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">ms"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Write latency avg: </span><span class="si">{</span><span class="n">statistics</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">operations</span><span class="p">[</span><span class="s1">'write_latency'</span><span class="p">])</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">ms"</span><span class="p">)</span>
</span></span></code></pre></div>
<h3 id="stress-testing" class="position-relative d-flex align-items-center group">
<span>Stress Testing</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="stress-testing"
aria-haspopup="dialog"
aria-label="Share link: Stress Testing">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="finding-breaking-points" class="position-relative d-flex align-items-center group">
<span>Finding Breaking Points</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="finding-breaking-points"
aria-haspopup="dialog"
aria-label="Share link: Finding Breaking Points">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Gradually increase load to find system limits:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Incremental load test</span>
</span></span><span class="line"><span class="cl">./geode benchmark stress <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --start-rate <span class="m">100</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --end-rate <span class="m">10000</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --step <span class="m">100</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --step-duration <span class="m">30</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --workload standard
</span></span></code></pre></div><p><strong>Custom Stress Test</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">stress_test</span><span class="p">(</span><span class="n">host</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">max_rate</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">step</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Find maximum sustainable throughput"""</span>
</span></span><span class="line"><span class="cl"> <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">rate</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">step</span><span class="p">,</span> <span class="n">max_rate</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">step</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Testing rate: </span><span class="si">{</span><span class="n">rate</span><span class="si">}</span><span class="s2"> QPS"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">latencies</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="n">errors</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">target_interval</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="n">rate</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="n">last_query</span> <span class="o">=</span> <span class="n">start_time</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">while</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span> <span class="o"><</span> <span class="mi">30</span><span class="p">:</span> <span class="c1"># 30 second test per rate</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Rate limiting</span>
</span></span><span class="line"><span class="cl"> <span class="n">now</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">now</span> <span class="o">-</span> <span class="n">last_query</span> <span class="o"><</span> <span class="n">target_interval</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">target_interval</span> <span class="o">-</span> <span class="p">(</span><span class="n">now</span> <span class="o">-</span> <span class="n">last_query</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"> <span class="n">last_query</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Execute query</span>
</span></span><span class="line"><span class="cl"> <span class="n">query_start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"MATCH (u:User {id: $id}) RETURN u"</span><span class="p">,</span> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="s2">"user-1"</span><span class="p">})</span>
</span></span><span class="line"><span class="cl"> <span class="n">latencies</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> <span class="o">-</span> <span class="n">query_start</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">errors</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">actual_rate</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">latencies</span><span class="p">)</span> <span class="o">/</span> <span class="mi">30</span>
</span></span><span class="line"><span class="cl"> <span class="n">p99_latency</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">latencies</span><span class="p">)[</span><span class="nb">int</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">latencies</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.99</span><span class="p">)]</span> <span class="k">if</span> <span class="n">latencies</span> <span class="k">else</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"target_rate"</span><span class="p">:</span> <span class="n">rate</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"actual_rate"</span><span class="p">:</span> <span class="n">actual_rate</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"p99_latency"</span><span class="p">:</span> <span class="n">p99_latency</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"error_rate"</span><span class="p">:</span> <span class="n">errors</span> <span class="o">/</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">latencies</span><span class="p">)</span> <span class="o">+</span> <span class="n">errors</span><span class="p">)</span> <span class="k">if</span> <span class="n">latencies</span> <span class="k">else</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Stop if system is saturated</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">p99_latency</span> <span class="o">></span> <span class="mi">100</span> <span class="ow">or</span> <span class="n">errors</span> <span class="o">></span> <span class="nb">len</span><span class="p">(</span><span class="n">latencies</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.01</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"System saturated at </span><span class="si">{</span><span class="n">rate</span><span class="si">}</span><span class="s2"> QPS"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">break</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">results</span>
</span></span></code></pre></div>
<h4 id="sustained-load-testing" class="position-relative d-flex align-items-center group">
<span>Sustained Load Testing</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="sustained-load-testing"
aria-haspopup="dialog"
aria-label="Share link: Sustained Load Testing">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Test stability under continuous load:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 24-hour stability test</span>
</span></span><span class="line"><span class="cl">./geode benchmark run <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --workload standard <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --duration <span class="m">86400</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --connections <span class="m">100</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --rate <span class="m">5000</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --report-interval <span class="m">60</span>
</span></span></code></pre></div>
<h4 id="failure-injection" class="position-relative d-flex align-items-center group">
<span>Failure Injection</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="failure-injection"
aria-haspopup="dialog"
aria-label="Share link: Failure Injection">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Test performance under failure conditions:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">benchmark_with_failures</span><span class="p">(</span><span class="n">host</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">duration</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Benchmark while injecting failures"""</span>
</span></span><span class="line"><span class="cl"> <span class="kn">import</span> <span class="nn">subprocess</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">def</span> <span class="nf">inject_failure</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Periodically restart a node"""</span>
</span></span><span class="line"><span class="cl"> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">60</span><span class="p">)</span> <span class="c1"># Every minute</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">"Injecting failure: restarting node2"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="s2">"docker"</span><span class="p">,</span> <span class="s2">"restart"</span><span class="p">,</span> <span class="s2">"geode-node2"</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Run benchmark and failure injection concurrently</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">benchmark_mixed_workload</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">duration</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="n">inject_failure</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span></code></pre></div>
<h3 id="comparison-benchmarking" class="position-relative d-flex align-items-center group">
<span>Comparison Benchmarking</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="comparison-benchmarking"
aria-haspopup="dialog"
aria-label="Share link: Comparison Benchmarking">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="comparing-configurations" class="position-relative d-flex align-items-center group">
<span>Comparing Configurations</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="comparing-configurations"
aria-haspopup="dialog"
aria-label="Share link: Comparing Configurations">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">compare_configurations</span><span class="p">(</span><span class="n">configs</span><span class="p">:</span> <span class="nb">list</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Compare performance across different configurations"""</span>
</span></span><span class="line"><span class="cl"> <span class="n">results</span> <span class="o">=</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">config_name</span><span class="p">,</span> <span class="n">config_file</span> <span class="ow">in</span> <span class="n">configs</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Testing configuration: </span><span class="si">{</span><span class="n">config_name</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Apply configuration</span>
</span></span><span class="line"><span class="cl"> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="s2">"./geode"</span><span class="p">,</span> <span class="s2">"admin"</span><span class="p">,</span> <span class="s2">"reload-config"</span><span class="p">,</span> <span class="n">config_file</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="c1"># Wait for config to apply</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Run benchmark</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">benchmark_mixed_workload</span><span class="p">(</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="mi">300</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">results</span><span class="p">[</span><span class="n">config_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">result</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Report comparison</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">=== Configuration Comparison ==="</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="s1">'Config'</span><span class="si">:</span><span class="s2"><20</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="s1">'Read QPS'</span><span class="si">:</span><span class="s2"><12</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="s1">'Write TPS'</span><span class="si">:</span><span class="s2"><12</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="s1">'P99 Latency'</span><span class="si">:</span><span class="s2"><12</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">results</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">name</span><span class="si">:</span><span class="s2"><20</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">result</span><span class="p">[</span><span class="s1">'read_qps'</span><span class="p">]</span><span class="si">:</span><span class="s2"><12.0f</span><span class="si">}</span><span class="s2"> "</span>
</span></span><span class="line"><span class="cl"> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">result</span><span class="p">[</span><span class="s1">'write_tps'</span><span class="p">]</span><span class="si">:</span><span class="s2"><12.0f</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">result</span><span class="p">[</span><span class="s1">'p99_latency'</span><span class="p">]</span><span class="si">:</span><span class="s2"><12.2f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span></code></pre></div>
<h4 id="version-comparison" class="position-relative d-flex align-items-center group">
<span>Version Comparison</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="version-comparison"
aria-haspopup="dialog"
aria-label="Share link: Version Comparison">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Benchmark current version</span>
</span></span><span class="line"><span class="cl">./geode benchmark run --workload standard --output results-v0.18.json
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Switch to previous version</span>
</span></span><span class="line"><span class="cl">./deploy-version.sh v0.17
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Benchmark previous version</span>
</span></span><span class="line"><span class="cl">./geode benchmark run --workload standard --output results-v0.17.json
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Compare results</span>
</span></span><span class="line"><span class="cl">./geode benchmark compare results-v0.17.json results-v0.18.json
</span></span></code></pre></div>
<h3 id="benchmark-reporting" class="position-relative d-flex align-items-center group">
<span>Benchmark Reporting</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="benchmark-reporting"
aria-haspopup="dialog"
aria-label="Share link: Benchmark Reporting">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="json-output" class="position-relative d-flex align-items-center group">
<span>JSON Output</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="json-output"
aria-haspopup="dialog"
aria-label="Share link: JSON Output">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"benchmark_name"</span><span class="p">:</span> <span class="s2">"production-baseline"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"timestamp"</span><span class="p">:</span> <span class="s2">"2026-01-28T10:30:00Z"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"duration_seconds"</span><span class="p">:</span> <span class="mi">300</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"configuration"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"connections"</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"workload"</span><span class="p">:</span> <span class="s2">"standard"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"data_size"</span><span class="p">:</span> <span class="mi">1000000</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"results"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"throughput"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"total_operations"</span><span class="p">:</span> <span class="mi">1547832</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"operations_per_second"</span><span class="p">:</span> <span class="mf">5159.44</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"reads_per_second"</span><span class="p">:</span> <span class="mf">4127.55</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"writes_per_second"</span><span class="p">:</span> <span class="mf">1031.89</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"latency"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"read"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"avg_ms"</span><span class="p">:</span> <span class="mf">2.34</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"p50_ms"</span><span class="p">:</span> <span class="mf">1.89</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"p95_ms"</span><span class="p">:</span> <span class="mf">4.56</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"p99_ms"</span><span class="p">:</span> <span class="mf">8.12</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"p999_ms"</span><span class="p">:</span> <span class="mf">23.45</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"max_ms"</span><span class="p">:</span> <span class="mf">156.78</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"write"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"avg_ms"</span><span class="p">:</span> <span class="mf">5.67</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"p50_ms"</span><span class="p">:</span> <span class="mf">4.23</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"p95_ms"</span><span class="p">:</span> <span class="mf">12.34</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"p99_ms"</span><span class="p">:</span> <span class="mf">24.56</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"p999_ms"</span><span class="p">:</span> <span class="mf">67.89</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"max_ms"</span><span class="p">:</span> <span class="mf">234.56</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"errors"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"total"</span><span class="p">:</span> <span class="mi">23</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"rate"</span><span class="p">:</span> <span class="mf">0.000015</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"by_type"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"timeout"</span><span class="p">:</span> <span class="mi">15</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"connection_refused"</span><span class="p">:</span> <span class="mi">8</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"resources"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"cpu_avg_percent"</span><span class="p">:</span> <span class="mf">67.5</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"memory_avg_mb"</span><span class="p">:</span> <span class="mi">4523</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"disk_iops_avg"</span><span class="p">:</span> <span class="mi">12456</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"network_mbps_avg"</span><span class="p">:</span> <span class="mf">234.5</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
<h4 id="visualization" class="position-relative d-flex align-items-center group">
<span>Visualization</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="visualization"
aria-haspopup="dialog"
aria-label="Share link: Visualization">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">json</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">plot_benchmark_results</span><span class="p">(</span><span class="n">results_file</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Generate benchmark visualization"""</span>
</span></span><span class="line"><span class="cl"> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">results_file</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Latency distribution</span>
</span></span><span class="line"><span class="cl"> <span class="n">fig</span><span class="p">,</span> <span class="n">axes</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">10</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Throughput over time</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax1</span> <span class="o">=</span> <span class="n">axes</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax1</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s1">'time_series'</span><span class="p">][</span><span class="s1">'throughput'</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax1</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'Throughput Over Time'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax1</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s1">'Time (seconds)'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax1</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Operations/second'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Latency percentiles</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax2</span> <span class="o">=</span> <span class="n">axes</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="n">percentiles</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'p50'</span><span class="p">,</span> <span class="s1">'p95'</span><span class="p">,</span> <span class="s1">'p99'</span><span class="p">,</span> <span class="s1">'p999'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="n">data</span><span class="p">[</span><span class="s1">'results'</span><span class="p">][</span><span class="s1">'latency'</span><span class="p">][</span><span class="s1">'read'</span><span class="p">][</span><span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">p</span><span class="si">}</span><span class="s1">_ms'</span><span class="p">]</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">percentiles</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax2</span><span class="o">.</span><span class="n">bar</span><span class="p">(</span><span class="n">percentiles</span><span class="p">,</span> <span class="n">values</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax2</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'Read Latency Percentiles'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax2</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Latency (ms)'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Resource utilization</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax3</span> <span class="o">=</span> <span class="n">axes</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax3</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s1">'time_series'</span><span class="p">][</span><span class="s1">'cpu'</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s1">'CPU'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax3</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s1">'time_series'</span><span class="p">][</span><span class="s1">'memory'</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s1">'Memory'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax3</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'Resource Utilization'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax3</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Error rate</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax4</span> <span class="o">=</span> <span class="n">axes</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax4</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s1">'time_series'</span><span class="p">][</span><span class="s1">'error_rate'</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax4</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'Error Rate Over Time'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax4</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s1">'Time (seconds)'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax4</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Error Rate'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="s1">'benchmark_results.png'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</span></span></code></pre></div>
<h3 id="monitoring-during-benchmarks" class="position-relative d-flex align-items-center group">
<span>Monitoring During Benchmarks</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="monitoring-during-benchmarks"
aria-haspopup="dialog"
aria-label="Share link: Monitoring During Benchmarks">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="metrics-collection" class="position-relative d-flex align-items-center group">
<span>Metrics Collection</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="metrics-collection"
aria-haspopup="dialog"
aria-label="Share link: Metrics Collection">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Collect comprehensive metrics during benchmarks:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Start Prometheus metrics collection</span>
</span></span><span class="line"><span class="cl">curl http://localhost:3141/metrics > metrics_before.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run benchmark</span>
</span></span><span class="line"><span class="cl">./geode benchmark run --workload standard --duration <span class="m">300</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Collect metrics after</span>
</span></span><span class="line"><span class="cl">curl http://localhost:3141/metrics > metrics_after.txt
</span></span></code></pre></div>
<h4 id="real-time-monitoring" class="position-relative d-flex align-items-center group">
<span>Real-Time Monitoring</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="real-time-monitoring"
aria-haspopup="dialog"
aria-label="Share link: Real-Time Monitoring">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">prometheus_client</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">monitor_benchmark</span><span class="p">(</span><span class="n">benchmark_coro</span><span class="p">,</span> <span class="n">metrics_port</span><span class="o">=</span><span class="mi">8000</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Monitor benchmark with Prometheus metrics"""</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Start metrics server</span>
</span></span><span class="line"><span class="cl"> <span class="n">prometheus_client</span><span class="o">.</span><span class="n">start_http_server</span><span class="p">(</span><span class="n">metrics_port</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Custom metrics</span>
</span></span><span class="line"><span class="cl"> <span class="n">ops_counter</span> <span class="o">=</span> <span class="n">prometheus_client</span><span class="o">.</span><span class="n">Counter</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'benchmark_operations_total'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'Total benchmark operations'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">[</span><span class="s1">'operation_type'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">latency_histogram</span> <span class="o">=</span> <span class="n">prometheus_client</span><span class="o">.</span><span class="n">Histogram</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'benchmark_latency_seconds'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'Operation latency'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">[</span><span class="s1">'operation_type'</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="n">buckets</span><span class="o">=</span><span class="p">[</span><span class="mf">.001</span><span class="p">,</span> <span class="mf">.005</span><span class="p">,</span> <span class="mf">.01</span><span class="p">,</span> <span class="mf">.025</span><span class="p">,</span> <span class="mf">.05</span><span class="p">,</span> <span class="mf">.1</span><span class="p">,</span> <span class="mf">.25</span><span class="p">,</span> <span class="mf">.5</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">2.5</span><span class="p">,</span> <span class="mf">5.0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Run benchmark with metrics</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">def</span> <span class="nf">instrumented_query</span><span class="p">(</span><span class="n">query_func</span><span class="p">,</span> <span class="n">op_type</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="k">with</span> <span class="n">latency_histogram</span><span class="o">.</span><span class="n">labels</span><span class="p">(</span><span class="n">op_type</span><span class="p">)</span><span class="o">.</span><span class="n">time</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">query_func</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="n">ops_counter</span><span class="o">.</span><span class="n">labels</span><span class="p">(</span><span class="n">op_type</span><span class="p">)</span><span class="o">.</span><span class="n">inc</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">result</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">benchmark_coro</span><span class="p">(</span><span class="n">instrumented_query</span><span class="p">)</span>
</span></span></code></pre></div>
<h3 id="best-practices" class="position-relative d-flex align-items-center group">
<span>Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="best-practices"
aria-haspopup="dialog"
aria-label="Share link: Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="benchmark-environment" class="position-relative d-flex align-items-center group">
<span>Benchmark Environment</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="benchmark-environment"
aria-haspopup="dialog"
aria-label="Share link: Benchmark Environment">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Isolate the system</strong>: Dedicated hardware, no competing workloads</li>
<li><strong>Control external factors</strong>: Network latency, disk state</li>
<li><strong>Use production-like data</strong>: Size, distribution, and patterns</li>
<li><strong>Document environment</strong>: Hardware, OS, configuration</li>
</ol>
<h4 id="methodology" class="position-relative d-flex align-items-center group">
<span>Methodology</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="methodology"
aria-haspopup="dialog"
aria-label="Share link: Methodology">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Warm up the system</strong>: Run queries before measuring</li>
<li><strong>Use sufficient duration</strong>: Minimum 5 minutes, preferably longer</li>
<li><strong>Multiple runs</strong>: Average results across 3-5 runs</li>
<li><strong>Report variance</strong>: Include standard deviation</li>
<li><strong>Test at multiple load levels</strong>: Find saturation point</li>
</ol>
<h4 id="reporting" class="position-relative d-flex align-items-center group">
<span>Reporting</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="reporting"
aria-haspopup="dialog"
aria-label="Share link: Reporting">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Include all percentiles</strong>: p50, p95, p99, p99.9, max</li>
<li><strong>Report throughput and latency</strong>: Both matter</li>
<li><strong>Document configuration</strong>: Complete reproducibility</li>
<li><strong>Show resource utilization</strong>: CPU, memory, I/O</li>
<li><strong>Include error rates</strong>: Completeness matters</li>
</ol>
<h4 id="common-pitfalls" class="position-relative d-flex align-items-center group">
<span>Common Pitfalls</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="common-pitfalls"
aria-haspopup="dialog"
aria-label="Share link: Common Pitfalls">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Insufficient warm-up</strong>: Cold caches skew results</li>
<li><strong>Too short duration</strong>: May miss periodic behaviors</li>
<li><strong>Client-side bottlenecks</strong>: Ensure client can generate load</li>
<li><strong>Network effects</strong>: Latency may be network, not database</li>
<li><strong>Ignoring errors</strong>: High throughput with errors is meaningless</li>
</ol>
<h3 id="benchmark-checklist" class="position-relative d-flex align-items-center group">
<span>Benchmark Checklist</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="benchmark-checklist"
aria-haspopup="dialog"
aria-label="Share link: Benchmark Checklist">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Before running benchmarks:</p>
<ul>
<li><input disabled="" type="checkbox"> Environment isolated and documented</li>
<li><input disabled="" type="checkbox"> Data loaded and representative</li>
<li><input disabled="" type="checkbox"> Configuration documented</li>
<li><input disabled="" type="checkbox"> Monitoring in place</li>
<li><input disabled="" type="checkbox"> Warm-up period defined</li>
</ul>
<p>During benchmarks:</p>
<ul>
<li><input disabled="" type="checkbox"> Monitor resource utilization</li>
<li><input disabled="" type="checkbox"> Check for errors</li>
<li><input disabled="" type="checkbox"> Verify steady-state reached</li>
<li><input disabled="" type="checkbox"> Collect all metrics</li>
</ul>
<p>After benchmarks:</p>
<ul>
<li><input disabled="" type="checkbox"> Verify data integrity</li>
<li><input disabled="" type="checkbox"> Analyze results</li>
<li><input disabled="" type="checkbox"> Document findings</li>
<li><input disabled="" type="checkbox"> Archive raw data</li>
</ul>
<h3 id="related-topics" class="position-relative d-flex align-items-center group">
<span>Related Topics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="related-topics"
aria-haspopup="dialog"
aria-label="Share link: Related Topics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="/tags/performance/"
>Performance</a>
- Performance optimization</li>
<li><a
href="/tags/profiling/"
>Profiling</a>
- Query profiling</li>
<li><a
href="/tags/monitoring/"
>Monitoring</a>
- System monitoring</li>
<li><a
href="/tags/query-optimization/"
>Query Optimization</a>
- Query tuning</li>
<li><a
href="/tags/configuration/"
>Configuration</a>
- Server configuration</li>
<li><a
href="/tags/scaling/"
>Scaling</a>
- Scaling strategies</li>
</ul>
<h3 id="further-reading" class="position-relative d-flex align-items-center group">
<span>Further Reading</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="further-reading"
aria-haspopup="dialog"
aria-label="Share link: Further Reading">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li>Benchmarking Methodology Guide</li>
<li>Load Testing Best Practices</li>
<li>Performance Regression Testing</li>
<li>Capacity Planning with Benchmarks</li>
<li>Benchmark Result Analysis</li>
<li>Industry Standard Benchmarks (LDBC, etc.)</li>
</ul>
Tag
1 article
Performance Benchmarking
Comprehensive guide to benchmarking Geode graph database performance including load testing, throughput analysis, latency measurement, and comparison methodologies.