<!-- 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">&#34;Query Latency&#34;</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">&#34;p99_latency_ms&#34;</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">&#34;&lt;100ms&#34;</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">&#34;Read Throughput&#34;</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">&#34;queries_per_second&#34;</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">&#34;&gt;10000&#34;</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">&#34;Write Throughput&#34;</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">&#34;writes_per_second&#34;</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">&#34;&gt;5000&#34;</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">&#34;Mixed Workload&#34;</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">&#34;operations_per_second&#34;</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">&#34;&gt;8000&#34;</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">&#34;50% read, 50% write&#34;</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">&#39;0.0.0.0:3141&#39;</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">&#39;32GB&#39;</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">&#39;2GB&#39;</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 &gt; <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 &gt; /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">&#34;&#34;&#34;Benchmark read queries&#34;&#34;&#34;</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">&#34;MATCH (p:Person) RETURN p LIMIT 10&#34;</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">&gt;=</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">&#39;count&#39;</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">&#39;errors&#39;</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">&#39;latencies&#39;</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">&#39;p50&#39;</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">&#39;p95&#39;</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">&#39;p99&#39;</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">&#39;mean&#39;</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">&#39;qps&#39;</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">&#34;localhost:3141&#34;</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">&#34;Warming up...&#34;</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">&#34;Running benchmark...&#34;</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">&#34;&#34;&#34; </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">&#39;count&#39;</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">&#39;errors&#39;</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">&#39;qps&#39;</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">&#39;mean&#39;</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">&#39;p50&#39;</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">&#39;p95&#39;</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">&#39;p99&#39;</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">&#34;&#34;&#34;</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">&#34;__main__&#34;</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">&#34;context&#34;</span> </span></span><span class="line"><span class="cl"> <span class="s">&#34;sync&#34;</span> </span></span><span class="line"><span class="cl"> <span class="s">&#34;testing&#34;</span> </span></span><span class="line"><span class="cl"> <span class="s">&#34;time&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="s">&#34;go.codepros.org/geode&#34;</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">&#34;localhost:3141&#34;</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">&#34;MATCH (p:Person) RETURN p LIMIT 10&#34;</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">&#34;localhost:3141&#34;</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">&lt;</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">&#34;CREATE (p:Person {id: $id, name: &#39;Test&#39;})&#34;</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">&#34;id&#34;</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">&amp;&amp;</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">&#34;Content-Type: application/json&#34;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> -d <span class="s1">&#39;{&#34;query&#34;: &#34;MATCH (n) RETURN n LIMIT 10&#34;}&#39;</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>-&gt;<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 &gt; <span class="nv">$min</span> AND p.age &lt; <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>-&gt;<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>-&gt;<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>-&gt;<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>-&gt;<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>-&gt;<span class="o">(</span>b:Person<span class="o">)</span>-<span class="o">[</span>:KNOWS<span class="o">]</span>-&gt;<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">&#34;&#34;&#34;Generate person nodes&#34;&#34;&#34;</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">&#34;id&#34;</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">&#34;name&#34;</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">&#34;email&#34;</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">&#34;age&#34;</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">&#34;city&#34;</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">&#34;created_at&#34;</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">&#34;&#34;&#34;Generate KNOWS relationships&#34;&#34;&#34;</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">&#34;source&#34;</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">&#34;target&#34;</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">&#34;since&#34;</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">&#39;persons.jsonl&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</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">&#39;</span><span class="se">\n</span><span class="s1">&#39;</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">&#39;knows.jsonl&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</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">&#39;</span><span class="se">\n</span><span class="s1">&#39;</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">&#34;results/</span><span class="k">$(</span>date +%Y%m%d-%H%M%S<span class="k">)</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl">mkdir -p <span class="s2">&#34;</span><span class="nv">$RESULTS_DIR</span><span class="s2">&#34;</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">&#34;1 4 8 16 32 64&#34;</span> </span></span><span class="line"><span class="cl"><span class="nv">WORKLOADS</span><span class="o">=</span><span class="s2">&#34;read-heavy write-heavy mixed&#34;</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">&#34;Collecting system info...&#34;</span> </span></span><span class="line"><span class="cl">uname -a &gt; <span class="s2">&#34;</span><span class="nv">$RESULTS_DIR</span><span class="s2">/system-info.txt&#34;</span> </span></span><span class="line"><span class="cl">lscpu &gt;&gt; <span class="s2">&#34;</span><span class="nv">$RESULTS_DIR</span><span class="s2">/system-info.txt&#34;</span> </span></span><span class="line"><span class="cl">free -h &gt;&gt; <span class="s2">&#34;</span><span class="nv">$RESULTS_DIR</span><span class="s2">/system-info.txt&#34;</span> </span></span><span class="line"><span class="cl">geode --version &gt;&gt; <span class="s2">&#34;</span><span class="nv">$RESULTS_DIR</span><span class="s2">/system-info.txt&#34;</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">&#34;Warming up...&#34;</span> </span></span><span class="line"><span class="cl">geode benchmark --duration 60s --threads <span class="m">16</span> &gt; /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">&#34;Running: workload=</span><span class="nv">$workload</span><span class="s2"> threads=</span><span class="nv">$threads</span><span class="s2">&#34;</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">&#34;</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&#34;</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> &gt; <span class="s2">&#34;</span><span class="nv">$OUTPUT_FILE</span><span class="s2">&#34;</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">&#34;Generating summary...&#34;</span> </span></span><span class="line"><span class="cl">python3 summarize_results.py <span class="s2">&#34;</span><span class="nv">$RESULTS_DIR</span><span class="s2">&#34;</span> &gt; <span class="s2">&#34;</span><span class="nv">$RESULTS_DIR</span><span class="s2">/summary.md&#34;</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">&#34;Results saved to </span><span class="nv">$RESULTS_DIR</span><span class="s2">&#34;</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">&#39;0 0 * * 0&#39;</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 &amp;</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 &gt;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">&#34;&#34;&#34;Load benchmark results&#34;&#34;&#34;</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">&#34;*.json&#34;</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">&#39;file&#39;</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">&#34;&#34;&#34;Analyze throughput scaling&#34;&#34;&#34;</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">&#39;workload&#39;</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">&#39;workload&#39;</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">&#39;threads&#39;</span><span class="p">],</span> <span class="n">subset</span><span class="p">[</span><span class="s1">&#39;throughput&#39;</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">&#39;o&#39;</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">&#39;Threads&#39;</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">&#39;Throughput (ops/sec)&#39;</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">&#39;Throughput vs Concurrency&#39;</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">&#39;throughput_scaling.png&#39;</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">&#34;&#34;&#34;Analyze latency distribution&#34;&#34;&#34;</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">&#39;p50&#39;</span><span class="p">,</span> <span class="s1">&#39;p95&#39;</span><span class="p">,</span> <span class="s1">&#39;p99&#39;</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">&#39;workload&#39;</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">&#39;workload&#39;</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">&#39;threads&#39;</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">&#39;o&#39;</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">&#39;Threads&#39;</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">&#39;</span><span class="si">{</span><span class="n">percentile</span><span class="si">}</span><span class="s1"> Latency (ms)&#39;</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">&#39;</span><span class="si">{</span><span class="n">percentile</span><span class="si">}</span><span class="s1"> Latency vs Concurrency&#39;</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">&#39;latency_analysis.png&#39;</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">&#34;&#34;&#34;Generate markdown report&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="n">report</span> <span class="o">=</span> <span class="s2">&#34;&#34;&#34;# 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">&#34;&#34;&#34;</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">&#39;throughput&#39;</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">&#39;p99&#39;</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">&#39;throughput&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">idxmax</span><span class="p">(),</span> <span class="s1">&#39;threads&#39;</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">&#34;__main__&#34;</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>