Skip to content

Commit bf9f5b9

Browse files
committed
test,perf: Measure time it takes to traverse a runqueue
Add a test that populates run-queue with the given number of tasks (100 by default) and measures the time it takes for the scheduler to process one. No allocations/frees happen measure-time, tasks are pre-populated. Signed-off-by: Pavel Emelyanov <xemul@scylladb.com>
1 parent 0988b05 commit bf9f5b9

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

tests/perf/future_util_perf.cc

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
* Copyright (C) 2018 ScyllaDB Ltd.
2020
*/
2121

22+
#include <random>
2223
#include <boost/range.hpp>
2324
#include <boost/range/irange.hpp>
2425

2526
#include <seastar/testing/perf_tests.hh>
27+
#include <seastar/testing/random.hh>
2628
#include <seastar/core/coroutine.hh>
2729
#include <seastar/coroutine/as_future.hh>
2830
#include <seastar/coroutine/parallel_for_each.hh>
@@ -499,6 +501,57 @@ struct sched {
499501

500502
task* waiting_task() noexcept override { return nullptr; }
501503
};
504+
505+
class noop_task final : public seastar::task {
506+
public:
507+
noop_task(scheduling_group sg) noexcept : task(sg) {}
508+
virtual void run_and_dispose() noexcept override { }
509+
virtual task* waiting_task() noexcept override { return nullptr; }
510+
};
511+
512+
class completion_task final : public seastar::task {
513+
std::optional<promise<>> _done;
514+
public:
515+
completion_task(scheduling_group sg) noexcept : task(sg) {}
516+
virtual void run_and_dispose() noexcept override {
517+
_done->set_value();
518+
_done.reset();
519+
}
520+
virtual task* waiting_task() noexcept override { return nullptr; }
521+
522+
void activate() {
523+
_done.emplace();
524+
seastar::schedule(this);
525+
}
526+
527+
future<> get_future() {
528+
return _done->get_future();
529+
}
530+
};
531+
532+
unsigned int nr_tasks = 100;
533+
std::vector<std::unique_ptr<noop_task>> tasks;
534+
std::unique_ptr<completion_task> comp;
535+
536+
void prepare_tasks(scheduling_group sg) {
537+
if (auto p = perf_tests::get_parameter("nr_tasks"); p != "") {
538+
nr_tasks = std::atoi(p.c_str());
539+
}
540+
541+
tasks.reserve(nr_tasks);
542+
for (size_t i = 0; i < nr_tasks; i++) {
543+
tasks.push_back(std::make_unique<noop_task>(sg));
544+
}
545+
std::shuffle(tasks.begin(), tasks.end(), seastar::testing::local_random_engine);
546+
comp = std::make_unique<completion_task>(sg);
547+
}
548+
549+
void activate_tasks() {
550+
for (auto& t : tasks) {
551+
seastar::schedule(t.get());
552+
}
553+
comp->activate();
554+
}
502555
};
503556

504557
PERF_TEST_CN(sched, context_switch)
@@ -555,3 +608,18 @@ PERF_TEST_CN(sched, context_switch_x1_5)
555608
perf_tests::stop_measuring_time();
556609
co_return 1000;
557610
}
611+
612+
PERF_TEST_CN(sched, scan_runqueue)
613+
{
614+
if (!once) {
615+
g1 = co_await create_scheduling_group("scan", 10);
616+
prepare_tasks(g1);
617+
once = true;
618+
}
619+
620+
activate_tasks();
621+
perf_tests::start_measuring_time();
622+
co_await comp->get_future();
623+
perf_tests::stop_measuring_time();
624+
co_return nr_tasks;
625+
}

0 commit comments

Comments
 (0)