-
Notifications
You must be signed in to change notification settings - Fork 1
Compendium chapter 08 storage layer
Navigation: Home > Pages
Kategorie: πΎ Storage & Performance
Lesezeit: ~45 Minuten
Zielgruppe: Database Engineers, Performance Engineers, Production DBA
- 8.1 RocksDB Storage Architecture
- 8.2 Memory Management mit mimalloc
- 8.3 Huge Pages Optimization
- 8.4 Compression Strategies
- 8.5 Storage Hierarchy Tuning
- 8.6 Production Deployment Patterns
- 8.7 Performance Benchmarks
ThemisDB nutzt RocksDB als zentrale Storage-Engine fΓΌr alle Datenmodelle. Die Architektur basiert auf einem prΓ€zisen Key-PrΓ€fix-Schema, das Multi-Model-Daten logisch separiert und dabei physisch ko-lokalisiert fΓΌr optimale Cache-Locality.
Das PrΓ€fix-Schema ermΓΆglicht effiziente Range-Scans und Prefix-Extraktion:
Entities (Base Entity Blobs): entity:<table>:<pk>
Secondary Index: idx:<table>:<column>:<value>:<pk>
Range Index: ridx:<table>:<column>:<value>:<pk>
Graph Adjacency (Outbound): graph:out:<from_pk>:<edge_id>
Graph Adjacency (Inbound): graph:in:<to_pk>:<edge_id>
Vector Index Metadata: vector:<table>:<pk>
Changefeed Events: changefeed:<sequence>
Time-Series Metrics: ts:<metric>:<timestamp>:<tags>
Design-Rationale:
- Sortierte Speicherung: LSM-Tree garantiert lexikographische Ordnung β Range-Scans ohne Index
- Prefix-Extraktion: RocksDB Prefix-Extractor ermΓΆglicht Bloom-Filter auf Collection-Ebene
- Co-Location: Related Data (z.B. alle Indizes einer Tabelle) wird physisch nah gespeichert
graph TB
subgraph "RocksDB LSM-Tree Architecture"
Write[Write Operations] --> MemTable[MemTable<br/>In-Memory Buffer]
MemTable -->|Flush when full| L0[Level 0<br/>Immutable SSTables<br/>Overlapping Keys]
L0 -->|Compaction| L1[Level 1<br/>Sorted SSTables<br/>10 MB each]
L1 -->|Compaction| L2[Level 2<br/>Sorted SSTables<br/>100 MB each]
L2 -->|Compaction| L3[Level 3<br/>Sorted SSTables<br/>1 GB each]
L3 -->|Compaction| L4[Level 4+<br/>Cold Data<br/>10+ GB]
Read[Read Operations] --> Cache[Block Cache<br/>Hot Data]
Cache -.miss.-> L0
Cache -.miss.-> L1
Cache -.miss.-> L2
Cache -.miss.-> L3
subgraph "Key Prefix Schema"
Entity[entity:table:pk]
Index[idx:table:col:val:pk]
Graph[graph:out:from:edge]
Vector[vector:table:pk]
end
end
style MemTable fill:#43e97b
style L0 fill:#4facfe
style L1 fill:#667eea
style L2 fill:#764ba2
style L3 fill:#f093fb
style Cache fill:#ffd32a
Abb. 08.1: Storage-Engine-Internals
Code-Beispiel: Prefix-Extractor-Konfiguration
#include <rocksdb/slice_transform.h>
// Custom Prefix Extractor fΓΌr ThemisDB Key-Schema
class ThemisKeyPrefixExtractor : public rocksdb::SliceTransform {
public:
const char* Name() const override { return "ThemisKeyPrefixExtractor"; }
rocksdb::Slice Transform(const rocksdb::Slice& src) const override {
// Extrahiere "entity:<table>:" oder "idx:<table>:<column>:"
size_t second_colon = src.ToString().find(':', 0);
if (second_colon == std::string::npos) return src;
size_t third_colon = src.ToString().find(':', second_colon + 1);
if (third_colon == std::string::npos) return src;
return rocksdb::Slice(src.data(), third_colon + 1);
}
bool InDomain(const rocksdb::Slice& src) const override {
return src.size() > 0 && src[0] != '\0';
}
};
// Anwendung in RocksDB Options
rocksdb::Options options;
options.prefix_extractor.reset(new ThemisKeyPrefixExtractor());Performance-Impact: Prefix-Extraktion reduziert Bloom-Filter-False-Positives um ~85% bei Collection-Scans.
Standard-Betrieb: Default Column Family (CF)
ThemisDB verwendet standardmΓ€Γig eine einzige Default CF fΓΌr alle Daten. Dies vereinfacht Transaktionen (atomare Snapshots ΓΌber alle Datenmodelle) und Backups.
Optional: Multi-CF fΓΌr groΓe Workloads
Bei Workloads > 500 GB oder stark unterschiedlichen Hot/Cold-Profilen kann CF-Trennung LSM-Compactions isolieren:
cf_entities: Base Entity Blobs (hΓ€ufig gelesen/geschrieben)
cf_indexes: Secondary Indexes (read-heavy)
cf_graph: Graph Adjazenz-Listen (scan-heavy)
cf_changefeed: CDC Events (append-only, TTL-basiert)
cf_timeseries: Metriken (high-write, TTL)
Trade-offs:
| Aspekt | Single CF | Multi-CF |
|---|---|---|
| Transaktionen | β Einfach (single snapshot) | |
| Compaction | β Isolierte Compaction | |
| Memory | β Shared Block Cache | |
| Backups | β Einfach |
Empfehlung: Starten mit Single CF, bei Scaling-Issues zu Multi-CF migrieren.
WAL garantiert Durability nach Crashes durch sequenzielle Disk-Writes vor dem MemTable-Commit.
Kritische Konfigurationen:
rocksdb::Options options;
// 1. WAL-Sync-Strategie
rocksdb::WriteOptions write_opts;
write_opts.sync = true; // fsync() nach jedem Write (max Durability)
// Alternativ: write_opts.sync = false + options.wal_bytes_per_sync = 1MB
// 2. WAL-GrΓΆΓen-Management
options.max_total_wal_size = 4GB; // Verhindert unbegrenztes WAL-Wachstum
options.wal_bytes_per_sync = 1 * 1024 * 1024; // 1MB Batching fΓΌr fsync()
// 3. WAL-Directory auf separater NVMe
options.wal_dir = "/nvme/fast/wal"; // 45K writes/sec vs 200 writes/sec HDDPerformance-Zahlen:
| Storage | WAL Throughput | Latenz (p99) |
|---|---|---|
| NVMe PCIe 4.0 | 45.000 writes/sec | 1-5ms |
| SATA SSD | 12.000 writes/sec | 5-10ms |
| HDD 7200 RPM | 200 writes/sec | 10-20ms |
Crash Recovery:
- Replay: RocksDB liest WAL sequentiell und rekonstruiert MemTable
- Checkpointing: Alte WAL-Dateien werden nach SSTable-Flush gelΓΆscht
- Validation: MANIFEST-Datei trackt alle gΓΌltigen SSTables
Code-Beispiel: WAL-Replay nach Crash
// Automatisch bei DB-Open
rocksdb::Status s = rocksdb::DB::Open(options, db_path, &db);
if (!s.ok()) {
if (s.IsCorruption()) {
// WAL korrupt β RepairDB versuchen
rocksdb::Status repair = rocksdb::RepairDB(db_path, options);
if (repair.ok()) {
// Retry Open nach Repair
s = rocksdb::DB::Open(options, db_path, &db);
}
}
}RocksDB nutzt Snapshot Isolation fΓΌr Transaktionen. Jeder Snapshot fixiert ein Sichtfenster auf die DB.
Problem: Long-Running Snapshots erhΓΆhen Read Amplification
MemTable β L0 SSTable β L1 SSTable β ... β L6 SSTable
β β β β
| | | |
Snapshot t=0 t=100 t=200 t=500
β Snapshot t=0 verhindert Compaction von L0-L6 fΓΌr 500 Zeiteinheiten
β Read Amplification: Muss alle Levels durchsuchen
Monitoring:
// Prometheus Metrics fΓΌr Snapshot-Tracking
uint64_t oldest_snapshot_time = db->GetSnapshot()->GetSequenceNumber();
uint64_t current_sequence = db->GetLatestSequenceNumber();
uint64_t snapshot_age = current_sequence - oldest_snapshot_time;
if (snapshot_age > 1000000) { // >1M Operationen alt
LOG_WARN("Long-running snapshot detected: age={}", snapshot_age);
}Mitigation:
- Transaktions-Timeouts: Automatisches Rollback nach 60s
-
Snapshot-Cleanup:
cleanupOldTransactions()API - Read-Only Replicas: Analytische Queries auf Replica β kein Impact auf Primary
ThemisDB nutzt mimalloc v2.1.7 als Drop-in-Replacement fΓΌr malloc/free. Microsoft entwickelt mimalloc speziell fΓΌr Multi-Threaded-Workloads mit hoher Allocation-Rate.
Performance-Vorteile:
| Workload | Standard malloc | mimalloc | Speedup |
|---|---|---|---|
| Multi-threaded Inserts | 280K ops/sec | 420K ops/sec | 1.5x |
| Memory Throughput | 8.5 GB/sec | 12.2 GB/sec | 1.43x |
| Fragmentation | 18% | 7% | 2.6x besser |
| Peak Memory | 4.2 GB | 3.8 GB | 10% weniger |
Technische Eigenschaften:
- Thread-Local Heaps: Jeder Thread hat eigenen Heap β keine Contention
- Small Object Optimization: Dedizierte Pools fΓΌr 8B, 16B, 32B, ..., 512B
- Fast Path: Allocation in O(1) ohne Locks fΓΌr hΓ€ufige Sizes
- Delayed Free: Freigabe in Batches β weniger Syscalls
CMakeLists.txt:
# mimalloc Dependency
find_package(mimalloc 2.1 CONFIG REQUIRED)
target_link_libraries(themis_core PRIVATE mimalloc-static)
# Optional: Override global malloc/free
target_compile_definitions(themis_core PRIVATE MI_OVERRIDE)C++ Code:
// Automatische Override durch Include
#include <mimalloc-override.h>
// Ab jetzt nutzen ALLE Allocations mimalloc (auch in RocksDB, HNSW, etc.)
auto vec = std::make_unique<std::vector<int>>(1000000); // Nutzt mimallocKeine Code-Γnderungen erforderlich β Drop-in-Replacement!
mimalloc kann via Environment-Variables konfiguriert werden:
# Production-Setup
export MIMALLOC_VERBOSE=0 # Keine Debug-Logs
export MIMALLOC_SHOW_STATS=0 # Stats deaktivieren
export MIMALLOC_PAGE_RESET=1 # Aggressive Memory Return
export MIMALLOC_EAGER_COMMIT_DELAY=0 # Sofort OS-Pages commiten
export MIMALLOC_RESERVE_HUGE_OS_PAGES=8 # 8Γ 2MB Huge Pages reservieren
./themis_server --config production.jsonEmpfehlungen:
-
Development:
MIMALLOC_SHOW_STATS=1fΓΌr Profiling -
Production:
MIMALLOC_PAGE_RESET=1verhindert Memory-Leaks -
High-Memory Workloads:
MIMALLOC_RESERVE_HUGE_OS_PAGESkombiniert mit Huge Pages (siehe 8.3)
Setup: 1M Entity Inserts mit parallelen Reads
Benchmark: Mixed OLTP Workload (8 Threads)
-------------------------------------------
malloc mimalloc Improvement
Insert Throughput 280K ops/s 420K ops/s +50%
Read Latency (p50) 1.8ms 1.2ms -33%
Memory RSS 4.2 GB 3.8 GB -10%
CPU Usage 65% 58% -11%
Code-Snippet fΓΌr Benchmark:
#include <benchmark/benchmark.h>
#include <mimalloc-override.h>
static void BM_EntityInsert(benchmark::State& state) {
ThemisDB db("test.db");
for (auto _ : state) {
std::string key = "entity:users:" + std::to_string(state.iterations());
std::string value = generateRandomEntity(2048); // 2KB Entity
db.put(key, value);
}
state.SetItemsProcessed(state.iterations());
}
BENCHMARK(BM_EntityInsert)->Threads(8)->UseRealTime();Standard-Linux-Pages sind 4KB groΓ. RocksDB Block-Cache (typisch 4-16 GB) benΓΆtigt Millionen von Page-Table-Entries:
Block Cache: 8 GB = 8 * 1024 MB = 8192 MB
Pages (4KB): 8192 MB / 4 KB = 2.097.152 Pages
TLB Entries: ~1.024 (Intel x86-64)
β TLB Miss Rate: ~99.95% β Massive Performance-EinbuΓen
Solution: Huge Pages (2MB statt 4KB)
Pages (2MB): 8192 MB / 2 MB = 4.096 Pages
TLB Entries: 512 (dedizierte Huge Page TLB)
β TLB Hit Rate: ~88% β 10-15% Performance-Gewinn
Schritt 1: Huge Pages reservieren
# PrΓΌfe aktuelle Konfiguration
cat /proc/meminfo | grep Huge
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB
# Reserviere 4096Γ 2MB = 8 GB Huge Pages
echo 4096 | sudo tee /proc/sys/vm/nr_hugepages
# Permanent (in /etc/sysctl.conf)
sudo bash -c 'echo "vm.nr_hugepages = 4096" >> /etc/sysctl.conf'
sudo sysctl -pSchritt 2: ThemisDB mit Huge Pages starten
// RocksDB unterstΓΌtzt Huge Pages nativ
rocksdb::Options options;
options.allow_mmap_reads = false; // Wichtig: Disable mmap fΓΌr Huge Pages
options.use_direct_reads = false;
options.use_direct_io_for_flush_and_compaction = false;
// Huge Pages werden automatisch genutzt fΓΌr:
// - Block Cache Allocations (via mimalloc)
// - MemTable Memorymimalloc Huge Pages Integration:
# mimalloc nutzt Huge Pages automatisch
export MIMALLOC_RESERVE_HUGE_OS_PAGES=4096 # 4096Γ 2MB = 8GB
export MIMALLOC_EAGER_COMMIT=1 # Immediate OS Page Commit
./themis_serverPrΓΌfen ob Huge Pages genutzt werden:
# WΓ€hrend ThemisDB lΓ€uft
cat /proc/<PID>/smaps | grep -A 10 "huge"
# Expected Output:
KernelPageSize: 2048 kB
MMUPageSize: 2048 kB
AnonHugePages: 8388608 kB # 8 GBBenchmark-Verifikation:
#include <benchmark/benchmark.h>
static void BM_CacheLookup(benchmark::State& state) {
// 4GB Cache mit Random Lookups
std::vector<char> cache(4LL * 1024 * 1024 * 1024);
std::mt19937_64 rng;
for (auto _ : state) {
size_t idx = rng() % cache.size();
benchmark::DoNotOptimize(cache[idx]); // Prevent optimization
}
}
// Ohne Huge Pages: ~180ns/lookup
// Mit Huge Pages: ~155ns/lookup (14% Speedup)
BENCHMARK(BM_CacheLookup);Problem: Explizite Huge Pages erfordern Root-Rechte und Pre-Allocation.
LΓΆsung: Transparent Huge Pages (THP) β Kernel managed automatisch:
# THP aktivieren
echo always | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
# Defrag-Modus (empfohlen: defer fΓΌr Production)
echo defer | sudo tee /sys/kernel/mm/transparent_hugepage/defragTrade-offs:
| Methode | Vorteile | Nachteile |
|---|---|---|
| Explicit Huge Pages | Garantierte 2MB Pages, max Performance | Root-Rechte, Pre-Allocation |
| Transparent Huge Pages | Keine Config, automatisch | Variable Performance, Defrag-Overhead |
Empfehlung: Explicit Huge Pages fΓΌr Production (deterministisch), THP fΓΌr Development/Testing.
RocksDB LSM-Tree hat 7 Levels (L0-L6). Hot Data (L0-L2) wird hΓ€ufig geschrieben/gelesen, Cold Data (L5-L6) selten.
Strategie: Schnelle Compression fΓΌr Hot, starke Compression fΓΌr Cold
rocksdb::Options options;
// Level 0-5: LZ4 (2-3x Ratio, minimal CPU)
options.compression = rocksdb::kLZ4Compression;
// Level 6 (bottommost): ZSTD (3-5x Ratio, moderate CPU)
options.bottommost_compression = rocksdb::kZSTD;
options.bottommost_compression_opts.level = 3; // ZSTD Level 1-22Benchmark-Resultate (10K Entities Γ 2KB):
| Compression Config | DB Size | Write (MB/s) | Read (MB/s) | Ratio |
|---|---|---|---|---|
| none / none | 45 MB | 34.5 | 125.3 | 1.0x |
| lz4 / lz4 | 20 MB | 33.9 | 120.1 | 2.25x |
| lz4 / zstd | 19 MB | 33.8 | 118.4 | 2.4x β |
| zstd / zstd | 15 MB | 32.3 | 112.7 | 3.0x |
Empfehlung: lz4 / zstd fΓΌr besten Trade-off.
Bloom Filters reduzieren unnΓΆtige Disk-Reads bei Point-Lookups (z.B. Secondary Index Scans).
rocksdb::BlockBasedTableOptions table_opts;
// Bloom Filter Konfiguration
table_opts.filter_policy.reset(rocksdb::NewBloomFilterPolicy(
10, // bits_per_key: 10 Bits = ~1% False-Positive-Rate
false // use_block_based_builder (false = Full Filter)
));
// Partitioned Filters fΓΌr groΓe Datasets
table_opts.partition_filters = true;
table_opts.index_type = rocksdb::BlockBasedTableOptions::kTwoLevelIndexSearch;
options.table_factory.reset(rocksdb::NewBlockBasedTableFactory(table_opts));False-Positive-Rate vs Memory:
| bits_per_key | False-Positive-Rate | Memory (1M Keys) |
|---|---|---|
| 6 | ~5% | 750 KB |
| 10 | ~1% | 1.25 MB |
| 14 | ~0.1% | 1.75 MB |
Empfehlung: bits_per_key=10 fΓΌr Production (guter Kompromiss).
Ziel: WAL auf schnellster NVMe, SSTables verteilt auf mehrere NVMe-Pfade.
rocksdb::Options options;
// WAL auf separater NVMe (max Write-Throughput)
options.wal_dir = "/nvme0/themis/wal";
// SSTables verteilt auf mehrere NVMe-Pfade
options.db_paths = {
{"/nvme0/themis/data", 500ULL * 1024 * 1024 * 1024}, // 500 GB
{"/nvme1/themis/data", 500ULL * 1024 * 1024 * 1024}, // 500 GB
{"/nvme2/themis/data", 1000ULL * 1024 * 1024 * 1024} // 1 TB (cold)
};
// RocksDB verteilt neue SSTables automatisch basierend auf target_sizeRationale:
- WAL: Sequential Writes β Single NVMe reicht (45K writes/sec)
- SSTables: Random Reads β Mehrere NVMe fΓΌr I/O-ParallelitΓ€t
Block Cache speichert dekomprimierte SSTable-BlΓΆcke im RAM.
rocksdb::BlockBasedTableOptions table_opts;
// 1. Cache-GrΓΆΓe (empfohlen: 20-40% RAM)
table_opts.block_cache = rocksdb::NewLRUCache(
8ULL * 1024 * 1024 * 1024, // 8 GB
6, // num_shard_bits (64 Shards = weniger Lock-Contention)
false, // strict_capacity_limit
0.5 // high_pri_pool_ratio (50% fΓΌr Index/Filter)
);
// 2. Index/Filter Blocks im Cache halten
table_opts.cache_index_and_filter_blocks = true;
table_opts.pin_l0_filter_and_index_blocks_in_cache = true;
// 3. Partitioned Filters (fΓΌr >1 GB Datasets)
table_opts.partition_filters = true;
table_opts.metadata_block_size = 4096;
options.table_factory.reset(rocksdb::NewBlockBasedTableFactory(table_opts));Cache Hit Rate Monitoring:
uint64_t cache_hits = db->GetOptions().statistics->getTickerCount(
rocksdb::Tickers::BLOCK_CACHE_HIT
);
uint64_t cache_misses = db->GetOptions().statistics->getTickerCount(
rocksdb::Tickers::BLOCK_CACHE_MISS
);
double hit_rate = static_cast<double>(cache_hits) / (cache_hits + cache_misses);
// Target: >90% Hit Rate fΓΌr Read-Heavy Workloads
LOG_INFO("Block Cache Hit Rate: {:.2f}%", hit_rate * 100);MemTables sind In-Memory Write-Buffer vor SSTable-Flush.
rocksdb::Options options;
// MemTable Size (grΓΆΓer = weniger Flushes, mehr RAM)
options.write_buffer_size = 256 * 1024 * 1024; // 256 MB
// Anzahl MemTables (fΓΌr Background Flush Pipelining)
options.max_write_buffer_number = 4;
options.min_write_buffer_number_to_merge = 1;
// MemTable Typ (Skip List ist Standard, Hash fΓΌr Point-Lookups)
options.memtable_factory.reset(rocksdb::NewHashSkipListRepFactory(
1024 * 1024 // bucket_count
));Sizing-Empfehlungen:
| Workload | write_buffer_size | max_write_buffer_number | Total RAM |
|---|---|---|---|
| Light (< 10K writes/sec) | 64 MB | 2 | 128 MB |
| Medium (10-50K writes/sec) | 256 MB | 4 | 1 GB |
| Heavy (> 50K writes/sec) | 512 MB | 6 | 3 GB |
Szenario: 4Γ NVMe SSDs, Datensicherheit erforderlich.
βββββββββββββββ βββββββββββββββ
β NVMe 0 β β NVMe 1 β } RAID 10
β 500 GB β β 500 GB β (Stripe + Mirror)
βββββββββββββββ βββββββββββββββ β /data/themis
β β
ββββββββββββββββββ
βββββββββββββββ βββββββββββββββ
β NVMe 2 β β NVMe 3 β } RAID 0
β 1 TB β β 1 TB β (Pure Stripe)
βββββββββββββββ βββββββββββββββ β /wal/themis
Linux mdadm Setup:
# RAID 10 fΓΌr Data (Redundanz + Performance)
sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 \
/dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1
# RAID 0 fΓΌr WAL (max Performance, WAL ist nicht kritisch)
sudo mdadm --create /dev/md1 --level=0 --raid-devices=2 \
/dev/nvme4n1 /dev/nvme5n1
# Filesystem (XFS empfohlen)
sudo mkfs.xfs /dev/md0
sudo mkfs.xfs /dev/md1
# Mount mit Optimierungen
sudo mount -o noatime,discard,nodiratime /dev/md0 /data/themis
sudo mount -o noatime,discard /dev/md1 /wal/themisI/O Scheduler:
# Deadline Scheduler fΓΌr SSDs (niedrigere Latenz)
echo deadline | sudo tee /sys/block/nvme0n1/queue/scheduler
# Alternativ: none (fΓΌr NVMe mit io_uring)
echo none | sudo tee /sys/block/nvme0n1/queue/schedulerSwappiness (empfohlen: 10 fΓΌr DB-Workloads):
# Verhindert Swap auΓer bei extremem Memory-Druck
echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.conf
sudo sysctl -pTransparent Huge Pages:
# THP aktivieren (siehe 8.3.4)
echo always | sudo tee /sys/kernel/mm/transparent_hugepage/enabledRocksDB Stats Export:
// Prometheus Metrics fΓΌr RocksDB
#include <prometheus/counter.h>
#include <prometheus/gauge.h>
class RocksDBMetricsExporter {
private:
rocksdb::DB* db_;
prometheus::Registry& registry_;
public:
void exportMetrics() {
auto stats = db_->GetOptions().statistics;
// Compaction Metrics
auto& compaction_gauge = prometheus::BuildGauge()
.Name("rocksdb_compaction_pending")
.Help("Number of pending compactions")
.Register(registry_);
compaction_gauge.Add({}).Set(
stats->getTickerCount(rocksdb::COMPACTION_PENDING)
);
// Cache Hit Rate
uint64_t hits = stats->getTickerCount(rocksdb::BLOCK_CACHE_HIT);
uint64_t misses = stats->getTickerCount(rocksdb::BLOCK_CACHE_MISS);
auto& hit_rate_gauge = prometheus::BuildGauge()
.Name("rocksdb_cache_hit_rate")
.Help("Block cache hit rate")
.Register(registry_);
hit_rate_gauge.Add({}).Set(
static_cast<double>(hits) / (hits + misses)
);
// Write Amplification
uint64_t bytes_written = stats->getTickerCount(rocksdb::BYTES_WRITTEN);
uint64_t wal_bytes = stats->getTickerCount(rocksdb::WAL_FILE_BYTES);
auto& write_amp_gauge = prometheus::BuildGauge()
.Name("rocksdb_write_amplification")
.Help("Write amplification factor")
.Register(registry_);
write_amp_gauge.Add({}).Set(
static_cast<double>(bytes_written) / wal_bytes
);
}
};Setup: 1M Entity Inserts + 10M Random Reads
Baseline (Default RocksDB Config):
Write Throughput: 450.000 ops/sec
Read Latency (p50): 2.1ms
Read Latency (p99): 8.5ms
Memory Usage: 6.2 GB
CPU Usage: 78%
Optimized (mit mimalloc + Huge Pages + Compression):
Write Throughput: 672.000 ops/sec (+49%)
Read Latency (p50): 1.4ms (-33%)
Read Latency (p99): 5.2ms (-39%)
Memory Usage: 5.1 GB (-18%)
CPU Usage: 62% (-21%)
| Optimization | Baseline | After | Delta | % Improvement |
|---|---|---|---|---|
| mimalloc Integration | 450K ops/s | 630K ops/s | +180K | +40% |
| Huge Pages (8GB) | 630K ops/s | 652K ops/s | +22K | +3.5% |
| LZ4/ZSTD Compression | 652K ops/s | 658K ops/s | +6K | +0.9% |
| Block Cache Tuning | 658K ops/s | 672K ops/s | +14K | +2.1% |
| TOTAL IMPROVEMENT | 450K ops/s | 672K ops/s | +222K | +49% |
Throughput vs Thread Count:
Threads Baseline Optimized Scaling Efficiency
1 85K ops/s 112K ops/s 100%
2 165K ops/s 220K ops/s 98%
4 310K ops/s 425K ops/s 95%
8 450K ops/s 672K ops/s 75%
16 580K ops/s 840K ops/s 47%
Interpretation: Optimized Config scales besser bis 8 Threads (75% vs 67% Baseline).
Storage:
- WAL auf separater NVMe (45K writes/sec vs 200 HDD)
- Multi-Path Setup fΓΌr SSTables (I/O-ParallelitΓ€t)
- RAID 10 fΓΌr Data (Redundanz), RAID 0 fΓΌr WAL (Performance)
Memory:
- mimalloc Integration (+40% Throughput)
- Huge Pages aktiviert (8GB fΓΌr Block Cache)
- Block Cache Sizing: 20-40% RAM
Compression:
- Tiered Compression: LZ4 (L0-L5) + ZSTD (L6)
- Bloom Filters: 10 bits/key (~1% FP-Rate)
Monitoring:
- Prometheus Metrics fΓΌr RocksDB Stats
- Cache Hit Rate > 90% fΓΌr Read-Heavy Workloads
- Write Amplification < 10
Tuning:
- Kernel: Deadline Scheduler, Swappiness=10
- Filesystem: XFS mit noatime, discard
- RocksDB: Prefix-Extractor, Partitioned Filters
Mit vollstΓ€ndiger Implementierung aller Optimierungen:
Random Writes: 672.000 ops/sec (103% von RocksDB Baseline)
Random Reads: 1.680.000 ops/sec (94% von RocksDB Baseline)
p99 Latency: 5.2ms (Production-Grade)
Overall Grade: A- (85-90% Compliance)
DatabaseMaintenanceOrchestrator (include/maintenance/database_maintenance_orchestrator.h) ist das zentrale Koordinationssystem fΓΌr alle Datenbankwartungsoperationen in ThemisDB. Es integriert Planung, AusfΓΌhrung, Audit-Logging, Observability und modulspezifische Gesundheitsberichte in einem einheitlichen API.
DatabaseMaintenanceOrchestrator
βββ MaintenanceScheduleStore β RocksDB-persistierte Schedule-CRUD
βββ TaskScheduler β Cron-basierte AusfΓΌhrung
βββ IMaintenanceTaskHandler β Module registrieren Implementierungen
β βββ StorageCompactionHandler β STORAGE_COMPACTION
β βββ MvccCleanupHandler β MVCC_CLEANUP
β βββ ReplicaValidationHandler β REPLICA_VALIDATION (geplant)
βββ HealthProbe Registry β Aggregierter ModuleHealthReport
PENDING β RUNNING β SUCCEEDED
β FAILED
β CANCELLED (via /cancel)
β SKIPPED (auΓerhalb Maintenance-Window)
Jobs werden 24 Stunden vorgehalten und danach automatisch bereinigt.
| Methode | Endpoint | Beschreibung |
|---|---|---|
POST |
/api/v1/maintenance/schedules |
Schedule erstellen |
GET |
/api/v1/maintenance/schedules |
Schedules auflisten |
GET |
/api/v1/maintenance/schedules/{id} |
Schedule abrufen |
PUT |
/api/v1/maintenance/schedules/{id} |
Schedule ersetzen |
PATCH |
/api/v1/maintenance/schedules/{id} |
Schedule partiell aktualisieren |
DELETE |
/api/v1/maintenance/schedules/{id} |
Schedule lΓΆschen |
GET |
/api/v1/maintenance/jobs |
Jobs auflisten |
GET |
/api/v1/maintenance/jobs/{id} |
Job-Details |
POST |
/api/v1/maintenance/jobs/{id}/cancel |
Job abbrechen |
POST |
/api/v1/maintenance/schedules/{id}/run |
Ad-hoc-AusfΓΌhrung |
GET |
/api/v1/maintenance/status |
Aggregierter Gesundheitsstatus |
#include "maintenance/database_maintenance_orchestrator.h"
#include "maintenance/maintenance_task_handler_impls.h"
DatabaseMaintenanceOrchestrator orchestrator(
task_scheduler,
index_maintenance_manager,
storage_engine,
audit_logger
);
// Modul-spezifische Handler registrieren
orchestrator.registerTaskHandler(
MaintenanceTaskType::STORAGE_COMPACTION,
std::make_shared<StorageCompactionHandler>(compaction_manager)
);
orchestrator.registerTaskHandler(
MaintenanceTaskType::MVCC_CLEANUP,
std::make_shared<MvccCleanupHandler>(mvcc_store, /*watermark_ms=*/86400000)
);
// Gesundheits-Probe registrieren (beliebiges Modul)
orchestrator.registerHealthProbe("storage", []() -> ModuleHealthSignal {
return { .status = ModuleHealthStatus::HEALTHY, .message = "All good" };
});
// Orchestrator starten (lΓ€dt Schedules aus RocksDB, registriert Cron-Tasks)
orchestrator.start();
// Schedule anlegen (tΓ€glich um 03:00 UTC)
MaintenanceScheduleEntry schedule;
schedule.task_type = MaintenanceTaskType::STORAGE_COMPACTION;
schedule.cron_expression = "0 3 * * *";
schedule.enabled = true;
schedule.halt_on_failure = false;
schedule.window_utc_hours = {2, 3, 4}; // Erlaubte UTC-Stunden
auto result = orchestrator.createSchedule(schedule);
// Ad-hoc-AusfΓΌhrung (mit Window-Override)
orchestrator.triggerNow(schedule_id, /*force=*/true);
// Gesundheitsbericht abfragen
auto health = orchestrator.getHealthReport();
// health.overall_status: HEALTHY / DEGRADED / UNHEALTHY
// health.module_signals: map<module_name, ModuleHealthSignal>| Typ | Beschreibung |
|---|---|
STORAGE_COMPACTION |
VollstΓ€ndige RocksDB-Kompaktierung |
MVCC_CLEANUP |
Bereinigung abgelaufener MVCC-Versionen |
INDEX_REBUILD |
Index-Neuaufbau nach Schema-Γnderungen |
REPLICA_VALIDATION |
Replikat-KonsistenzprΓΌfung |
WAL_ARCHIVAL |
WAL-Archivierung und -Rotation |
STATISTICS_UPDATE |
Aktualisierung der Query-Optimizer-Statistiken |
CACHE_FLUSH |
Cache-Invalidierung und -Warm-up |
SNAPSHOT_CLEANUP |
Entfernung veralteter Snapshots |
LOG_ROTATION |
Log-Datei-Rotation |
HEALTH_CHECK |
Systemweite GesundheitsprΓΌfung |
| ... | 9 weitere interne Typen |
-
Maintenance-Windows: Tasks werden automatisch
SKIPPEDwenn die aktuelle UTC-Stunde nicht im konfiguriertenwindow_utc_hours-Set liegt. -
Audit-Logging: Alle CRUD-Operationen und Job-Events werden ΓΌber
AuditLogger::logEvent()protokolliert. -
Halt-on-Failure:
halt_on_failure: truebricht die DAG-AusfΓΌhrung ab wenn ein Task fehlschlΓ€gt. -
DAG-Scheduling: Explizite
depends_on-Beziehungen zwischen Tasks; topologische Sortierung via Kahn-Algorithmus; Zykelerkennung verhindert ungΓΌltige Schedules. - Prometheus-Metriken: 11 ZΓ€hler und Histogramme fΓΌr Jobs, Laufzeit und Fehlerraten.
NΓ€chstes Kapitel: Chapter 9: Indexing Strategies β
TaskScheduler (include/scheduler/task_scheduler.h) ist ein produktionsreifer, allgemeiner Aufgaben-Planer fΓΌr periodische AQL-Queries, Custom-Functions und CDC-Event-Trigger. Er ergΓ€nzt den DatabaseMaintenanceOrchestrator (Β§8.9), ist aber unabhΓ€ngig nutzbar.
-
VollstΓ€ndiges Cron-Parsing: 5/6-Felder, Wildcards, Ranges, Listen, Steps, Name-Aliases (
@daily,@weekly), Timezone-aware - Trigger-Typen: Cron, Fixed-Interval, CDC-Event (Changefeed), Manual, Webhook
-
DAG-Workflow-Engine: topologische AusfΓΌhrungsreihenfolge mit parallelem Fan-Out und bedingtem Branching (
branch_condition) - Retry-Policies: FIXED_DELAY, EXPONENTIAL_BACKOFF, LINEAR_BACKOFF, JITTER_BACKOFF, FIBONACCI_BACKOFF
-
Dynamische Skalierung: Auto-Concurrency basierend auf Queue-Tiefe (
enable_dynamic_scaling) -
Observability: Audit-Log (
TaskAuditManager), Prometheus-Export (exportMetrics()), OpenTelemetry Tracing, Anomalie-Erkennung -
Persistenz: Task-Definitionen auf Disk; Results in ThemisDB (
TaskResultStore)
#include "scheduler/task_scheduler.h"
themis::scheduler::TaskScheduler::Config cfg;
cfg.max_concurrent_tasks = 8;
cfg.persist_tasks = true;
cfg.persistence_path = "data/tasks";
cfg.enable_audit_logging = true;
cfg.enable_dynamic_scaling = true;
cfg.max_concurrent_tasks_ceil = 16;
cfg.scale_up_queue_depth = 2;
cfg.enable_result_store = true;
themis::scheduler::TaskScheduler scheduler(&query_engine, cfg, &changefeed);
scheduler.start();
// ββ Task registrieren βββββββββββββββββββββββββββββββββββββββββββββββββ
themis::scheduler::ScheduledTask task;
task.name = "nightly-cleanup";
task.cron_expression = "0 2 * * *"; // tΓ€glich 02:00 UTC
task.aql_query = "FOR doc IN old_data FILTER doc.ts < @cutoff REMOVE doc IN old_data";
task.parameters = { {"cutoff", now_minus_30d} };
task.timeout_seconds = 300;
task.retry_policy = themis::scheduler::RetryPolicy::EXPONENTIAL_BACKOFF;
task.max_retries = 3;
auto task_id = scheduler.registerTask(task);
// ββ DAG-Workflow ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
themis::scheduler::ScheduledTask task_b;
task_b.name = "post-cleanup-report";
task_b.dependencies = { task_id }; // lΓ€uft nach nightly-cleanup
task_b.function = [](const auto& ctx) { /* ... */ return json{}; };
scheduler.registerTask(task_b);
// DAG ausfΓΌhren
auto dag_result = scheduler.executeDag({task_id, task_b_id});
// dag_result.succeeded: {task_id -> result_json}
// dag_result.failed: {task_id -> error_msg}
// dag_result.skipped: task_ids mit gescheiterten Dependencies
// ββ Sofort-AusfΓΌhrung βββββββββββββββββββββββββββββββββββββββββββββββββ
auto exec_result = scheduler.executeTaskNow(task_id);
// ββ Prometheus-Metriken exportieren ββββββββββββββββββββββββββββββββββ
std::string metrics_text = scheduler.exportMetrics();
// ββ Queue-Tiefe und Concurrency-Limit βββββββββββββββββββββββββββββββββ
size_t queue = scheduler.getQueueDepth();
size_t conc = scheduler.getDynamicConcurrencyLimit();
scheduler.stop();#include "scheduler/hybrid_retention_manager.h"
themis::scheduler::HybridRetentionConfig ret_cfg;
ret_cfg.stage1_retention_days = 7; // Gorilla-Kompression (10β20Γ Reduktion)
ret_cfg.stage2_retention_days = 365; // Varianz-basiertes Downsampling
// Stage 3 (>365 Tage): Tages-Aggregate
themis::scheduler::HybridRetentionManager retention(ts_store, ret_cfg);
retention.start(); // startet Hintergrund-Thread fΓΌr alle 3 Stufen
auto stats = retention.getStats();
// stats.stage1_points_processed, stats.stage2_points_downsampled,
// stats.stage3_aggregates_createdThemisDB 1.9.0-beta Β· Home Β· Module-Index Β· GitHub Β· Issues
ThemisDB 1.9.0-beta Β· Home Β· Wiki-Index Β· Module-Index Β· FAQ Β· Quick-Reference Β· GitHub Β· Issues Β· Discussions Β· License
- Home
- Hero Articles
- All Wiki Pages
- FAQ
- Edition Comparison
- Repository README
- Changelog
- Roadmap
- Versioning
- Integration Mapping
- Overview
- Readme
- Appendix D Feature Status
- Appendix E Incident Runbooks
- Appendix F AQL Cheatsheet
- Appendix G Configuration
- Appendix H Glossary
- Appendix I Troubleshooting
- Appendix Literatur
- Chapter 00 Genesis
- Chapter 01 Introduction
- Chapter 02 Architecture
- Chapter 03 Multimodel
- Chapter 04 Installation
- Chapter 05 Relational
- Chapter 06 Graph
- Chapter 07 Document
- Chapter 08 Storage Layer
- Chapter 08 Vector
- Chapter 09 Timeseries
- Chapter 10 Enterprise
- Chapter 11 Realtime
- Chapter 12 Computervision
- Chapter 13 Fulltext
- Chapter 14 Geospatial
- Chapter 15 Analytics
- Chapter 16 Ml
- Chapter 16 Sharding
- Chapter 17 LLM Integration
- Chapter 17 Scaling
- Chapter 18 HA
- Chapter 18 Ml
- Chapter 19 Monitoring
- Chapter 19 Monitoring Observability
- Chapter 20 Backup
- Chapter 20 Performance
- Chapter 21 Auth
- Chapter 21 Performance
- Chapter 22 Clients
- Chapter 22 Encryption
- Chapter 23 Testing Qa
- Chapter 24 Ai Ethics
- Chapter 25 Devops Infrastructure
- Chapter 26 Migration Legacy
- Chapter 27 Troubleshooting
- Chapter 28 AQL Reference
- Chapter 29 Analytics Process Mining
- Chapter 30 Deployment Operations
- Chapter 31 API Protocols
- Chapter 32 API Design Rest Principles
- Chapter 32 AQL Oop Implementation
- Chapter 33 Best Practices
- Chapter 34 Query Optimization
- Chapter 35 Data Modeling Patterns
- Chapter 36 Security Hardening
- Chapter 37 Ecosystem Integration
- Chapter 38 Observability Sre
- Chapter 39 Performance Tuning Cookbook
- Chapter 40 Data Governance Compliance
- Chapter 41 Hands On Labs
- Chapter 42 Docs Assistant Usage
- Chapter MVCC Hlc
- Cover
- Cover Book
- Index
- Preface
- Test Links Example
- Batch Operations
- Best Practices
- CRUD Tutorial
- Custom Document Ingestion
- Getting Started Tutorial
- Interactive Examples
- Schema Design
- Video Tutorials
- AQL Reference
- AQL Examples
- AQL Overview
- AQL Feature Roadmap
- AQL Geospatial Guide
- AQL LLM Migration Guide
- AQL API
- AQL Grammar (EBNF)
- AQL Root Overview
- AQL Examples (root)
- API Reference
- API Module README
- OpenAPI Overview
- Client SDK Overview
- SDK Overview
- Operations
- Operations Overview
- Operations Runbook
- Operations Handbook
- ThemisCtl Admin Guide
- Pipeline E2E SOPs
- Docker Overview
- Docker Hub README
- Helm Overview
- Packaging Overview
- Operator Overview
- Security Policy
- Production Hardening Checklist
- Security Hardening Guide
- Encryption Key Management
- Access Control Framework
- Zero Trust Policy
- API Authentication & Authorization
- HSM Production Setup
- PKCS11 Integration
- DSGVO / SOC2 Checklist
- Access Model Runbooks
- Access Model Dashboard
- Maturity Automation Runbook
- Access Review Automation
- Access Model Dashboard
- Access Model Runbooks
- Rights Revocation
- Dr Checklists
- Dr Testing
- Incident Response Playbook
- Incident Response Testing
- GPU Oom Recovery
- Grammar Debugging
- Metrics Scrape Troubleshooting
- Model Swap Procedure
- Quota Tuning
- Subagent Deployment
- Logging Configuration
- Content Model
- Crypto & Keys
- Feature Flags Reference
- Modular Architecture Roadmap
- Modularization Guide
- Module Architecture Index
- PostgreSQL Wire Protocol
- Query Scheduling
- Raft Consensus Design
- Resource Pooling
- Source Directory Guide
- Unified Access Model
- E1 001 Layered Retrieval Design
- E1 002 Ann Abstraction Strategy
- E1 003 Tensor Summary Types
- E1 004 Lora Package Distinction
- E1 005 Model Switch Compatibility
- E1 006 Federated Tensor Summaries
- E2 001 Evaluation Framework Design
- E2 002 Hardware Profile Strategy
- E2 003 Query Planner Routing Model
- E2 004 Approximation Governance Rules
- E2 005 Cross Layer Fallback Confidence Policy
- E3 001 Distributed Tensor Design
- E3 002 Manifest Coordination Strategy
- E3 003 Recovery And Erasure Choice
- E3 004 Tensor Fabric Infrastructure
- Contributing
- Contributing (root)
- Code of Conduct
- Support
- Maintainers
- CTest Guide
- Build Quick Reference
- Developer Wiki Index
- Build / Test / CI
- Module Index
- Branching Strategy
- Release Strategy
- CI Policy Gates Wave C
- Disabled Stub Policy
- Docs PR Policy
- GA Promotion Sign Off
- Github Milestones Setup
- Governance Policies Phase1
- GPU Self Hosted Runner Requirements
- Hardening Phase 1 2 Summary 2026 09 23
- Maturity Claim Verification Checklist
- Maturity Evidence Registry
- Merge Gate Bot Config
- Merge Gate Status Live
- Phase 1 Closure Report
- Phase 1 Infrastructure Deployment
- Phase 1 Infrastructure Deployment Complete
- Phase 3 Baseline Capture
- Phase 3 Refinement Spec
- Phase 4 Sign Off And Closure
- Phase Closure Policy
- Phase Dependency Graph
- Phase3 Enforcement Runbook
- Plugin Submodule Rollback
- PR Version Targeting
- PR Version Targeting Backfill
- Production Ready 2026 Delivery Plan
- Publish Workflow Audit 2026 09 23
- Query Module Status
- Readme
- Release Governance
- Release Promotion Gate Policy
- Release Validation Checklist
- Root Hygiene Policy
- SBOM Approved Versions
- Security Compliance Audit Report 2026 08 10
- Security Module 5671 Evidence Summary
- Sharding P6 Residual Risk Acceptance
- Sourcecode Compliance Governance
- Src Module Documentation Compliance 2026 09 20
- Updates Development Status Sign Off
- Wave C Implementation Complete
- Wave C Implementation Plan
- Wave C Ml Exit Gate Sign Off
- Wave C Policy Gate Evidence
- Wiki Publish Tracking Guide
- Blob Storage
- Cuda
- Ethics Ai
- Exporters
- Huggingface
- Image Analysis
- Importers
- RPC
- Scraper
- Themisdb Ai Watermark Detector
- User Storage Encrypted
- Chimera Architecture
- Chimera Future
- Chimera Readme
- Chimera Roadmap
- Covina Fastapi Ingestion Architecture
- Covina Fastapi Ingestion Future
- Covina Fastapi Ingestion Roadmap
- Vcc Base Architecture
- Vcc Base Future
- Vcc Base Roadmap
- Vcc Clara Ingestion Architecture
- Vcc Clara Ingestion Future
- Vcc Clara Ingestion Roadmap
- Vcc Veritas Architecture
- Vcc Veritas Future
- Vcc Veritas Roadmap
- 01 Hello World
- 02 Todo App
- 03 Contact Manager
- 04 Inventory System
- 05 Time Series Monitor
- 06 Graph Social Network
- 07 Vector Search Documents
- 08 Dms Erp System
- 09 Iot Sensor Network
- 10 Drone Image Analysis
- 11 Blog Wiki
- 12 Expense Tracker
- 13 Recipe Manager
- 14 Ecommerce Catalog
- 15 Event Management
- 16 Kanban Board
- 17 Crm
- 18 Realtime Chat
- 19 Recommendation Engine
- 20 Smart Home
- 21 Coding Platform
- 22 AQL Diagram Tool
- 23 Traveling Salesman
- 24 Moral Philosophy Debates
- API Versioning
- Distributed Sharding
- Feedback Plugins
- Geo
- Gnn
- Image Analysis
- Legal Lora Training
- LLM
- Lora Sync
- Migration
- Nlp
- Performance
- Railway
- Replication
- Rope Visualization
- Sample Product Config
- Security
- Client SDK Overview
- Quickstart
- Sdk Enhancements
- Sdk Implementation Summary
- Test Suite Readme
- Go
- Java
- Javascript
- Php
- Python
- Ruby
- Rust
- Typescript
- 01 Grundlegende Operationen
- 02 AQL Queries
- 03 Graph Daten
- 04 Multimodell Anwendung
- 01 Quickstart Guide
- 02 AQL Referenz Kurzuebersicht
- 03 Datenmodellierung Guide
- 04 Uebungsaufgaben
- 05 Best Practices Guide
- Training Documents
- Training Overview
- 01 Einfuehrung Und Uebersicht
- 02 Datenmodelle Und Architektur
- 03 AQL Abfragesprache
- 04 Installation Und Setup
- 05 Anwendungsbeispiele
- Training Presentations
- Dependencies Readme
- Processmonitor Readme
- Themis.admintools.shared Readme
- Themis.aqlquerybuilder Readme
- Themis.aqlquerybuilder Roadmap
- Themis.auditlogviewer Readme
- Themis.auditlogviewer Roadmap
- Themis.classificationdashboard Readme
- Themis.classificationdashboard Roadmap
- Themis.compliancereports Readme
- Themis.compliancereports Roadmap
- Themis.gisviewer.controlpanel Readme
- Themis.gisviewer.controlpanel Roadmap
- Themis.impactanalysisviewer Readme
- Themis.impactanalysisviewer Roadmap
- Themis.ingestiontool Readme
- Themis.ingestiontool Roadmap
- Themis.keyrotationdashboard Readme
- Themis.keyrotationdashboard Roadmap
- Themis.piimanager Readme
- Themis.piimanager Roadmap
- Themis.retentionmanager Readme
- Themis.retentionmanager Roadmap
- Themis.sagaverifier Readme
- Themis.sagaverifier Roadmap
- Themis.usbadmintool Readme
- Themis.usbadmintool Roadmap
- Architecture Generator Readme
- CI Readme
- CI Roadmap
- Compiler Diagnostics Readme
- Compiler Diagnostics Roadmap
- Completion Readme
- Copilot Ollama Router Readme
- Copilot Ollama Router Roadmap
- Gnn Readme
- Gnn Roadmap
- Rope Visualizer Readme
- Rope Visualizer Roadmap
- Tco Calculator Readme
- Tco Calculator Roadmap
- Tests Readme
- Tests Roadmap
- Themis Config Wx Readme
- Themis Docs Builder Readme
- Wikipedia Ingestion Readme
- Ai Metadata And Provenance
- Build / Test / CI
- Governance And Roadmap
- Developer Wiki Index
- Module Direct Doxygen Check
- Module Doxygen Baseline Summary
- Module Doxygen Batch
- Module Doxygen Coverage Summary
- Module Doxygen Smoke Summary
- Modules And Apis
- Retrieval Direct Doxygen Check
- Soll Ist Gap Summary
- Wiki Delta Report