about summary refs log tree commit diff stats
path: root/archive/2025/summer/bsc_karidas/benchmarks/workloads/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'archive/2025/summer/bsc_karidas/benchmarks/workloads/main.cpp')
-rw-r--r--archive/2025/summer/bsc_karidas/benchmarks/workloads/main.cpp103
1 files changed, 103 insertions, 0 deletions
diff --git a/archive/2025/summer/bsc_karidas/benchmarks/workloads/main.cpp b/archive/2025/summer/bsc_karidas/benchmarks/workloads/main.cpp
new file mode 100644
index 000000000..401db22a0
--- /dev/null
+++ b/archive/2025/summer/bsc_karidas/benchmarks/workloads/main.cpp
@@ -0,0 +1,103 @@
+#include "BenchmarkUtils.hpp"
+#include "LoggingManager.hpp"
+#include <iostream>
+#include <thread>
+#include <chrono>
+#include <vector>
+#include <future>
+#include <optional>
+#include <filesystem>
+#include <numeric>
+
+int main()
+{
+    // system parameters
+    LoggingConfig config;
+    config.basePath = "./logs";
+    config.baseFilename = "default";
+    config.maxSegmentSize = 50 * 1024 * 1024; // 50 MB
+    config.maxAttempts = 5;
+    config.baseRetryDelay = std::chrono::milliseconds(1);
+    config.queueCapacity = 3000000;
+    config.maxExplicitProducers = 96;
+    config.batchSize = 8192;
+    config.numWriterThreads = 96;
+    config.appendTimeout = std::chrono::minutes(2);
+    config.useEncryption = true;
+    config.compressionLevel = 9;
+    config.maxOpenFiles = 512;
+    // benchmark parameters
+    const int numSpecificFiles = 1024;
+    const int producerBatchSize = 4096;
+    const int numProducers = 96;
+    const int entriesPerProducer = 800000;
+    const int payloadSize = 4096;
+
+    cleanupLogDirectory(config.basePath);
+
+    std::cout << "Generating batches with pre-determined destinations...";
+    std::vector<BatchWithDestination> batches = generateBatches(entriesPerProducer, numSpecificFiles, producerBatchSize, payloadSize);
+    std::cout << " Done." << std::endl;
+    size_t totalDataSizeBytes = calculateTotalDataSize(batches, numProducers);
+    double totalDataSizeGiB = static_cast<double>(totalDataSizeBytes) / (1024 * 1024 * 1024);
+    std::cout << "Total data to be written: " << totalDataSizeBytes << " bytes (" << totalDataSizeGiB << " GiB)" << std::endl;
+
+    LoggingManager loggingManager(config);
+    loggingManager.start();
+    auto startTime = std::chrono::high_resolution_clock::now();
+
+    // Each future now returns a LatencyCollector with thread-local measurements
+    std::vector<std::future<LatencyCollector>> futures;
+    for (int i = 0; i < numProducers; i++)
+    {
+        futures.push_back(std::async(
+            std::launch::async,
+            appendLogEntries,
+            std::ref(loggingManager),
+            std::ref(batches)));
+    }
+
+    // Collect latency measurements from all threads
+    LatencyCollector masterCollector;
+    for (auto &future : futures)
+    {
+        LatencyCollector threadCollector = future.get();
+        masterCollector.merge(threadCollector);
+    }
+
+    loggingManager.stop();
+    auto endTime = std::chrono::high_resolution_clock::now();
+    std::chrono::duration<double> elapsed = endTime - startTime;
+
+    size_t finalStorageSize = calculateDirectorySize(config.basePath);
+    double finalStorageSizeGiB = static_cast<double>(finalStorageSize) / (1024 * 1024 * 1024);
+    double writeAmplification = static_cast<double>(finalStorageSize) / totalDataSizeBytes;
+
+    double elapsedSeconds = elapsed.count();
+    const size_t totalEntries = numProducers * entriesPerProducer;
+    double entriesThroughput = totalEntries / elapsedSeconds;
+    double logicalThroughputGiB = totalDataSizeGiB / elapsedSeconds;
+    double physicalThroughputGiB = finalStorageSizeGiB / elapsedSeconds;
+    double averageEntrySize = static_cast<double>(totalDataSizeBytes) / totalEntries;
+
+    // Calculate latency statistics from merged measurements
+    auto latencyStats = calculateLatencyStats(masterCollector);
+
+    cleanupLogDirectory(config.basePath);
+
+    std::cout << "============== Benchmark Results ==============" << std::endl;
+    std::cout << "Execution time: " << elapsedSeconds << " seconds" << std::endl;
+    std::cout << "Total entries appended: " << totalEntries << std::endl;
+    std::cout << "Average entry size: " << averageEntrySize << " bytes" << std::endl;
+    std::cout << "Total data written: " << totalDataSizeGiB << " GiB" << std::endl;
+    std::cout << "Final storage size: " << finalStorageSizeGiB << " GiB" << std::endl;
+    std::cout << "Write amplification: " << writeAmplification << " (ratio)" << std::endl;
+    std::cout << "Throughput (entries): " << entriesThroughput << " entries/second" << std::endl;
+    std::cout << "Throughput (logical): " << logicalThroughputGiB << " GiB/second" << std::endl;
+    std::cout << "Throughput (physical): " << physicalThroughputGiB << " GiB/second" << std::endl;
+    std::cout << "===============================================" << std::endl;
+
+    printLatencyStats(latencyStats);
+
+    return 0;
+}
\ No newline at end of file