For the complete documentation index, see llms.txt. This page is also available as Markdown.

Persistence Module

The Persistence module benchmarks Rumi's persistence mechanisms for messages and data.

Overview

Rumi provides multiple persistence mechanisms:

  • Message Logger: Persists individual messages

  • Packet Logger: Persists message packets

  • Store Logger: Persists transactional state changes

This benchmark measures the throughput and latency of each persistence mechanism.

Test Programs

MessageLogger

Class: com.neeve.perf.persist.MessageLogger

Benchmarks single-message persistence performance.

PacketLogger

Class: com.neeve.perf.persist.PacketLogger

Benchmarks message packet persistence performance.

StoreLogger

Class: com.neeve.perf.persist.StoreLogger

Benchmarks transactional state persistence performance.

Command-Line Parameters

Common Parameters (All Loggers)

Short
Long
Default
Description

-c

--count

varies

Number of messages/packets to persist

-t

--warmupTime

2

Warmup time in seconds

-r

--rate

-1

Persist rate (-1 = unlimited)

-i

--initialLogLength

1

Preallocated log length (GB)

-z

--zeroOutInitial

false

Zero out preallocated length

-a

--writeBufferSize

8192

Write buffer size (bytes)

-b

--readBufferSize

8192

Read buffer size (bytes)

-f

--flushOnCommit

false

Flush on every commit

-y

--syncOnCommit

false

Sync on every commit (MessageLogger, StoreLogger)

-d

--detached

false

Enable detached writes

-q

--queueDepth

1024

Queue depth for detached writes

-j

--affinity

null

CPU affinity mask

-a

--noLatencyWrites

false

Don't write latencies to file

-b

--printIntervalStats

false

Print interval stats

-h

--help

false

Print help

MessageLogger-Specific

Short
Long
Default
Description

-k

--logLocation

.

Log directory

-m

--logMode

rw

Log open mode (rw, rws, rwd)

-n

--numPerCommit

1

Number of writes per commit

PacketLogger-Specific

Short
Long
Default
Description

-l

--logLocation

.

Log directory

-v

--populateStorePacketMetadata

false

Populate ODS packet metadata

-e

--readUsingMappedMemory

true

Use memory-mapped reads

-t

--tail

false

Concurrent read/write mode

StoreLogger-Specific

Short
Long
Default
Description

-o

--logMode

rw

Log open mode (rw, rws, rwd)

-n

--numPerCommit

1

Number of writes per commit

-k

--lazyDeserialize

true

Skip getObject() on read

Running Benchmarks

Message Logger Test

Packet Logger Test

Store Logger Test

Key Parameters

flushOnCommit / syncOnCommit

Controls durability vs performance tradeoff:

false (default):

  • Higher throughput

  • Lower latency

  • Data buffered in OS cache

  • Risk of data loss on system crash

true:

  • Guaranteed durability

  • Lower throughput

  • Higher latency

  • Data flushed/synced to physical media

writeBufferSize

Size of write buffer (default: 8192 bytes):

Interpreting Results

Typical Results (Linux x86-64, NVME SSD)

Operation
flushOnWrite=false
flushOnWrite=true

Message Write

~5-10µs

~100-200µs

Packet Write

~2-5µs

~80-150µs

Store Write

~3-8µs

~90-180µs

Performance Characteristics

  1. Buffered Writes (flushOnWrite=false):

    • High throughput (100K-200K writes/sec)

    • Low latency (few microseconds)

    • Suitable when durability can be relaxed

  2. Synchronous Writes (flushOnWrite=true):

    • Lower throughput (5K-10K writes/sec)

    • Higher latency (hundreds of microseconds)

    • Guaranteed durability

    • Required for critical data

  3. Storage Media Impact:

    • NVME SSD: ~100µs sync write latency

    • SATA SSD: ~200-500µs sync write latency

    • HDD: ~5-10ms sync write latency

Comparison with AEP Module

The AEP Module uses asynchronous persistence:

  • Persistence Module: Measures pure persistence overhead

  • AEP Module: Persistence runs concurrently with replication

  • AEP Impact: Persistence overlaps with network latency

In AEP benchmark, persistence adds minimal latency due to pipelining

Best Practices

For High Throughput

  1. Use buffered writes (flushOnWrite=false)

  2. Increase write buffer size

  3. Use NVME storage

  4. Consider packet-based logging for batch operations

For Guaranteed Durability

  1. Enable flushOnWrite=true

  2. Use NVME or high-performance SSD

  3. Consider battery-backed write cache

  4. Accept throughput/latency tradeoff

Next Steps

Last updated