|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>Performance Regression Report — i8g Tablets (Official Releases)</title> |
|
<script src="https://cdn.jsdelivr.net/npm/chart.js@4"></script> |
|
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2"></script> |
|
<style> |
|
:root { --bg: #1a1a2e; --surface: #16213e; --text: #e0e0e0; --muted: #999; } |
|
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--text); margin: 0; padding: 2rem; line-height: 1.6; } |
|
h1 { color: #fff; margin-bottom: 0.25rem; } |
|
h2 { color: #90caf9; border-bottom: 1px solid #333; padding-bottom: 0.5rem; margin-top: 3rem; } |
|
h3 { color: #ce93d8; } |
|
.meta { color: var(--muted); margin-bottom: 2rem; } |
|
table { border-collapse: collapse; width: 100%; margin: 1rem 0 2rem; } |
|
th, td { border: 1px solid #333; padding: 0.5rem 0.75rem; text-align: right; } |
|
th { background: var(--surface); color: #90caf9; } |
|
td:first-child, th:first-child { text-align: left; } |
|
.best { color: #4caf50; font-weight: bold; } |
|
.chart-container { background: var(--surface); border-radius: 8px; padding: 1rem; margin: 1.5rem 0; max-width: 900px; } |
|
canvas { max-height: 400px; } |
|
#toc { background: var(--surface); border-radius: 8px; padding: 1rem 1.5rem; margin: 1.5rem 0; display: inline-block; } |
|
#toc a { color: #90caf9; text-decoration: none; } |
|
#toc a:hover { text-decoration: underline; } |
|
#toc ul { list-style: none; padding-left: 0; margin: 0.5rem 0; } |
|
#toc li { margin: 0.4rem 0; } |
|
.legend { display: flex; gap: 1.5rem; flex-wrap: wrap; margin: 0.5rem 0 1rem; } |
|
.legend-item { display: flex; align-items: center; gap: 0.4rem; font-size: 0.9rem; } |
|
.legend-swatch { width: 14px; height: 14px; border-radius: 3px; } |
|
.observations { background: var(--surface); border-radius: 8px; padding: 1.5rem; margin-top: 2rem; } |
|
.observations li { margin: 0.5rem 0; } |
|
</style> |
|
</head> |
|
<body> |
|
|
|
<h1>Performance Regression Report — i8g Tablets</h1> |
|
<p class="meta"> |
|
<strong>Test:</strong> scylla-enterprise-perf-regression-predefined-throughput-steps-i8g-tablets<br> |
|
<strong>Period:</strong> February 12 – May 12, 2026 (3 months)<br> |
|
<strong>Runs analyzed:</strong> 16 official release runs |
|
</p> |
|
|
|
<table> |
|
<tr><th>Version</th><th>Date</th><th>Passed</th><th>Failed</th><th>Test Error</th></tr> |
|
<tr><td>2026.1.1</td><td>2026-04-05</td><td>3</td><td>1</td><td>0</td></tr> |
|
<tr><td>2025.4.6</td><td>2026-04-10</td><td>2</td><td>2</td><td>0</td></tr> |
|
<tr><td>2025.4.7</td><td>2026-04-17</td><td>1</td><td>2</td><td>1</td></tr> |
|
<tr><td>2026.1.2</td><td>2026-05-04</td><td>0</td><td>4</td><td>0</td></tr> |
|
</table> |
|
|
|
<nav id="toc"> |
|
<strong>Table of Contents</strong> |
|
<ul> |
|
<li><a href="#read-disk-only">Read (Disk-Only)</a></li> |
|
<li><a href="#read-cache">Read (Cache)</a></li> |
|
<li><a href="#write">Write</a></li> |
|
<li><a href="#mixed">Mixed 50/50 R/W</a></li> |
|
<li><a href="#observations">Key Observations</a></li> |
|
</ul> |
|
</nav> |
|
|
|
<!-- ============ Read (Disk-Only) ============ --> |
|
<h2 id="read-disk-only">Read (Disk-Only)</h2> |
|
|
|
<table> |
|
<tr><th>Step</th><th>Samples</th><th>P90 Read (ms)</th><th>P99 Read (ms)</th><th>Throughput (op/s)</th><th>Best Release</th></tr> |
|
<tr><td>110K</td><td>4</td><td>1.06</td><td>1.69</td><td>109,963</td><td class="best">2025.4.7 (1.65 ms)</td></tr> |
|
<tr><td>220K</td><td>4</td><td>1.30</td><td>2.21</td><td>219,928</td><td class="best">2026.1.1 (1.99 ms)</td></tr> |
|
<tr><td>330K</td><td>4</td><td>1.62</td><td>5.63</td><td>329,829</td><td class="best">2026.1.1 (2.55 ms)</td></tr> |
|
<tr><td>400K</td><td>4</td><td>2.14</td><td>296.70</td><td>399,854</td><td class="best">2026.1.1 (4.93 ms)</td></tr> |
|
<tr><td>unthrottled</td><td>4</td><td>3.80</td><td>49.33</td><td>523,409</td><td class="best">2026.1.1 (40.14 ms)</td></tr> |
|
</table> |
|
|
|
<h3>P99 Read Latency by Step</h3> |
|
<div class="chart-container"><canvas id="chart-read-disk-p99"></canvas></div> |
|
|
|
<h3>Unthrottled Throughput</h3> |
|
<div class="chart-container"><canvas id="chart-read-disk-thr"></canvas></div> |
|
|
|
<!-- ============ Read (Cache) ============ --> |
|
<h2 id="read-cache">Read (Cache)</h2> |
|
|
|
<table> |
|
<tr><th>Step</th><th>Samples</th><th>P90 Read (ms)</th><th>P99 Read (ms)</th><th>Throughput (op/s)</th><th>Best Release</th></tr> |
|
<tr><td>500K</td><td>4</td><td>0.40</td><td>0.70</td><td>499,794</td><td class="best">2026.1.1 (0.56 ms)</td></tr> |
|
<tr><td>900K</td><td>4</td><td>0.62</td><td>21.35</td><td>899,594</td><td class="best">2026.1.2 (2.58 ms)</td></tr> |
|
<tr><td>1200K</td><td>4</td><td>0.89</td><td>216.04</td><td>1,199,538</td><td class="best">2026.1.2 (4.29 ms)</td></tr> |
|
<tr><td>1500K</td><td>4</td><td>1.44</td><td>11.14</td><td>1,499,691</td><td class="best">2025.4.6 (6.50 ms)</td></tr> |
|
<tr><td>unthrottled</td><td>4</td><td>1.53</td><td>13.40</td><td>1,617,045</td><td class="best">2026.1.1 (2.68 ms)</td></tr> |
|
</table> |
|
|
|
<h3>P99 Read Latency by Step</h3> |
|
<div class="chart-container"><canvas id="chart-read-cache-p99"></canvas></div> |
|
|
|
<h3>Unthrottled Throughput</h3> |
|
<div class="chart-container"><canvas id="chart-read-cache-thr"></canvas></div> |
|
|
|
<!-- ============ Write ============ --> |
|
<h2 id="write">Write</h2> |
|
|
|
<table> |
|
<tr><th>Step</th><th>Samples</th><th>P90 Write (ms)</th><th>P99 Write (ms)</th><th>Throughput (op/s)</th><th>Best Release</th></tr> |
|
<tr><td>350K</td><td>4</td><td>1.63</td><td>2.27</td><td>349,761</td><td class="best">2025.4.6 (2.15 ms)</td></tr> |
|
<tr><td>600K</td><td>4</td><td>17097.55</td><td>22450.35</td><td>595,657</td><td class="best">2025.4.6 (3.02 ms)</td></tr> |
|
<tr><td>unthrottled</td><td>4</td><td>2.79</td><td>12.77</td><td>706,547</td><td class="best">2025.4.6 (6.34 ms)</td></tr> |
|
</table> |
|
|
|
<h3>P99 Write Latency by Step</h3> |
|
<div class="chart-container"><canvas id="chart-write-p99"></canvas></div> |
|
|
|
<h3>Unthrottled Throughput</h3> |
|
<div class="chart-container"><canvas id="chart-write-thr"></canvas></div> |
|
|
|
<!-- ============ Mixed ============ --> |
|
<h2 id="mixed">Mixed 50/50 R/W</h2> |
|
|
|
<table> |
|
<tr><th>Step</th><th>Samples</th><th>P90 W (ms)</th><th>P90 R (ms)</th><th>P99 W (ms)</th><th>P99 R (ms)</th><th>Thr W (op/s)</th><th>Thr R (op/s)</th><th>Best Release</th></tr> |
|
<tr><td>250K</td><td>3</td><td>0.40</td><td>1.00</td><td>2.13</td><td>2.38</td><td>124,914</td><td>124,903</td><td class="best">2025.4.6 (2.14 ms)</td></tr> |
|
<tr><td>480K</td><td>3</td><td>1.81</td><td>1.96</td><td>4.68</td><td>5.18</td><td>239,908</td><td>239,928</td><td class="best">2026.1.2 (3.67 ms)</td></tr> |
|
<tr><td>600K</td><td>3</td><td>1.99</td><td>2.26</td><td>6991.25</td><td>6977.41</td><td>299,832</td><td>299,846</td><td class="best">2026.1.2 (6.85 ms)</td></tr> |
|
<tr><td>750K</td><td>3</td><td>1426.16</td><td>1428.62</td><td>19374.89</td><td>19374.89</td><td>374,816</td><td>374,799</td><td class="best">2026.1.2 (11282.68 ms)</td></tr> |
|
<tr><td>unthrottled</td><td>3</td><td>3.68</td><td>27.60</td><td>10.35</td><td>186.60</td><td>470,417</td><td>470,372</td><td class="best">2026.1.2 (170.26 ms)</td></tr> |
|
</table> |
|
|
|
<h3>P99 Read Latency by Step</h3> |
|
<div class="chart-container"><canvas id="chart-mixed-p99"></canvas></div> |
|
|
|
<h3>Unthrottled Throughput</h3> |
|
<div class="chart-container"><canvas id="chart-mixed-thr"></canvas></div> |
|
|
|
<!-- ============ Key Observations ============ --> |
|
<div class="observations" id="observations"> |
|
<h2 style="margin-top:0; border:none;">Key Observations</h2> |
|
<ol> |
|
<li><strong>2026.1.2</strong> (latest): All 4 runs failed — limited data. Requires investigation.</li> |
|
<li><strong>2025.4.7</strong>: Only 1 of 4 runs passed. Limited data available.</li> |
|
<li><strong>2025.4.6</strong>: 2 of 4 passed. Stable baseline.</li> |
|
<li><strong>2026.1.1</strong>: 3 of 4 passed. Best coverage across workloads.</li> |
|
<li><strong>Pass rate</strong>: 6/16 (37.5%) — indicates infrastructure or test stability issues beyond code regressions.</li> |
|
</ol> |
|
</div> |
|
|
|
<p style="color: var(--muted); margin-top: 3rem; font-size: 0.85rem;"> |
|
Generated from Argus (argus.scylladb.com) — Test ID: d6ebf1a5-135f-43fc-a7ba-0716b60dfa94 |
|
</p> |
|
|
|
<script> |
|
const COLORS = { |
|
'2026.1.1': { bg: 'rgba(76, 175, 80, 0.8)', border: '#4CAF50' }, |
|
'2025.4.6': { bg: 'rgba(33, 150, 243, 0.8)', border: '#2196F3' }, |
|
'2025.4.7': { bg: 'rgba(255, 152, 0, 0.8)', border: '#FF9800' }, |
|
'2026.1.2': { bg: 'rgba(244, 67, 54, 0.8)', border: '#F44336' }, |
|
}; |
|
|
|
const VERSIONS_4 = ['2026.1.1', '2025.4.6', '2025.4.7', '2026.1.2']; |
|
const VERSIONS_3 = ['2026.1.1', '2025.4.6', '2026.1.2']; // mixed has no 2025.4.7 |
|
|
|
function makeDatasets(versions, dataPerVersion) { |
|
return versions.map(v => ({ |
|
label: v, |
|
data: dataPerVersion[v], |
|
backgroundColor: COLORS[v].bg, |
|
borderColor: COLORS[v].border, |
|
borderWidth: 1, |
|
})); |
|
} |
|
|
|
Chart.register(ChartDataLabels); |
|
|
|
function barChart(id, labels, versions, dataPerVersion, yLabel, useLog) { |
|
const allValues = Object.values(dataPerVersion).flat().filter(v => v != null && v > 0); |
|
const max = Math.max(...allValues); |
|
const min = Math.min(...allValues); |
|
const needsLog = useLog !== false && (max / min > 50); |
|
|
|
new Chart(document.getElementById(id), { |
|
type: 'bar', |
|
data: { labels, datasets: makeDatasets(versions, dataPerVersion) }, |
|
options: { |
|
responsive: true, |
|
plugins: { |
|
legend: { labels: { color: '#e0e0e0' } }, |
|
datalabels: { |
|
anchor: 'end', |
|
align: 'end', |
|
color: '#e0e0e0', |
|
font: { size: 10 }, |
|
formatter: (v) => { |
|
if (v == null) return ''; |
|
if (v >= 1000000) return (v / 1000000).toFixed(1) + 'M'; |
|
if (v >= 1000) return (v / 1000).toFixed(1) + 'K'; |
|
if (v >= 100) return v.toFixed(0); |
|
if (v >= 10) return v.toFixed(1); |
|
return v.toFixed(2); |
|
}, |
|
}, |
|
}, |
|
scales: { |
|
x: { ticks: { color: '#ccc', maxRotation: 45 }, grid: { color: '#333' } }, |
|
y: { |
|
type: needsLog ? 'logarithmic' : 'linear', |
|
ticks: { color: '#ccc' }, |
|
grid: { color: '#333' }, |
|
title: { display: true, text: yLabel + (needsLog ? ' (log scale)' : ''), color: '#ccc' }, |
|
} |
|
} |
|
} |
|
}); |
|
} |
|
|
|
// --- Read (Disk-Only) --- |
|
barChart('chart-read-disk-p99', ['110K', '220K', '330K', '400K'], VERSIONS_4, { |
|
'2026.1.1': [1.66, 1.99, 2.55, 4.93], |
|
'2025.4.6': [1.70, 2.02, 2.58, 292.29], |
|
'2025.4.7': [1.65, 2.01, 2.59, 92.14], |
|
'2026.1.2': [1.77, 2.80, 14.79, 797.44], |
|
}, 'P99 read (ms)'); |
|
|
|
barChart('chart-read-disk-thr', ['2026.1.1', '2025.4.6', '2025.4.7', '2026.1.2'], VERSIONS_4, { |
|
'2026.1.1': [546380, null, null, null], |
|
'2025.4.6': [null, 515489, null, null], |
|
'2025.4.7': [null, null, 543609, null], |
|
'2026.1.2': [null, null, null, 488160], |
|
}, 'Throughput (op/s)'); |
|
|
|
// --- Read (Cache) --- |
|
barChart('chart-read-cache-p99', ['500K', '900K', '1200K', '1500K'], VERSIONS_4, { |
|
'2026.1.1': [0.56, 8.27, 4.95, 7.40], |
|
'2025.4.6': [0.73, 3.44, 6.61, 6.50], |
|
'2025.4.7': [0.65, 71.11, 848.30, 8.29], |
|
'2026.1.2': [0.87, 2.58, 4.29, 22.36], |
|
}, 'P99 read (ms)'); |
|
|
|
barChart('chart-read-cache-thr', ['2026.1.1', '2025.4.6', '2025.4.7', '2026.1.2'], VERSIONS_4, { |
|
'2026.1.1': [1768372, null, null, null], |
|
'2025.4.6': [null, 1628350, null, null], |
|
'2025.4.7': [null, null, 1561155, null], |
|
'2026.1.2': [null, null, null, 1510305], |
|
}, 'Throughput (op/s)'); |
|
|
|
// --- Write --- |
|
barChart('chart-write-p99', ['350K', '600K'], VERSIONS_4, { |
|
'2026.1.1': [2.23, 3.51], |
|
'2025.4.6': [2.15, 3.02], |
|
'2025.4.7': [2.21, 3.21], |
|
'2026.1.2': [2.51, 89791.66], |
|
}, 'P99 write (ms)'); |
|
|
|
barChart('chart-write-thr', ['2026.1.1', '2025.4.6', '2025.4.7', '2026.1.2'], VERSIONS_4, { |
|
'2026.1.1': [702614, null, null, null], |
|
'2025.4.6': [null, 742218, null, null], |
|
'2025.4.7': [null, null, 720203, null], |
|
'2026.1.2': [null, null, null, 661154], |
|
}, 'Throughput (op/s)'); |
|
|
|
// --- Mixed --- |
|
barChart('chart-mixed-p99', ['250K', '480K', '600K', '750K'], VERSIONS_3, { |
|
'2026.1.1': [2.55, 5.67, 16064.18, 28739.37], |
|
'2025.4.6': [2.14, 6.20, 4861.20, 18102.62], |
|
'2026.1.2': [2.46, 3.67, 6.85, 11282.68], |
|
}, 'P99 read (ms)'); |
|
|
|
barChart('chart-mixed-thr', ['2026.1.1', '2025.4.6', '2026.1.2'], VERSIONS_3, { |
|
'2026.1.1': [422946, null, null], |
|
'2025.4.6': [null, 512838, null], |
|
'2026.1.2': [null, null, 475469], |
|
}, 'Throughput (op/s)'); |
|
</script> |
|
</body> |
|
</html> |