Skip to content

gchape/opusdb

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

69 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OpusDB

A lightweight, in-memory database written in Clojure for functional data.

svgviewer-output (1)

Table of Contents


Benchmarks

OpusDB provides comprehensive performance benchmarks demonstrating STM capabilities under various workload patterns.

Bank Transfer Benchmarks

Real-world financial transaction simulation testing atomicity and consistency under concurrent load.

Test Configuration

The bank consists of 10 accounts, each initialized with 1000 units. Transfers are atomic transactions that read balances, verify funds, update both accounts, and increment a counter. The STM guarantees all-or-nothing execution, preventing partial transfers or lost updates.

Bank Transfer Test Scenarios

Throughput measurement (5 second stress test) - Twenty threads execute concurrent transfers for 5 seconds. Verifies total remains exactly 10,000 units.

Single transaction latency - Baseline cost of a single transfer using Criterium's statistical sampling.

Low-contention concurrent transfers - Rotating through different account pairs (minimal conflicts).

Medium-contention scenario - All transfers constrained to accounts 0-4 (moderate resource contention).

High-contention scenario - All transactions between accounts 0 and 1 (maximum read-write conflicts).

Extreme-contention with futures - Twenty futures simultaneously transferring from account 0 to 1.

Bank Transfer Results


```plain
=== BANK TRANSFERS ===
Total (should be 10000): 10000
Successful transfers: 1052939

Benchmarking single transfer transaction:
Evaluation count : 651438 in 6 samples of 108573 calls.
             Execution time mean : 1.168636 µs
    Execution time std-deviation : 401.059556 ns
   Execution time lower quantile : 902.337782 ns ( 2.5%)
   Execution time upper quantile : 1.830800 µs (97.5%)
                   Overhead used : 2.312308 ns

Found 1 outliers in 6 samples (16.6667 %)
 low-severe 1 (16.6667 %)
 Variance from outliers : 81.7978 % Variance is severely inflated by outliers

Benchmarking low-contention concurrent transfers:
(Rotating through different account pairs)
Evaluation count : 154230 in 6 samples of 25705 calls.
             Execution time mean : 4.928010 µs
    Execution time std-deviation : 1.469124 µs
   Execution time lower quantile : 3.865710 µs ( 2.5%)
   Execution time upper quantile : 6.835823 µs (97.5%)
                   Overhead used : 2.312308 ns

Benchmarking medium-contention scenario:
(All transfers touching accounts 0-4)
Evaluation count : 155196 in 6 samples of 25866 calls.
             Execution time mean : 4.945244 µs
    Execution time std-deviation : 1.488119 µs
   Execution time lower quantile : 3.867622 µs ( 2.5%)
   Execution time upper quantile : 6.811089 µs (97.5%)
                   Overhead used : 2.312308 ns

Benchmarking high-contention scenario:
(All transfers between accounts 0 and 1)
Evaluation count : 654108 in 6 samples of 109018 calls.
             Execution time mean : 1.178936 µs
    Execution time std-deviation : 383.972456 ns
   Execution time lower quantile : 924.558706 ns ( 2.5%)
   Execution time upper quantile : 1.826478 µs (97.5%)
                   Overhead used : 2.312308 ns

Found 1 outliers in 6 samples (16.6667 %)
 low-severe 1 (16.6667 %)
 Variance from outliers : 81.6285 % Variance is severely inflated by outliers

Benchmarking extreme-contention with futures:
(20 threads all transferring from/to same 2 accounts)
Evaluation count : 12756 in 6 samples of 2126 calls.
             Execution time mean : 50.985778 µs
    Execution time std-deviation : 6.275684 µs
   Execution time lower quantile : 45.933750 µs ( 2.5%)
   Execution time upper quantile : 58.783145 µs (97.5%)
                   Overhead used : 2.312308 ns

Key Results:

  • Single transactions: ~1.17 µs
  • 1,052k successful transfers in 5 seconds (210k transfers/sec, 20 concurrent threads)
  • 82% throughput improvement over previous implementation (1,052k vs 578k)
  • High-contention matches single-threaded ba## Throughput Results# seline (~1.18 µs)
  • Low/medium-contention: consistent ~4.9 µs latency
  • Extreme-contention: bounded overhead at ~51 µs
  • Zero data inconsistencies (total balance = 10,000)

Throughput Benchmarks

Comprehensive STM performance testing across various workload patterns.

Throughput Test Scenarios

1. Simple Increments - Single-threaded baseline with no concurrency.

2. High Contention - Multiple threads competing for a single shared ref.

3. Low Contention - Each thread operates on isolated refs with no overlap.

4. Read-Heavy Mix (10% writes) - Simulates read-dominated workloads.

5. Balanced Mix (50% writes) - Equal distribution of read and write operations.

6. Write-Heavy Mix (90% writes) - Write-dominated workload with frequent conflicts.

7. Bank Transfer - Real-world financial transactions with abort conditions.

8. Criterium Statistical Benchmarks - Precise latency measurements using statistical sampling.

Throughput Results

=== Throughput Benchmarks ===

1. Simple Increments (single-threaded, 10 refs):
{:txns 10000, :refs 10, :elapsed-ms 211.40, :txns-per-sec 47304, :correct? true}

2. High Contention (multiple threads, single ref):
  4 threads:
    {:threads 4, :total-txns 40000, :elapsed-ms 202.19, :txns-per-sec 197831, 
     :final-value 40000, :expected 40000, :correct? true}
  8 threads:
    {:threads 8, :total-txns 80000, :elapsed-ms 509.06, :txns-per-sec 157153, 
     :final-value 80000, :expected 80000, :correct? true}
  16 threads:
    {:threads 16, :total-txns 160000, :elapsed-ms 918.41, :txns-per-sec 174214, 
     :final-value 160000, :expected 160000, :correct? true}

3. Low Contention (isolated refs per thread):
  4 threads:
    {:threads 4, :total-txns 40000, :elapsed-ms 59.20, :txns-per-sec 675670, 
     :contention low, :correct? true}
  8 threads:
    {:threads 8, :total-txns 80000, :elapsed-ms 125.77, :txns-per-sec 636072, 
     :contention low, :correct? true}
  16 threads:
    {:threads 16, :total-txns 160000, :elapsed-ms 308.06, :txns-per-sec 519379, 
     :contention low, :correct? true}

4. Read-Heavy Mix (10% writes, 10 refs):
  4 threads:
    {:threads 4, :total-ops 20000, :writes 1931, :reads 18069, :write-ratio 10.0%, 
     :ops-per-sec 377054, :elapsed-ms 53.04, :final-sum 1931, :correct? true}
  8 threads:
    {:threads 8, :total-ops 40000, :writes 3920, :reads 36080, :write-ratio 10.0%, 
     :ops-per-sec 353170, :elapsed-ms 113.26, :final-sum 3920, :correct? true}

5. Balanced Mix (50% writes, 10 refs):
  4 threads:
    {:threads 4, :total-ops 20000, :writes 10074, :reads 9926, :write-ratio 50.0%, 
     :ops-per-sec 184641, :elapsed-ms 108.32, :final-sum 10074, :correct? true}
  8 threads:
    {:threads 8, :total-ops 40000, :writes 19893, :reads 20107, :write-ratio 50.0%, 
     :ops-per-sec 218305, :elapsed-ms 183.23, :final-sum 19893, :correct? true}

6. Write-Heavy Mix (90% writes, 10 refs):
  4 threads:
    {:threads 4, :total-ops 20000, :writes 17972, :reads 2028, :write-ratio 90.0%, 
     :ops-per-sec 205549, :elapsed-ms 97.30, :final-sum 17972, :correct? true}
  8 threads:
    {:threads 8, :total-ops 40000, :writes 36099, :reads 3901, :write-ratio 90.0%, 
     :ops-per-sec 222323, :elapsed-ms 179.92, :final-sum 36099, :correct? true}

7. Bank Transfer (realistic workload, 20 accounts):
  4 threads:
    {:threads 4, :attempted-txns 20000, :successful-txns 18307, :txns-per-sec 74741, 
     :total-balance 20000, :correct? true}
  8 threads:
    {:threads 8, :attempted-txns 40000, :successful-txns 36449, :txns-per-sec 109323, 
     :total-balance 20000, :correct? true}
  16 threads:
    {:threads 16, :attempted-txns 80000, :successful-txns 72415, :txns-per-sec 97956, 
     :total-balance 20000, :correct? true}

=== Criterium Statistical Benchmarks ===

Single-threaded increment:
             Execution time mean : 1.739742 µs
    Execution time std-deviation : 49.187265 ns

Single ref-set:
             Execution time mean : 1.206923 µs
    Execution time std-deviation : 96.674935 ns

Read-only transaction (5 refs):
             Execution time mean : 1.719429 µs
    Execution time std-deviation : 155.120445 ns

Read-only transaction (10 refs):
             Execution time mean : 2.567871 µs
    Execution time std-deviation : 172.912044 ns

Write transaction (5 refs):
             Execution time mean : 4.816849 µs
    Execution time std-deviation : 475.326904 ns

Performance Summary

Latency:

  • Single ref-set: 1.21 µs
  • Single increment: 1.74 µs
  • 5-ref read: 1.72 µs
  • 10-ref read: 2.57 µs
  • 5-ref write: 4.82 µs

Scalability:

  • Low contention: 519k-676k TPS
  • High contention: 157k-198k TPS
  • Bank transfers: 75k-109k TPS

Consistency: 100% correctness across all scenarios, zero lost updates or inconsistent states

Key Improvements: 82% throughput increase in bank transfers (1,052k vs 578k), maintained sub-microsecond latency, consistent behavior across all contention levels

License

Copyright © 2025 OpusDB Contributors

This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which is available at http://www.eclipse.org/legal/epl-2.0.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published