|
19 | 19 | * Copyright (C) 2018 ScyllaDB Ltd. |
20 | 20 | */ |
21 | 21 |
|
| 22 | +#include <random> |
22 | 23 | #include <boost/range.hpp> |
23 | 24 | #include <boost/range/irange.hpp> |
24 | 25 |
|
25 | 26 | #include <seastar/testing/perf_tests.hh> |
| 27 | +#include <seastar/testing/random.hh> |
26 | 28 | #include <seastar/core/coroutine.hh> |
27 | 29 | #include <seastar/coroutine/as_future.hh> |
28 | 30 | #include <seastar/coroutine/parallel_for_each.hh> |
@@ -499,6 +501,57 @@ struct sched { |
499 | 501 |
|
500 | 502 | task* waiting_task() noexcept override { return nullptr; } |
501 | 503 | }; |
| 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 | + } |
502 | 555 | }; |
503 | 556 |
|
504 | 557 | PERF_TEST_CN(sched, context_switch) |
@@ -555,3 +608,18 @@ PERF_TEST_CN(sched, context_switch_x1_5) |
555 | 608 | perf_tests::stop_measuring_time(); |
556 | 609 | co_return 1000; |
557 | 610 | } |
| 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