<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-28 -->
<h2 id="benchmarking-guide" class="position-relative d-flex align-items-center group">
<span>Benchmarking Guide</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-guide"
aria-haspopup="dialog"
aria-label="Share link: Benchmarking Guide">
<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>This guide covers benchmarking Geode for performance evaluation, capacity planning, and optimization validation.</p>
<h3 id="overview" class="position-relative d-flex align-items-center group">
<span>Overview</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="overview"
aria-haspopup="dialog"
aria-label="Share link: Overview">
<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>Effective benchmarking requires:</p>
<table>
<thead>
<tr>
<th>Component</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td>Clear objectives</td>
<td>What are you measuring?</td>
</tr>
<tr>
<td>Reproducible setup</td>
<td>Consistent environment</td>
</tr>
<tr>
<td>Realistic workloads</td>
<td>Representative of production</td>
</tr>
<tr>
<td>Proper metrics</td>
<td>Latency, throughput, resource usage</td>
</tr>
<tr>
<td>Statistical rigor</td>
<td>Multiple runs, confidence intervals</td>
</tr>
</tbody>
</table>
<h3 id="benchmarking-objectives" class="position-relative d-flex align-items-center group">
<span>Benchmarking Objectives</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-objectives"
aria-haspopup="dialog"
aria-label="Share link: Benchmarking Objectives">
<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="common-objectives" class="position-relative d-flex align-items-center group">
<span>Common Objectives</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-objectives"
aria-haspopup="dialog"
aria-label="Share link: Common Objectives">
<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><table>
<thead>
<tr>
<th>Objective</th>
<th>Metrics</th>
<th>Use Case</th>
</tr>
</thead>
<tbody>
<tr>
<td>Baseline</td>
<td>Throughput, latency</td>
<td>Establish reference point</td>
</tr>
<tr>
<td>Capacity planning</td>
<td>Max throughput, breaking point</td>
<td>Sizing infrastructure</td>
</tr>
<tr>
<td>Regression testing</td>
<td>Before/after comparison</td>
<td>Validating changes</td>
</tr>
<tr>
<td>Optimization</td>
<td>Specific metric improvement</td>
<td>Tuning configuration</td>
</tr>
<tr>
<td>Competitive analysis</td>
<td>Comparison with alternatives</td>
<td>Technology selection</td>
</tr>
</tbody>
</table>
<h4 id="defining-success-criteria" class="position-relative d-flex align-items-center group">
<span>Defining Success Criteria</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="defining-success-criteria"
aria-haspopup="dialog"
aria-label="Share link: Defining Success Criteria">
<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-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># benchmark-criteria.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">objectives</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">"Query Latency"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">metric</span><span class="p">:</span><span class="w"> </span><span class="s2">"p99_latency_ms"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="s2">"<100ms"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">"Read Throughput"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">metric</span><span class="p">:</span><span class="w"> </span><span class="s2">"queries_per_second"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="s2">">10000"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">"Write Throughput"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">metric</span><span class="p">:</span><span class="w"> </span><span class="s2">"writes_per_second"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="s2">">5000"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">"Mixed Workload"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">metric</span><span class="p">:</span><span class="w"> </span><span class="s2">"operations_per_second"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="s2">">8000"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">workload</span><span class="p">:</span><span class="w"> </span><span class="s2">"50% read, 50% write"</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="environment-setup" class="position-relative d-flex align-items-center group">
<span>Environment Setup</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="environment-setup"
aria-haspopup="dialog"
aria-label="Share link: Environment Setup">
<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="hardware-requirements" class="position-relative d-flex align-items-center group">
<span>Hardware Requirements</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="hardware-requirements"
aria-haspopup="dialog"
aria-label="Share link: Hardware Requirements">
<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>Benchmark Server</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Recommended for benchmarking</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="m">16</span><span class="l">+ cores (same SKU as production)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="l">64GB+ RAM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="l">NVMe SSD (1TB+)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">network</span><span class="p">:</span><span class="w"> </span><span class="l">10Gbps+</span><span class="w">
</span></span></span></code></pre></div><p><strong>Load Generator</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Separate machine for load generation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="m">8</span><span class="l">+ cores</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="l">16GB+ RAM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">network</span><span class="p">:</span><span class="w"> </span><span class="l">10Gbps+ (same network as server)</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="software-configuration" class="position-relative d-flex align-items-center group">
<span>Software 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="software-configuration"
aria-haspopup="dialog"
aria-label="Share link: Software 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-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># geode.yaml - Benchmark configuration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">server</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">listen</span><span class="p">:</span><span class="w"> </span><span class="s1">'0.0.0.0:3141'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_connections</span><span class="p">:</span><span class="w"> </span><span class="m">50000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">storage</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">page_cache_size</span><span class="p">:</span><span class="w"> </span><span class="s1">'32GB'</span><span class="w"> </span><span class="c"># 50% of RAM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">page_size</span><span class="p">:</span><span class="w"> </span><span class="m">8192</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wal_sync_interval</span><span class="p">:</span><span class="w"> </span><span class="l">100ms</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">query</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_concurrent_queries</span><span class="p">:</span><span class="w"> </span><span class="m">1000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">query_timeout</span><span class="p">:</span><span class="w"> </span><span class="l">30s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">query_memory_limit</span><span class="p">:</span><span class="w"> </span><span class="s1">'2GB'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Disable features that add overhead</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">logging</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">level</span><span class="p">:</span><span class="w"> </span><span class="l">warn </span><span class="w"> </span><span class="c"># Reduce logging</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">slow_query</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">monitoring</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">detailed_metrics</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> </span><span class="c"># Reduce metric overhead</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="system-tuning" class="position-relative d-flex align-items-center group">
<span>System Tuning</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="system-tuning"
aria-haspopup="dialog"
aria-label="Share link: System Tuning">
<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="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># system-tuning.sh - Prepare system for benchmarking</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Increase file descriptors</span>
</span></span><span class="line"><span class="cl"><span class="nb">ulimit</span> -n <span class="m">1000000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Tune TCP settings</span>
</span></span><span class="line"><span class="cl">sysctl -w net.core.somaxconn<span class="o">=</span><span class="m">65535</span>
</span></span><span class="line"><span class="cl">sysctl -w net.ipv4.tcp_max_syn_backlog<span class="o">=</span><span class="m">65535</span>
</span></span><span class="line"><span class="cl">sysctl -w net.core.netdev_max_backlog<span class="o">=</span><span class="m">65535</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Disable swap</span>
</span></span><span class="line"><span class="cl">swapoff -a
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Set CPU governor to performance</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl"> <span class="nb">echo</span> performance > <span class="nv">$cpu</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Disable transparent huge pages</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> never > /sys/kernel/mm/transparent_hugepage/enabled
</span></span></code></pre></div>
<h3 id="benchmark-tools" class="position-relative d-flex align-items-center group">
<span>Benchmark Tools</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-tools"
aria-haspopup="dialog"
aria-label="Share link: Benchmark Tools">
<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="geode-benchmark-tool" class="position-relative d-flex align-items-center group">
<span>Geode 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="geode-benchmark-tool"
aria-haspopup="dialog"
aria-label="Share link: Geode 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>Built-in benchmarking utility:</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"># Basic benchmark</span>
</span></span><span class="line"><span class="cl">geode benchmark <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --host localhost:3141 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --duration 60s <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --threads <span class="m">16</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Custom workload</span>
</span></span><span class="line"><span class="cl">geode benchmark <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --host localhost:3141 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --workload mixed <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --read-percent <span class="m">80</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --write-percent <span class="m">20</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --duration 300s <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --threads <span class="m">32</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --connections <span class="m">100</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Output:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ============================================</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Geode Benchmark Results</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ============================================</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Duration: 300s</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Threads: 32</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Connections: 100</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Throughput:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Total Operations: 2,450,000</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Operations/sec: 8,166</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Read ops/sec: 6,533</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Write ops/sec: 1,633</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Latency (ms):</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Min: 0.2</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Max: 45.3</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Mean: 2.1</span>
</span></span><span class="line"><span class="cl"><span class="c1"># P50: 1.8</span>
</span></span><span class="line"><span class="cl"><span class="c1"># P95: 4.5</span>
</span></span><span class="line"><span class="cl"><span class="c1"># P99: 8.2</span>
</span></span><span class="line"><span class="cl"><span class="c1"># P99.9: 15.3</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Errors: 0 (0.00%)</span>
</span></span></code></pre></div>
<h4 id="custom-benchmark-scripts" class="position-relative d-flex align-items-center group">
<span>Custom Benchmark Scripts</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="custom-benchmark-scripts"
aria-haspopup="dialog"
aria-label="Share link: Custom Benchmark Scripts">
<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>Python Benchmark</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="ch">#!/usr/bin/env python3</span>
</span></span><span class="line"><span class="cl"><span class="c1"># benchmark.py</span>
</span></span><span class="line"><span class="cl">
</span></span><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">GeodeClient</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_reads</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">num_queries</span><span class="p">,</span> <span class="n">concurrency</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Benchmark read queries"""</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="k">async</span> <span class="k">def</span> <span class="nf">run_query</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="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">await</span> <span class="n">client</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"MATCH (p:Person) RETURN p LIMIT 10"</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 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 concurrent queries</span>
</span></span><span class="line"><span class="cl"> <span class="n">tasks</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="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">tasks</span><span class="p">)</span> <span class="o">>=</span> <span class="n">concurrency</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">done</span><span class="p">,</span> <span class="n">tasks</span> <span class="o">=</span> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">wait</span><span class="p">(</span><span class="n">tasks</span><span class="p">,</span> <span class="n">return_when</span><span class="o">=</span><span class="n">asyncio</span><span class="o">.</span><span class="n">FIRST_COMPLETED</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">tasks</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">tasks</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">tasks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">asyncio</span><span class="o">.</span><span class="n">create_task</span><span class="p">(</span><span class="n">run_query</span><span class="p">()))</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">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="n">tasks</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'count'</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="s1">'errors'</span><span class="p">:</span> <span class="n">errors</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'latencies'</span><span class="p">:</span> <span class="n">latencies</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'p50'</span><span class="p">:</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></span><span class="line"><span class="cl"> <span class="s1">'p95'</span><span class="p">:</span> <span class="n">statistics</span><span class="o">.</span><span class="n">quantiles</span><span class="p">(</span><span class="n">latencies</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">20</span><span class="p">)[</span><span class="mi">18</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'p99'</span><span class="p">:</span> <span class="n">statistics</span><span class="o">.</span><span class="n">quantiles</span><span class="p">(</span><span class="n">latencies</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">100</span><span class="p">)[</span><span class="mi">98</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'mean'</span><span class="p">:</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></span><span class="line"><span class="cl"> <span class="s1">'qps'</span><span class="p">:</span> <span class="n">num_queries</span> <span class="o">/</span> <span class="p">(</span><span class="nb">sum</span><span class="p">(</span><span class="n">latencies</span><span class="p">)</span> <span class="o">/</span> <span class="mi">1000</span> <span class="o">/</span> <span class="n">concurrency</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="k">async</span> <span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="k">await</span> <span class="n">GeodeClient</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s2">"localhost: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"># Warmup</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">"Warming up..."</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">benchmark_reads</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="mi">1000</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"># Benchmark</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">"Running benchmark..."</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">results</span> <span class="o">=</span> <span class="k">await</span> <span class="n">benchmark_reads</span><span class="p">(</span><span class="n">client</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><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">"""
</span></span></span><span class="line"><span class="cl"><span class="s2">Benchmark Results
</span></span></span><span class="line"><span class="cl"><span class="s2">=================
</span></span></span><span class="line"><span class="cl"><span class="s2">Queries: </span><span class="si">{</span><span class="n">results</span><span class="p">[</span><span class="s1">'count'</span><span class="p">]</span><span class="si">}</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">Errors: </span><span class="si">{</span><span class="n">results</span><span class="p">[</span><span class="s1">'errors'</span><span class="p">]</span><span class="si">}</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">QPS: </span><span class="si">{</span><span class="n">results</span><span class="p">[</span><span class="s1">'qps'</span><span class="p">]</span><span class="si">:</span><span class="s2">.0f</span><span class="si">}</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">Latency (ms):
</span></span></span><span class="line"><span class="cl"><span class="s2"> Mean: </span><span class="si">{</span><span class="n">results</span><span class="p">[</span><span class="s1">'mean'</span><span class="p">]</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"> P50: </span><span class="si">{</span><span class="n">results</span><span class="p">[</span><span class="s1">'p50'</span><span class="p">]</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"> P95: </span><span class="si">{</span><span class="n">results</span><span class="p">[</span><span class="s1">'p95'</span><span class="p">]</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"> P99: </span><span class="si">{</span><span class="n">results</span><span class="p">[</span><span class="s1">'p99'</span><span class="p">]</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><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="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
</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">main</span><span class="p">())</span>
</span></span></code></pre></div><p><strong>Go Benchmark</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// benchmark_test.go
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s">"context"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"sync"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"testing"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"time"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="s">"go.codepros.org/geode"</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="kd">func</span> <span class="nf">BenchmarkReadQuery</span><span class="p">(</span><span class="nx">b</span> <span class="o">*</span><span class="nx">testing</span><span class="p">.</span><span class="nx">B</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">ctx</span> <span class="o">:=</span> <span class="nx">context</span><span class="p">.</span><span class="nf">Background</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="nx">client</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">geode</span><span class="p">.</span><span class="nf">Connect</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">"localhost:3141"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">defer</span> <span class="nx">client</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">b</span><span class="p">.</span><span class="nf">ResetTimer</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="nx">b</span><span class="p">.</span><span class="nf">RunParallel</span><span class="p">(</span><span class="kd">func</span><span class="p">(</span><span class="nx">pb</span> <span class="o">*</span><span class="nx">testing</span><span class="p">.</span><span class="nx">PB</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nx">pb</span><span class="p">.</span><span class="nf">Next</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span><span class="p">,</span> <span class="nx">_</span> <span class="p">=</span> <span class="nx">client</span><span class="p">.</span><span class="nf">Query</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">"MATCH (p:Person) RETURN p LIMIT 10"</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="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="kd">func</span> <span class="nf">BenchmarkWriteQuery</span><span class="p">(</span><span class="nx">b</span> <span class="o">*</span><span class="nx">testing</span><span class="p">.</span><span class="nx">B</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">ctx</span> <span class="o">:=</span> <span class="nx">context</span><span class="p">.</span><span class="nf">Background</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="nx">client</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">geode</span><span class="p">.</span><span class="nf">Connect</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">"localhost:3141"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">defer</span> <span class="nx">client</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">b</span><span class="p">.</span><span class="nf">ResetTimer</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p"><</span> <span class="nx">b</span><span class="p">.</span><span class="nx">N</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span><span class="p">,</span> <span class="nx">_</span> <span class="p">=</span> <span class="nx">client</span><span class="p">.</span><span class="nf">Query</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s">"CREATE (p:Person {id: $id, name: 'Test'})"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kd">interface</span><span class="p">{}{</span><span class="s">"id"</span><span class="p">:</span> <span class="nx">i</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="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Run: go test -bench=. -benchtime=60s -cpu=1,4,8,16
</span></span></span></code></pre></div>
<h4 id="load-generation-tools" class="position-relative d-flex align-items-center group">
<span>Load Generation Tools</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-generation-tools"
aria-haspopup="dialog"
aria-label="Share link: Load Generation Tools">
<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>wrk2</strong>:</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"># Install wrk2</span>
</span></span><span class="line"><span class="cl">git clone https://github.com/giltene/wrk2.git
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> wrk2 <span class="o">&&</span> make
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run constant-rate benchmark</span>
</span></span><span class="line"><span class="cl">./wrk -t4 -c100 -d60s -R10000 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --latency <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -s benchmark.lua <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> http://localhost:8080/query
</span></span></code></pre></div><p><strong>hey</strong>:</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"># HTTP-based benchmark</span>
</span></span><span class="line"><span class="cl">hey -n <span class="m">100000</span> -c <span class="m">100</span> -m POST <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -d <span class="s1">'{"query": "MATCH (n) RETURN n LIMIT 10"}'</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> http://localhost:8080/query
</span></span></code></pre></div>
<h3 id="workload-types" class="position-relative d-flex align-items-center group">
<span>Workload Types</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="workload-types"
aria-haspopup="dialog"
aria-label="Share link: Workload Types">
<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="read-heavy-workload" class="position-relative d-flex align-items-center group">
<span>Read-Heavy 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="read-heavy-workload"
aria-haspopup="dialog"
aria-label="Share link: Read-Heavy 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><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 95% reads, 5% writes</span>
</span></span><span class="line"><span class="cl">geode benchmark <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --workload custom <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --read-percent <span class="m">95</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --write-percent <span class="m">5</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --queries-file read-queries.gql
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># read-queries.gql</span>
</span></span><span class="line"><span class="cl">MATCH <span class="o">(</span>p:Person <span class="o">{</span>email: <span class="nv">$email</span><span class="o">})</span> RETURN p<span class="p">;</span>
</span></span><span class="line"><span class="cl">MATCH <span class="o">(</span>p:Person<span class="o">)</span>-<span class="o">[</span>:KNOWS<span class="o">]</span>-><span class="o">(</span>f<span class="o">)</span> WHERE p.id <span class="o">=</span> <span class="nv">$id</span> RETURN f<span class="p">;</span>
</span></span><span class="line"><span class="cl">MATCH <span class="o">(</span>p:Person<span class="o">)</span> WHERE p.age > <span class="nv">$min</span> AND p.age < <span class="nv">$max</span> RETURN p LIMIT 100<span class="p">;</span>
</span></span></code></pre></div>
<h4 id="write-heavy-workload" class="position-relative d-flex align-items-center group">
<span>Write-Heavy 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="write-heavy-workload"
aria-haspopup="dialog"
aria-label="Share link: Write-Heavy 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><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 20% reads, 80% writes</span>
</span></span><span class="line"><span class="cl">geode benchmark <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --workload custom <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --read-percent <span class="m">20</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --write-percent <span class="m">80</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --queries-file write-queries.gql
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># write-queries.gql</span>
</span></span><span class="line"><span class="cl">CREATE <span class="o">(</span>p:Person <span class="o">{</span>id: <span class="nv">$id</span>, name: <span class="nv">$name</span>, email: <span class="nv">$email</span><span class="o">})</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">MATCH <span class="o">(</span>a:Person <span class="o">{</span>id: <span class="nv">$from</span><span class="o">})</span>, <span class="o">(</span>b:Person <span class="o">{</span>id: <span class="nv">$to</span><span class="o">})</span> CREATE <span class="o">(</span>a<span class="o">)</span>-<span class="o">[</span>:KNOWS<span class="o">]</span>-><span class="o">(</span>b<span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">MATCH <span class="o">(</span>p:Person <span class="o">{</span>id: <span class="nv">$id</span><span class="o">})</span> SET p.updated <span class="o">=</span> datetime<span class="o">()</span><span class="p">;</span>
</span></span></code></pre></div>
<h4 id="mixed-oltp-workload" class="position-relative d-flex align-items-center group">
<span>Mixed OLTP 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-oltp-workload"
aria-haspopup="dialog"
aria-label="Share link: Mixed OLTP 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><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Balanced OLTP workload</span>
</span></span><span class="line"><span class="cl">geode benchmark <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --workload oltp <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --duration 300s <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --threads <span class="m">64</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># OLTP workload includes:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - 50% point reads</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - 20% range reads</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - 15% inserts</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - 10% updates</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - 5% deletes</span>
</span></span></code></pre></div>
<h4 id="analytical-workload" class="position-relative d-flex align-items-center group">
<span>Analytical 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="analytical-workload"
aria-haspopup="dialog"
aria-label="Share link: Analytical 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><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Analytical queries</span>
</span></span><span class="line"><span class="cl">geode benchmark <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --workload analytical <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --queries-file analytical-queries.gql
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># analytical-queries.gql</span>
</span></span><span class="line"><span class="cl">MATCH <span class="o">(</span>p:Person<span class="o">)</span>-<span class="o">[</span>:KNOWS<span class="o">]</span>-><span class="o">(</span>f<span class="o">)</span>
</span></span><span class="line"><span class="cl">RETURN p.city, count<span class="o">(</span>f<span class="o">)</span> AS friends
</span></span><span class="line"><span class="cl">GROUP BY p.city
</span></span><span class="line"><span class="cl">ORDER BY friends DESC
</span></span><span class="line"><span class="cl">LIMIT 10<span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">MATCH <span class="nv">path</span> <span class="o">=</span> shortestPath<span class="o">((</span>a:Person<span class="o">)</span>-<span class="o">[</span>:KNOWS*1..6<span class="o">]</span>-><span class="o">(</span>b:Person<span class="o">))</span>
</span></span><span class="line"><span class="cl">WHERE a.id <span class="o">=</span> <span class="nv">$start</span> AND b.id <span class="o">=</span> <span class="nv">$end</span>
</span></span><span class="line"><span class="cl">RETURN path<span class="p">;</span>
</span></span></code></pre></div>
<h4 id="graph-traversal-workload" class="position-relative d-flex align-items-center group">
<span>Graph Traversal 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="graph-traversal-workload"
aria-haspopup="dialog"
aria-label="Share link: Graph Traversal 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><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Deep graph traversals</span>
</span></span><span class="line"><span class="cl">geode benchmark <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --workload traversal <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --max-depth <span class="m">5</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --queries-file traversal-queries.gql
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># traversal-queries.gql</span>
</span></span><span class="line"><span class="cl">MATCH <span class="o">(</span>a:Person <span class="o">{</span>id: <span class="nv">$id</span><span class="o">})</span>-<span class="o">[</span>:KNOWS*1..3<span class="o">]</span>-><span class="o">(</span>b<span class="o">)</span>
</span></span><span class="line"><span class="cl">RETURN DISTINCT b<span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">MATCH <span class="o">(</span>a:Person<span class="o">)</span>-<span class="o">[</span>:KNOWS*2<span class="o">]</span>-><span class="o">(</span>b:Person<span class="o">)</span>-<span class="o">[</span>:KNOWS<span class="o">]</span>-><span class="o">(</span>c:Person<span class="o">)</span>
</span></span><span class="line"><span class="cl">WHERE a.id <span class="o">=</span> <span class="nv">$id</span>
</span></span><span class="line"><span class="cl">RETURN c LIMIT 100<span class="p">;</span>
</span></span></code></pre></div>
<h3 id="data-generation" class="position-relative d-flex align-items-center group">
<span>Data Generation</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="data-generation"
aria-haspopup="dialog"
aria-label="Share link: Data Generation">
<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="synthetic-data-generator" class="position-relative d-flex align-items-center group">
<span>Synthetic Data Generator</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="synthetic-data-generator"
aria-haspopup="dialog"
aria-label="Share link: Synthetic Data Generator">
<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"># Generate test data</span>
</span></span><span class="line"><span class="cl">geode data-gen <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --nodes <span class="m">1000000</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --edges <span class="m">5000000</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --node-labels Person,Company,Product <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --edge-types KNOWS,WORKS_AT,PURCHASED <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output test-data/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Load generated data</span>
</span></span><span class="line"><span class="cl">geode import <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --source test-data/ <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --format geode-export
</span></span></code></pre></div>
<h4 id="custom-data-generator" class="position-relative d-flex align-items-center group">
<span>Custom Data Generator</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="custom-data-generator"
aria-haspopup="dialog"
aria-label="Share link: Custom Data Generator">
<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="ch">#!/usr/bin/env python3</span>
</span></span><span class="line"><span class="cl"><span class="c1"># generate_data.py</span>
</span></span><span class="line"><span class="cl">
</span></span><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 class="kn">import</span> <span class="nn">json</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">faker</span> <span class="kn">import</span> <span class="n">Faker</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">fake</span> <span class="o">=</span> <span class="n">Faker</span><span class="p">()</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">generate_persons</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Generate person nodes"""</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">n</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="k">yield</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"id"</span><span class="p">:</span> <span class="n">i</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"name"</span><span class="p">:</span> <span class="n">fake</span><span class="o">.</span><span class="n">name</span><span class="p">(),</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"email"</span><span class="p">:</span> <span class="n">fake</span><span class="o">.</span><span class="n">email</span><span class="p">(),</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"age"</span><span class="p">:</span> <span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">80</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"city"</span><span class="p">:</span> <span class="n">fake</span><span class="o">.</span><span class="n">city</span><span class="p">(),</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"created_at"</span><span class="p">:</span> <span class="n">fake</span><span class="o">.</span><span class="n">date_time_this_decade</span><span class="p">()</span><span class="o">.</span><span class="n">isoformat</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="k">def</span> <span class="nf">generate_knows_relationships</span><span class="p">(</span><span class="n">n_persons</span><span class="p">,</span> <span class="n">avg_friends</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Generate KNOWS relationships"""</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">person_id</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n_persons</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">n_friends</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">avg_friends</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">friends</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">sample</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">n_persons</span><span class="p">),</span> <span class="nb">min</span><span class="p">(</span><span class="n">n_friends</span><span class="p">,</span> <span class="n">n_persons</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">friend_id</span> <span class="ow">in</span> <span class="n">friends</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">friend_id</span> <span class="o">!=</span> <span class="n">person_id</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">yield</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"source"</span><span class="p">:</span> <span class="n">person_id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"target"</span><span class="p">:</span> <span class="n">friend_id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"since"</span><span class="p">:</span> <span class="n">fake</span><span class="o">.</span><span class="n">date_this_decade</span><span class="p">()</span><span class="o">.</span><span class="n">isoformat</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"># Generate data</span>
</span></span><span class="line"><span class="cl"><span class="n">N_PERSONS</span> <span class="o">=</span> <span class="mi">1000000</span>
</span></span><span class="line"><span class="cl"><span class="n">AVG_FRIENDS</span> <span class="o">=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'persons.jsonl'</span><span class="p">,</span> <span class="s1">'w'</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="k">for</span> <span class="n">person</span> <span class="ow">in</span> <span class="n">generate_persons</span><span class="p">(</span><span class="n">N_PERSONS</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">person</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'knows.jsonl'</span><span class="p">,</span> <span class="s1">'w'</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="k">for</span> <span class="n">rel</span> <span class="ow">in</span> <span class="n">generate_knows_relationships</span><span class="p">(</span><span class="n">N_PERSONS</span><span class="p">,</span> <span class="n">AVG_FRIENDS</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">rel</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
</span></span></code></pre></div>
<h3 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>
</h3>
<h4 id="benchmark-script" class="position-relative d-flex align-items-center group">
<span>Benchmark Script</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-script"
aria-haspopup="dialog"
aria-label="Share link: Benchmark Script">
<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="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># run-benchmark.sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">set</span> -euo pipefail
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">RESULTS_DIR</span><span class="o">=</span><span class="s2">"results/</span><span class="k">$(</span>date +%Y%m%d-%H%M%S<span class="k">)</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl">mkdir -p <span class="s2">"</span><span class="nv">$RESULTS_DIR</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Configuration</span>
</span></span><span class="line"><span class="cl"><span class="nv">DURATION</span><span class="o">=</span><span class="m">300</span>
</span></span><span class="line"><span class="cl"><span class="nv">THREADS</span><span class="o">=</span><span class="s2">"1 4 8 16 32 64"</span>
</span></span><span class="line"><span class="cl"><span class="nv">WORKLOADS</span><span class="o">=</span><span class="s2">"read-heavy write-heavy mixed"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># System info</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"Collecting system info..."</span>
</span></span><span class="line"><span class="cl">uname -a > <span class="s2">"</span><span class="nv">$RESULTS_DIR</span><span class="s2">/system-info.txt"</span>
</span></span><span class="line"><span class="cl">lscpu >> <span class="s2">"</span><span class="nv">$RESULTS_DIR</span><span class="s2">/system-info.txt"</span>
</span></span><span class="line"><span class="cl">free -h >> <span class="s2">"</span><span class="nv">$RESULTS_DIR</span><span class="s2">/system-info.txt"</span>
</span></span><span class="line"><span class="cl">geode --version >> <span class="s2">"</span><span class="nv">$RESULTS_DIR</span><span class="s2">/system-info.txt"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Warmup</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"Warming up..."</span>
</span></span><span class="line"><span class="cl">geode benchmark --duration 60s --threads <span class="m">16</span> > /dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run benchmarks</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> workload in <span class="nv">$WORKLOADS</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> threads in <span class="nv">$THREADS</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">"Running: workload=</span><span class="nv">$workload</span><span class="s2"> threads=</span><span class="nv">$threads</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nv">OUTPUT_FILE</span><span class="o">=</span><span class="s2">"</span><span class="nv">$RESULTS_DIR</span><span class="s2">/</span><span class="si">${</span><span class="nv">workload</span><span class="si">}</span><span class="s2">_</span><span class="si">${</span><span class="nv">threads</span><span class="si">}</span><span class="s2">threads.json"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> geode benchmark <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --workload <span class="nv">$workload</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --duration <span class="nv">$DURATION</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --threads <span class="nv">$threads</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output json <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> > <span class="s2">"</span><span class="nv">$OUTPUT_FILE</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Cool down between runs</span>
</span></span><span class="line"><span class="cl"> sleep <span class="m">30</span>
</span></span><span class="line"><span class="cl"> <span class="k">done</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Generate summary</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"Generating summary..."</span>
</span></span><span class="line"><span class="cl">python3 summarize_results.py <span class="s2">"</span><span class="nv">$RESULTS_DIR</span><span class="s2">"</span> > <span class="s2">"</span><span class="nv">$RESULTS_DIR</span><span class="s2">/summary.md"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"Results saved to </span><span class="nv">$RESULTS_DIR</span><span class="s2">"</span>
</span></span></code></pre></div>
<h4 id="continuous-benchmarking" class="position-relative d-flex align-items-center group">
<span>Continuous 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="continuous-benchmarking"
aria-haspopup="dialog"
aria-label="Share link: Continuous 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>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># .github/workflows/benchmark.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Performance Benchmark</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">on</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">push</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">branches</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">main]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">schedule</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">cron</span><span class="p">:</span><span class="w"> </span><span class="s1">'0 0 * * 0'</span><span class="w"> </span><span class="c"># Weekly</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">jobs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">benchmark</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">runs-on</span><span class="p">:</span><span class="w"> </span><span class="l">self-hosted </span><span class="w"> </span><span class="c"># Dedicated benchmark runner</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">steps</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">actions/checkout@v3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Build Geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">make release</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Start Geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">./zig-out/bin/geode serve &</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Load test data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">./scripts/load-benchmark-data.sh</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Run benchmarks</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">./scripts/run-benchmark.sh</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Upload results</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">actions/upload-artifact@v3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">with</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">benchmark-results</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">results/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Compare with baseline</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd"> python3 scripts/compare_benchmark.py \
</span></span></span><span class="line"><span class="cl"><span class="sd"> --baseline results/baseline.json \
</span></span></span><span class="line"><span class="cl"><span class="sd"> --current results/latest.json \
</span></span></span><span class="line"><span class="cl"><span class="sd"> --threshold 5% # Fail if >5% regression</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="analyzing-results" class="position-relative d-flex align-items-center group">
<span>Analyzing Results</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="analyzing-results"
aria-haspopup="dialog"
aria-label="Share link: Analyzing Results">
<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-to-analyze" class="position-relative d-flex align-items-center group">
<span>Metrics to Analyze</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-to-analyze"
aria-haspopup="dialog"
aria-label="Share link: Metrics to Analyze">
<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><table>
<thead>
<tr>
<th>Metric</th>
<th>What It Tells You</th>
</tr>
</thead>
<tbody>
<tr>
<td>Throughput (ops/sec)</td>
<td>System capacity</td>
</tr>
<tr>
<td>Latency (p50, p95, p99)</td>
<td>Response time distribution</td>
</tr>
<tr>
<td>Error rate</td>
<td>Reliability under load</td>
</tr>
<tr>
<td>CPU utilization</td>
<td>Compute efficiency</td>
</tr>
<tr>
<td>Memory usage</td>
<td>Memory efficiency</td>
</tr>
<tr>
<td>Disk I/O</td>
<td>Storage bottlenecks</td>
</tr>
<tr>
<td>Network I/O</td>
<td>Network bottlenecks</td>
</tr>
</tbody>
</table>
<h4 id="result-analysis-script" class="position-relative d-flex align-items-center group">
<span>Result Analysis Script</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="result-analysis-script"
aria-haspopup="dialog"
aria-label="Share link: Result Analysis Script">
<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="ch">#!/usr/bin/env python3</span>
</span></span><span class="line"><span class="cl"><span class="c1"># analyze_results.py</span>
</span></span><span class="line"><span class="cl">
</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 class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
</span></span><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></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">load_results</span><span class="p">(</span><span class="n">results_dir</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Load benchmark results"""</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 class="k">for</span> <span class="n">file</span> <span class="ow">in</span> <span class="n">Path</span><span class="p">(</span><span class="n">results_dir</span><span class="p">)</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s2">"*.json"</span><span class="p">):</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">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 class="n">data</span><span class="p">[</span><span class="s1">'file'</span><span class="p">]</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">name</span>
</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 class="n">data</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">results</span><span class="p">)</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">analyze_throughput</span><span class="p">(</span><span class="n">df</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Analyze throughput scaling"""</span>
</span></span><span class="line"><span class="cl"> <span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</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">workload</span> <span class="ow">in</span> <span class="n">df</span><span class="p">[</span><span class="s1">'workload'</span><span class="p">]</span><span class="o">.</span><span class="n">unique</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="n">subset</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="p">[</span><span class="s1">'workload'</span><span class="p">]</span> <span class="o">==</span> <span class="n">workload</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">subset</span><span class="p">[</span><span class="s1">'threads'</span><span class="p">],</span> <span class="n">subset</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">marker</span><span class="o">=</span><span class="s1">'o'</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">workload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">ax</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s1">'Threads'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Throughput (ops/sec)'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'Throughput vs Concurrency'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="kc">True</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">savefig</span><span class="p">(</span><span class="s1">'throughput_scaling.png'</span><span class="p">)</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">analyze_latency</span><span class="p">(</span><span class="n">df</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Analyze 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">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">15</span><span class="p">,</span> <span class="mi">5</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">i</span><span class="p">,</span> <span class="n">percentile</span> <span class="ow">in</span> <span class="nb">enumerate</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></span><span class="line"><span class="cl"> <span class="n">ax</span> <span class="o">=</span> <span class="n">axes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">workload</span> <span class="ow">in</span> <span class="n">df</span><span class="p">[</span><span class="s1">'workload'</span><span class="p">]</span><span class="o">.</span><span class="n">unique</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="n">subset</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="p">[</span><span class="s1">'workload'</span><span class="p">]</span> <span class="o">==</span> <span class="n">workload</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">subset</span><span class="p">[</span><span class="s1">'threads'</span><span class="p">],</span> <span class="n">subset</span><span class="p">[</span><span class="n">percentile</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="n">marker</span><span class="o">=</span><span class="s1">'o'</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">workload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s1">'Threads'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">percentile</span><span class="si">}</span><span class="s1"> Latency (ms)'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">percentile</span><span class="si">}</span><span class="s1"> Latency vs Concurrency'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="n">ax</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="kc">True</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">'latency_analysis.png'</span><span class="p">)</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">generate_report</span><span class="p">(</span><span class="n">df</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Generate markdown report"""</span>
</span></span><span class="line"><span class="cl"> <span class="n">report</span> <span class="o">=</span> <span class="s2">"""# Benchmark Report
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">## Summary
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">| Metric | Value |
</span></span></span><span class="line"><span class="cl"><span class="s2">|--------|-------|
</span></span></span><span class="line"><span class="cl"><span class="s2">| Max Throughput | </span><span class="si">{max_throughput:.0f}</span><span class="s2"> ops/sec |
</span></span></span><span class="line"><span class="cl"><span class="s2">| Best P99 Latency | </span><span class="si">{best_p99:.2f}</span><span class="s2"> ms |
</span></span></span><span class="line"><span class="cl"><span class="s2">| Optimal Threads | </span><span class="si">{optimal_threads}</span><span class="s2"> |
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">## Detailed Results
</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="si">{detailed_table}</span><span class="s2">
</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">max_throughput</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">'throughput'</span><span class="p">]</span><span class="o">.</span><span class="n">max</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="n">best_p99</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">'p99'</span><span class="p">]</span><span class="o">.</span><span class="n">min</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="n">optimal_threads</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">df</span><span class="p">[</span><span class="s1">'throughput'</span><span class="p">]</span><span class="o">.</span><span class="n">idxmax</span><span class="p">(),</span> <span class="s1">'threads'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="n">detailed_table</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">to_markdown</span><span class="p">()</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">report</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">max_throughput</span><span class="o">=</span><span class="n">max_throughput</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">best_p99</span><span class="o">=</span><span class="n">best_p99</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">optimal_threads</span><span class="o">=</span><span class="n">optimal_threads</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">detailed_table</span><span class="o">=</span><span class="n">detailed_table</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="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="kn">import</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="cl"> <span class="n">results_dir</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</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">df</span> <span class="o">=</span> <span class="n">load_results</span><span class="p">(</span><span class="n">results_dir</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">analyze_throughput</span><span class="p">(</span><span class="n">df</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">analyze_latency</span><span class="p">(</span><span class="n">df</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="n">generate_report</span><span class="p">(</span><span class="n">df</span><span class="p">))</span>
</span></span></code></pre></div>
<h4 id="comparison-report" class="position-relative d-flex align-items-center group">
<span>Comparison Report</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-report"
aria-haspopup="dialog"
aria-label="Share link: Comparison Report">
<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-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gh"># Performance Comparison Report
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>
</span></span><span class="line"><span class="cl"><span class="gu">## Configuration
</span></span></span><span class="line"><span class="cl"><span class="gu"></span><span class="k">-</span> **Baseline**: v0.1.2
</span></span><span class="line"><span class="cl"><span class="k">-</span> **Current**: <span class="gs">v0.2.18</span>
</span></span><span class="line"><span class="cl"><span class="k">-</span> **Hardware**: 16 cores, 64GB RAM, NVMe SSD
</span></span><span class="line"><span class="cl"><span class="k">-</span> **Data**: 1M nodes, 10M relationships
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Results
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl">| Metric | Baseline | Current | Change |
</span></span><span class="line"><span class="cl">|--------|----------|---------|--------|
</span></span><span class="line"><span class="cl">| Read QPS | 15,234 | 16,891 | +10.9% |
</span></span><span class="line"><span class="cl">| Write QPS | 5,123 | 5,456 | +6.5% |
</span></span><span class="line"><span class="cl">| P50 Latency | 1.2ms | 1.1ms | -8.3% |
</span></span><span class="line"><span class="cl">| P99 Latency | 8.5ms | 7.2ms | -15.3% |
</span></span><span class="line"><span class="cl">| Peak Memory | 12GB | 11GB | -8.3% |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Conclusion
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>Version <span class="gs">0.2.18</span> shows improvements across all metrics, with
</span></span><span class="line"><span class="cl">particularly notable improvements in P99 latency (-15.3%).
</span></span><span class="line"><span class="cl">No regressions detected.
</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="benchmarking-best-practices" class="position-relative d-flex align-items-center group">
<span>Benchmarking 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="benchmarking-best-practices"
aria-haspopup="dialog"
aria-label="Share link: Benchmarking 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>
</h4><ol>
<li><strong>Isolate the system</strong>: No other workloads during benchmark</li>
<li><strong>Warm up</strong>: Run warmup phase before measurements</li>
<li><strong>Multiple runs</strong>: At least 3 runs for statistical validity</li>
<li><strong>Realistic data</strong>: Use production-like data size and distribution</li>
<li><strong>Monitor resources</strong>: Track CPU, memory, disk, network</li>
<li><strong>Document everything</strong>: Configuration, versions, hardware</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 warmup</strong>: JIT compilation, cache warming</li>
<li><strong>Coordinated omission</strong>: Load generator waiting skews latency</li>
<li><strong>Client bottleneck</strong>: Load generator limiting throughput</li>
<li><strong>Network effects</strong>: Localhost vs network overhead</li>
<li><strong>Small data sets</strong>: Cache effects masking real performance</li>
<li><strong>Single run</strong>: Statistical noise in results</li>
</ol>
<h4 id="reporting-guidelines" class="position-relative d-flex align-items-center group">
<span>Reporting Guidelines</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-guidelines"
aria-haspopup="dialog"
aria-label="Share link: Reporting Guidelines">
<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 configuration</strong>: Hardware, software versions, settings</li>
<li><strong>Show distribution</strong>: Not just averages, show percentiles</li>
<li><strong>Multiple metrics</strong>: Throughput AND latency</li>
<li><strong>Error rates</strong>: Include failures in results</li>
<li><strong>Reproducibility</strong>: Share scripts and data</li>
</ol>
<h3 id="related-documentation" class="position-relative d-flex align-items-center group">
<span>Related Documentation</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-documentation"
aria-haspopup="dialog"
aria-label="Share link: Related Documentation">
<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><strong><a
href="/docs/performance/query-optimization/"
>Query Optimization</a>
</strong> - Optimize queries</li>
<li><strong><a
href="/docs/performance/"
>Performance Tuning</a>
</strong> - System tuning</li>
<li><strong><a
href="/docs/operations/monitoring/"
>Monitoring</a>
</strong> - Production monitoring</li>
<li><strong><a
href="/docs/deployment/deployment-patterns/"
>Hardware Recommendations</a>
</strong> - Hardware sizing</li>
</ul>
Benchmarking
Comprehensive benchmarking guide for Geode including methodology, tools, workload types, and performance analysis