Tuning Guide

Optimize Surgewave for your workload.

Quick Wins

Producer Throughput

{
  "Surgewave": {
    "ProducerBatchSizeBytes": 65536,
    "ProducerLingerMs": 50,
    "ProducerMaxBatchMessages": 50000
  }
}

Low Latency

{
  "Surgewave": {
    "ProducerBatchSizeBytes": 1,
    "ProducerLingerMs": 0
  }
}

High Throughput Pipeline

{
  "Surgewave": {
    "UseChannelPipeline": true,
    "ChannelWriteWorkers": 8,
    "ChannelWriteBufferSize": 50000,
    "ChannelWriteBatchSize": 500,
    "ChannelWriteBatchDelayMs": 5
  }
}

Storage Tuning

Memory (Fastest)

{
  "Surgewave": {
    "StorageMode": "Memory"
  }
}

ZeroCopy WAL (Fast + Persistent)

{
  "Surgewave": {
    "StorageMode": "ZeroCopyWal"
  }
}

Segment Size

Large segments = fewer files, slower recovery:

{
  "Surgewave": {
    "LogSegmentBytes": 1073741824
  }
}

Network Tuning

Socket Buffers

{
  "Surgewave": {
    "SocketSendBufferBytes": 1048576,
    "SocketReceiveBufferBytes": 1048576
  }
}

Max Request Size

{
  "Surgewave": {
    "MaxRequestSize": 104857600
  }
}

Compression

Producer Side

await using var client = new SurgewaveNativeClient("localhost", 9092);
await client.ConnectAsync();
client.CompressionEnabled = true;  // Enable compression for large payloads

Broker Side

{
  "Surgewave": {
    "NativeProtocolCompressionEnabled": true
  }
}

SIMD Optimization

Enable SIMD for large batches:

{
  "Surgewave": {
    "SimdBatchThreshold": 1000
  }
}

Shared Memory

For co-located services:

{
  "Surgewave": {
    "SharedMemory": {
      "Enabled": true,
      "PollingStrategy": "BusySpin",
      "RingBufferCapacity": 33554432
    }
  }
}

Client Tuning

Producer

var producer = new SurgewaveProducer<string, string>(options =>
{
    options.BatchSizeBytes = 64 * 1024;
    options.LingerMs = 50;
    options.CompressionCodec = CompressionCodec.Lz4;
    options.Acks = Acks.One;  // or All for durability
});

Consumer

var consumer = new SurgewaveConsumer<string, string>(options =>
{
    options.MaxPollRecords = 1000;
    options.FetchMinBytes = 1024 * 1024;
    options.FetchMaxWaitMs = 500;
});

GC Tuning

Reduce GC pauses:

export DOTNET_GCHeapHardLimit=8G
export DOTNET_GCConserveMemory=5

Monitoring Performance

# Check throughput
surgewave benchmark -n 100000 -s 1024

# Check broker stats
surgewave broker info -f json | jq '.throughput'

Common Bottlenecks

Symptom Cause Solution
High P99 latency GC pauses Increase heap, reduce allocs
Low throughput Small batches Increase batch size, linger
Disk I/O Slow storage Use SSD, ZeroCopyWal
CPU bound Compression Use LZ4, reduce level
Memory pressure Large buffers Reduce buffer sizes

Profiles

Realtime

{
  "Surgewave": {
    "StorageMode": "Memory",
    "ProducerBatchSizeBytes": 1,
    "ProducerLingerMs": 0,
    "SharedMemory": { "Enabled": true }
  }
}

High Throughput

{
  "Surgewave": {
    "StorageMode": "ZeroCopyWal",
    "UseChannelPipeline": true,
    "ChannelWriteWorkers": 8,
    "ProducerBatchSizeBytes": 65536,
    "ProducerLingerMs": 50
  }
}

Balanced

{
  "Surgewave": {
    "StorageMode": "File",
    "ProducerBatchSizeBytes": 16384,
    "ProducerLingerMs": 5
  }
}

Next Steps