Пример #1
0
        private void RunYcsb(int thread_idx)
        {
            RandomGenerator rng = new RandomGenerator((uint)(1 + thread_idx));

            if (numaStyle == 0)
            {
                Native32.AffinitizeThreadRoundRobin((uint)thread_idx);
            }
            else
            {
                Native32.AffinitizeThreadShardedNuma((uint)thread_idx, 2); // assuming two NUMA sockets
            }
            Stopwatch sw = new Stopwatch();

            sw.Start();


            Value  value  = default(Value);
            Input  input  = default(Input);
            Output output = default(Output);

            long reads_done  = 0;
            long writes_done = 0;

#if DASHBOARD
            var tstart           = Stopwatch.GetTimestamp();
            var tstop1           = tstart;
            var lastWrittenValue = 0;
            int count            = 0;
#endif

            store.StartSession();

            while (!done)
            {
                long chunk_idx = Interlocked.Add(ref idx_, kChunkSize) - kChunkSize;
                while (chunk_idx >= kTxnCount)
                {
                    if (chunk_idx == kTxnCount)
                    {
                        idx_ = 0;
                    }
                    chunk_idx = Interlocked.Add(ref idx_, kChunkSize) - kChunkSize;
                }

                for (long idx = chunk_idx; idx < chunk_idx + kChunkSize && !done; ++idx)
                {
                    Op  op;
                    int r = (int)rng.Generate(100);
                    if (r < readPercent)
                    {
                        op = Op.Read;
                    }
                    else if (readPercent >= 0)
                    {
                        op = Op.Upsert;
                    }
                    else
                    {
                        op = Op.ReadModifyWrite;
                    }

                    if (idx % 256 == 0)
                    {
                        store.Refresh();

                        if (idx % 65536 == 0)
                        {
                            store.CompletePending(false);
                        }
                    }

                    switch (op)
                    {
                    case Op.Upsert:
                    {
                        store.Upsert(ref txn_keys_[idx], ref value, Empty.Default, 1);
                        ++writes_done;
                        break;
                    }

                    case Op.Read:
                    {
                        Status result = store.Read(ref txn_keys_[idx], ref input, ref output, Empty.Default, 1);
                        if (result == Status.OK)
                        {
                            ++reads_done;
                        }
                        break;
                    }

                    case Op.ReadModifyWrite:
                    {
                        Status result = store.RMW(ref txn_keys_[idx], ref input_[idx & 0x7], Empty.Default, 1);
                        if (result == Status.OK)
                        {
                            ++writes_done;
                        }
                        break;
                    }

                    default:
                        throw new InvalidOperationException("Unexpected op: " + op);
                    }
                }

#if DASHBOARD
                count += (int)kChunkSize;

                //Check if stats collector is requesting for statistics
                if (writeStats[thread_idx])
                {
                    var tstart1 = tstop1;
                    tstop1 = Stopwatch.GetTimestamp();
                    threadProgress[thread_idx]   = count;
                    threadThroughput[thread_idx] = (count - lastWrittenValue) / ((tstop1 - tstart1) / freq);
                    lastWrittenValue             = count;
                    writeStats[thread_idx]       = false;
                    statsWritten[thread_idx].Set();
                }
#endif
            }

            store.CompletePending(true);
            store.StopSession();
            sw.Stop();

            Console.WriteLine("Thread " + thread_idx + " done; " + reads_done + " reads, " +
                              writes_done + " writes, in " + sw.ElapsedMilliseconds + " ms.");
            Interlocked.Add(ref total_ops_done, reads_done + writes_done);
        }
Пример #2
0
        public unsafe void Run()
        {
            RandomGenerator rng = new RandomGenerator();

            LoadData();

            input_ = new Input[8];
            for (int i = 0; i < 8; i++)
            {
                input_[i].value = i;
            }
            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[threadCount];

            Console.WriteLine("Executing setup.");

            // Setup the store for the YCSB benchmark.
            for (int idx = 0; idx < 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();

            Console.WriteLine("Loading time: {0}ms", sw.ElapsedMilliseconds);

            idx_ = 0;

            Console.WriteLine("Executing experiment.");

            // Run the experiment.
            for (int idx = 0; idx < 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 (kCheckpointSeconds <= 0)
            {
                Thread.Sleep(TimeSpan.FromSeconds(kRunSeconds));
            }
            else
            {
                int runSeconds = 0;
                while (runSeconds < kRunSeconds)
                {
                    Thread.Sleep(TimeSpan.FromSeconds(kCheckpointSeconds));
                    runSeconds += kCheckpointSeconds;
                }
            }

            swatch.Stop();

            done = true;

            foreach (Thread worker in workers)
            {
                worker.Join();
            }

#if DASHBOARD
            dash.Abort();
#endif

            double seconds = swatch.ElapsedMilliseconds / 1000.0;

            Console.WriteLine("Total " + total_ops_done + " ops done " + " in " + seconds + " secs.");
            Console.WriteLine("##, " + distribution + ", " + numaStyle + ", " + readPercent + ", "
                              + threadCount + ", " + total_ops_done / seconds);
        }
Пример #3
0
        public unsafe void Run()
        {
            Native32.AffinitizeThreadShardedNuma((uint)0, 2);

            RandomGenerator rng = new RandomGenerator();

            LoadData();

            input_ = new Input[8];
            for (int i = 0; i < 8; i++)
            {
                input_[i].value = i;
            }

#if DASHBOARD
            var dash = new Thread(() => DoContinuousMeasurements());
            dash.Start();
#endif

            Thread[] workers = new Thread[threadCount];

            Console.WriteLine("Executing setup.");

            // Setup the store for the YCSB benchmark.
            for (int idx = 0; idx < 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();
            Console.WriteLine("Loading time: {0}ms", sw.ElapsedMilliseconds);

            long startTailAddress = store.Log.TailAddress;
            Console.WriteLine("Start tail address = " + startTailAddress);


            idx_ = 0;
            Console.WriteLine(store.DumpDistribution());

            Console.WriteLine("Executing experiment.");

            // Run the experiment.
            for (int idx = 0; idx < 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 (kCheckpointSeconds <= 0)
            {
                Thread.Sleep(TimeSpan.FromSeconds(kRunSeconds));
            }
            else
            {
                int runSeconds = 0;
                while (runSeconds < kRunSeconds)
                {
                    Thread.Sleep(TimeSpan.FromSeconds(kCheckpointSeconds));
                    store.TakeFullCheckpoint(out Guid token);
                    runSeconds += kCheckpointSeconds;
                }
            }

            swatch.Stop();

            done = true;

            foreach (Thread worker in workers)
            {
                worker.Join();
            }

#if DASHBOARD
            dash.Abort();
#endif

            double seconds        = swatch.ElapsedMilliseconds / 1000.0;
            long   endTailAddress = store.Log.TailAddress;
            Console.WriteLine("End tail address = " + endTailAddress);

            Console.WriteLine("Total " + total_ops_done + " ops done " + " in " + seconds + " secs.");
            Console.WriteLine("##, " + distribution + ", " + numaStyle + ", " + readPercent + ", "
                              + threadCount + ", " + total_ops_done / seconds + ", "
                              + (endTailAddress - startTailAddress));
        }
Пример #4
0
        private void RunYcsb(int thread_idx)
        {
            RandomGenerator rng = new RandomGenerator((uint)(1 + thread_idx));

            if (numaStyle == 0)
            {
                Native32.AffinitizeThreadRoundRobin((uint)thread_idx);
            }
            else
            {
                Native32.AffinitizeThreadShardedNuma((uint)thread_idx, 2); // assuming two NUMA sockets
            }
            Stopwatch sw = new Stopwatch();

            sw.Start();

            Value value       = default;
            long  reads_done  = 0;
            long  writes_done = 0;

#if DASHBOARD
            var tstart           = Stopwatch.GetTimestamp();
            var tstop1           = tstart;
            var lastWrittenValue = 0;
            int count            = 0;
#endif

            while (!done)
            {
                long chunk_idx = Interlocked.Add(ref idx_, kChunkSize) - kChunkSize;
                while (chunk_idx >= kTxnCount)
                {
                    if (chunk_idx == kTxnCount)
                    {
                        idx_ = 0;
                    }
                    chunk_idx = Interlocked.Add(ref idx_, kChunkSize) - kChunkSize;
                }

                for (long idx = chunk_idx; idx < chunk_idx + kChunkSize && !done; ++idx)
                {
                    Op  op;
                    int r = (int)rng.Generate(100);
                    if (r < readPercent)
                    {
                        op = Op.Read;
                    }
                    else if (readPercent >= 0)
                    {
                        op = Op.Upsert;
                    }
                    else
                    {
                        op = Op.ReadModifyWrite;
                    }

                    switch (op)
                    {
                    case Op.Upsert:
                    {
                        store[txn_keys_[idx]] = value;
                        ++writes_done;
                        break;
                    }

                    case Op.Read:
                    {
                        if (store.TryGetValue(txn_keys_[idx], out value))
                        {
                            ++reads_done;
                        }
                        break;
                    }

                    case Op.ReadModifyWrite:
                    {
                        store.AddOrUpdate(txn_keys_[idx], *(Value *)(input_ptr + (idx & 0x7)), (k, v) => new Value {
                                value = v.value + (input_ptr + (idx & 0x7))->value
                            });
                        ++writes_done;
                        break;
                    }

                    default:
                        throw new InvalidOperationException("Unexpected op: " + op);
                    }
                }

#if DASHBOARD
                count += (int)kChunkSize;

                //Check if stats collector is requesting for statistics
                if (writeStats[thread_idx])
                {
                    var tstart1 = tstop1;
                    tstop1 = Stopwatch.GetTimestamp();
                    threadProgress[thread_idx]   = count;
                    threadThroughput[thread_idx] = (count - lastWrittenValue) / ((tstop1 - tstart1) / freq);
                    lastWrittenValue             = count;
                    writeStats[thread_idx]       = false;
                    statsWritten[thread_idx].Set();
                }
#endif
            }

            sw.Stop();

            Console.WriteLine("Thread " + thread_idx + " done; " + reads_done + " reads, " +
                              writes_done + " writes, in " + sw.ElapsedMilliseconds + " ms.");
            Interlocked.Add(ref total_ops_done, reads_done + writes_done);
        }