internal unsafe (double, double) Run(TestLoader testLoader) { #if DASHBOARD var dash = new Thread(() => DoContinuousMeasurements()); dash.Start(); #endif Thread[] workers = new Thread[testLoader.Options.ThreadCount]; Console.WriteLine("Executing setup."); var storeWasRecovered = testLoader.MaybeRecoverStore(store); long elapsedMs = 0; if (!storeWasRecovered) { // Setup the store for the YCSB benchmark. Console.WriteLine("Loading FasterKV from data"); for (int idx = 0; idx < testLoader.Options.ThreadCount; ++idx) { int x = idx; workers[idx] = new Thread(() => SetupYcsb(x)); } foreach (Thread worker in workers) { worker.Start(); } waiter.Set(); var sw = Stopwatch.StartNew(); foreach (Thread worker in workers) { worker.Join(); } sw.Stop(); elapsedMs = sw.ElapsedMilliseconds; waiter.Reset(); } double insertsPerSecond = elapsedMs == 0 ? 0 : ((double)kInitCount / elapsedMs) * 1000; Console.WriteLine(TestStats.GetLoadingTimeLine(insertsPerSecond, elapsedMs)); Console.WriteLine(TestStats.GetAddressesLine(AddressLineNum.Before, store.Log.BeginAddress, store.Log.HeadAddress, store.Log.ReadOnlyAddress, store.Log.TailAddress)); if (!storeWasRecovered) { testLoader.MaybeCheckpointStore(store); } // Uncomment below to dispose log from memory, use for 100% read workloads only // store.Log.DisposeFromMemory(); idx_ = 0; if (YcsbConstants.kDumpDistribution) { Console.WriteLine(store.DumpDistribution()); } // Ensure first checkpoint is fast if (YcsbConstants.kPeriodicCheckpointMilliseconds > 0) { store.Log.ShiftReadOnlyAddress(store.Log.TailAddress, true); } Console.WriteLine("Executing experiment."); // Run the experiment. for (int idx = 0; idx < testLoader.Options.ThreadCount; ++idx) { int x = idx; workers[idx] = new Thread(() => RunYcsb(x)); } // Start threads. foreach (Thread worker in workers) { worker.Start(); } waiter.Set(); Stopwatch swatch = new Stopwatch(); swatch.Start(); if (YcsbConstants.kPeriodicCheckpointMilliseconds <= 0) { Thread.Sleep(TimeSpan.FromSeconds(testLoader.Options.RunSeconds)); } else { var checkpointTaken = 0; while (swatch.ElapsedMilliseconds < 1000 * testLoader.Options.RunSeconds) { if (checkpointTaken < swatch.ElapsedMilliseconds / YcsbConstants.kPeriodicCheckpointMilliseconds) { if (store.TakeHybridLogCheckpoint(out _)) { checkpointTaken++; } } } Console.WriteLine($"Checkpoint taken {checkpointTaken}"); } swatch.Stop(); done = true; foreach (Thread worker in workers) { worker.Join(); } waiter.Reset(); #if DASHBOARD dash.Join(); #endif double seconds = swatch.ElapsedMilliseconds / 1000.0; Console.WriteLine(TestStats.GetAddressesLine(AddressLineNum.After, store.Log.BeginAddress, store.Log.HeadAddress, store.Log.ReadOnlyAddress, store.Log.TailAddress)); double opsPerSecond = total_ops_done / seconds; Console.WriteLine(TestStats.GetTotalOpsString(total_ops_done, seconds)); Console.WriteLine(TestStats.GetStatsLine(StatsLineNum.Iteration, YcsbConstants.OpsPerSec, opsPerSecond)); return(insertsPerSecond, opsPerSecond); }
internal unsafe (double, double) Run(TestLoader testLoader) { RandomGenerator rng = new RandomGenerator(); GCHandle handle = GCHandle.Alloc(input_, GCHandleType.Pinned); input_ptr = (Input *)handle.AddrOfPinnedObject(); #if DASHBOARD var dash = new Thread(() => DoContinuousMeasurements()); dash.Start(); #endif Thread[] workers = new Thread[testLoader.Options.ThreadCount]; Console.WriteLine("Executing setup."); // Setup the store for the YCSB benchmark. for (int idx = 0; idx < testLoader.Options.ThreadCount; ++idx) { int x = idx; workers[idx] = new Thread(() => SetupYcsb(x)); } Stopwatch sw = new Stopwatch(); sw.Start(); // Start threads. foreach (Thread worker in workers) { worker.Start(); } foreach (Thread worker in workers) { worker.Join(); } sw.Stop(); double insertsPerSecond = ((double)testLoader.InitCount / sw.ElapsedMilliseconds) * 1000; Console.WriteLine(TestStats.GetLoadingTimeLine(insertsPerSecond, sw.ElapsedMilliseconds)); idx_ = 0; Console.WriteLine("Executing experiment."); // Run the experiment. for (int idx = 0; idx < testLoader.Options.ThreadCount; ++idx) { int x = idx; workers[idx] = new Thread(() => RunYcsb(x)); } // Start threads. foreach (Thread worker in workers) { worker.Start(); } Stopwatch swatch = new Stopwatch(); swatch.Start(); if (testLoader.Options.PeriodicCheckpointMilliseconds <= 0) { Thread.Sleep(TimeSpan.FromSeconds(testLoader.Options.RunSeconds)); } else { double runSeconds = 0; while (runSeconds < testLoader.Options.RunSeconds) { Thread.Sleep(TimeSpan.FromMilliseconds(testLoader.Options.PeriodicCheckpointMilliseconds)); runSeconds += testLoader.Options.PeriodicCheckpointMilliseconds / 1000; } } swatch.Stop(); done = true; foreach (Thread worker in workers) { worker.Join(); } #if DASHBOARD dash.Abort(); #endif handle.Free(); input_ptr = null; double seconds = swatch.ElapsedMilliseconds / 1000.0; double opsPerSecond = total_ops_done / seconds; Console.WriteLine(TestStats.GetTotalOpsString(total_ops_done, seconds)); Console.WriteLine(TestStats.GetStatsLine(StatsLineNum.Iteration, YcsbConstants.OpsPerSec, opsPerSecond)); return(insertsPerSecond, opsPerSecond); }