From a9dc23242c8a8a0084ad22a773b450dcd57f9f3c Mon Sep 17 00:00:00 2001 From: SUTER Frederic Date: Thu, 28 Oct 2021 09:20:34 +0200 Subject: [PATCH] add capacity to set priorities on I/Os + example --- MANIFEST.in | 2 + examples/cpp/CMakeLists.txt | 2 +- examples/cpp/exec-basic/s4u-exec-basic.cpp | 15 +++---- examples/cpp/io-basic/s4u-io-basic.cpp | 50 ++++++++++++++++++++++ examples/cpp/io-basic/s4u-io-basic.tesh | 5 +++ include/simgrid/s4u/Io.hpp | 1 + src/kernel/activity/IoImpl.cpp | 7 +++ src/kernel/activity/IoImpl.hpp | 10 +++-- src/s4u/s4u_Io.cpp | 10 +++++ 9 files changed, 88 insertions(+), 14 deletions(-) create mode 100644 examples/cpp/io-basic/s4u-io-basic.cpp create mode 100644 examples/cpp/io-basic/s4u-io-basic.tesh diff --git a/MANIFEST.in b/MANIFEST.in index 256e15d3ce..d88dde2439 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -260,6 +260,8 @@ include examples/cpp/exec-waitfor/s4u-exec-waitfor.cpp include examples/cpp/exec-waitfor/s4u-exec-waitfor.tesh include examples/cpp/io-async/s4u-io-async.cpp include examples/cpp/io-async/s4u-io-async.tesh +include examples/cpp/io-basic/s4u-io-basic.cpp +include examples/cpp/io-basic/s4u-io-basic.tesh include examples/cpp/io-degradation/s4u-io-degradation.cpp include examples/cpp/io-degradation/s4u-io-degradation.tesh include examples/cpp/io-dependent/s4u-io-dependent.cpp diff --git a/examples/cpp/CMakeLists.txt b/examples/cpp/CMakeLists.txt index 138ec4a4d6..c111550f75 100644 --- a/examples/cpp/CMakeLists.txt +++ b/examples/cpp/CMakeLists.txt @@ -74,7 +74,7 @@ foreach (example actor-create actor-daemon actor-exiting actor-join actor-kill maestro-set mc-bugged1 mc-bugged2 mc-electric-fence mc-failing-assert network-wifi - io-async io-degradation io-file-system io-file-remote io-disk-raw io-dependent + io-async io-basic io-degradation io-file-system io-file-remote io-disk-raw io-dependent platform-failures platform-profile platform-properties plugin-host-load plugin-link-load plugin-prodcons replay-comm replay-io diff --git a/examples/cpp/exec-basic/s4u-exec-basic.cpp b/examples/cpp/exec-basic/s4u-exec-basic.cpp index aadaacefce..2e053e3803 100644 --- a/examples/cpp/exec-basic/s4u-exec-basic.cpp +++ b/examples/cpp/exec-basic/s4u-exec-basic.cpp @@ -19,26 +19,23 @@ static void executor() static void privileged() { - /* This version of this_actor::execute() specifies that this execution - * gets a larger share of the resource. + /* This version of this_actor::execute() specifies that this execution gets a larger share of the resource. * * Since the priority is 2, it computes twice as fast as a regular one. * - * So instead of a half/half sharing between the two executions, - * we get a 1/3 vs 2/3 sharing. */ + * So instead of a half/half sharing between the two executions, we get a 1/3 vs 2/3 sharing. */ simgrid::s4u::this_actor::execute(98095, 2); XBT_INFO("Done."); - /* Note that the timings printed when executing this example are a bit misleading, - * because the uneven sharing only last until the privileged actor ends. - * After this point, the unprivileged one gets 100% of the CPU and finishes - * quite quickly. */ + /* Note that the timings printed when running this example are a bit misleading, because the uneven sharing only last + * until the privileged actor ends. After this point, the unprivileged one gets 100% of the CPU and finishes quite + * quickly. */ } int main(int argc, char* argv[]) { simgrid::s4u::Engine e(&argc, argv); - xbt_assert(argc > 1, "Usage: %s platform_file\n\tExample: %s ../platforms/small_platform.xml\n", argv[0], argv[0]); + xbt_assert(argc > 1, "Usage: %s platform_file\n\tExample: %s platform.xml\n", argv[0], argv[0]); e.load_platform(argv[1]); diff --git a/examples/cpp/io-basic/s4u-io-basic.cpp b/examples/cpp/io-basic/s4u-io-basic.cpp new file mode 100644 index 0000000000..0cb9dba25f --- /dev/null +++ b/examples/cpp/io-basic/s4u-io-basic.cpp @@ -0,0 +1,50 @@ +/* Copyright (c) 2010-2021. The SimGrid Team. All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "simgrid/s4u.hpp" + +XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example"); + +static void writer() +{ + /* - Retrieve all disks from current host */ + std::vector const& disk_list = simgrid::s4u::Host::current()->get_disks(); + /* - Write 400,000 bytes on Disk1 */ + disk_list.front()->write(4000000); + XBT_INFO("Done."); +} + +static void privileged_writer() +{ + /* - Retrieve all disks from current host */ + std::vector const& disk_list = simgrid::s4u::Host::current()->get_disks(); + + /* - Write 400,000 bytes on Disk1 but specifies that this I/O operation gets a larger share of the resource. + * + * Since the priority is 2, it writes twice as fast as a regular one. + * + * So instead of a half/half sharing between the two, we get a 1/3 vs. 2/3 sharing. */ + disk_list.front()->io_init(4000000, simgrid::s4u::Io::OpType::WRITE)->set_priority(2)->wait(); + XBT_INFO("Done."); + + /* Note that the timings printed when running this example are a bit misleading, because the uneven sharing only last + * until the privileged actor ends. After this point, the unprivileged one gets 100% of the CPU and finishes quite + * quickly. */ +} + +int main(int argc, char* argv[]) +{ + simgrid::s4u::Engine e(&argc, argv); + xbt_assert(argc > 1, "Usage: %s platform_file\n\tExample: %s platform.xml\n", argv[0], argv[0]); + + e.load_platform(argv[1]); + + simgrid::s4u::Actor::create("writer", e.host_by_name("bob"), writer); + simgrid::s4u::Actor::create("privileged_writer", e.host_by_name("bob"), privileged_writer); + + e.run(); + + return 0; +} diff --git a/examples/cpp/io-basic/s4u-io-basic.tesh b/examples/cpp/io-basic/s4u-io-basic.tesh new file mode 100644 index 0000000000..4fd0f1cdd4 --- /dev/null +++ b/examples/cpp/io-basic/s4u-io-basic.tesh @@ -0,0 +1,5 @@ +#!/usr/bin/env tesh + +$ ${bindir:=.}/s4u-io-basic ${platfdir}/hosts_with_disks.xml +> [bob:privileged_writer:(2) 0.150000] [s4u_test/INFO] Done. +> [bob:writer:(1) 0.200000] [s4u_test/INFO] Done. diff --git a/include/simgrid/s4u/Io.hpp b/include/simgrid/s4u/Io.hpp index 1e7825bddd..14abc92604 100644 --- a/include/simgrid/s4u/Io.hpp +++ b/include/simgrid/s4u/Io.hpp @@ -46,6 +46,7 @@ public: double get_remaining() const override; sg_size_t get_performed_ioops() const; IoPtr set_disk(const_sg_disk_t disk); + IoPtr set_priority(double priority); IoPtr set_size(sg_size_t size); IoPtr set_op_type(OpType type); diff --git a/src/kernel/activity/IoImpl.cpp b/src/kernel/activity/IoImpl.cpp index cb274dcdb6..a714e97b62 100644 --- a/src/kernel/activity/IoImpl.cpp +++ b/src/kernel/activity/IoImpl.cpp @@ -28,6 +28,12 @@ IoImpl::IoImpl() piface_ = new s4u::Io(this); } +IoImpl& IoImpl::set_sharing_penalty(double sharing_penalty) +{ + sharing_penalty_ = sharing_penalty; + return *this; +} + IoImpl& IoImpl::set_timeout(double timeout) { const s4u::Host* host = get_disk()->get_host(); @@ -59,6 +65,7 @@ IoImpl* IoImpl::start() state_ = State::RUNNING; surf_action_ = disk_->get_host()->get_netpoint()->get_englobing_zone()->get_disk_model()->io_start(disk_, size_, type_); + surf_action_->set_sharing_penalty(sharing_penalty_); surf_action_->set_activity(this); XBT_DEBUG("Create IO synchro %p %s", this, get_cname()); diff --git a/src/kernel/activity/IoImpl.hpp b/src/kernel/activity/IoImpl.hpp index 3bd9c7b5cc..2c2ab5b323 100644 --- a/src/kernel/activity/IoImpl.hpp +++ b/src/kernel/activity/IoImpl.hpp @@ -14,10 +14,11 @@ namespace kernel { namespace activity { class XBT_PUBLIC IoImpl : public ActivityImpl_T { - resource::DiskImpl* disk_ = nullptr; - sg_size_t size_ = 0; - s4u::Io::OpType type_ = s4u::Io::OpType::READ; - sg_size_t performed_ioops_ = 0; + resource::DiskImpl* disk_ = nullptr; + double sharing_penalty_ = 1.0; + sg_size_t size_ = 0; + s4u::Io::OpType type_ = s4u::Io::OpType::READ; + sg_size_t performed_ioops_ = 0; resource::Action* timeout_detector_ = nullptr; s4u::Io* piface_; @@ -25,6 +26,7 @@ public: IoImpl(); s4u::Io* get_iface() { return piface_; } + IoImpl& set_sharing_penalty(double sharing_penalty); IoImpl& set_timeout(double timeout) override; IoImpl& set_size(sg_size_t size); IoImpl& set_type(s4u::Io::OpType type); diff --git a/src/s4u/s4u_Io.cpp b/src/s4u/s4u_Io.cpp index f0183d2d34..4906e79a16 100644 --- a/src/s4u/s4u_Io.cpp +++ b/src/s4u/s4u_Io.cpp @@ -78,6 +78,16 @@ IoPtr Io::set_disk(const_sg_disk_t disk) return this; } +IoPtr Io::set_priority(double priority) +{ + xbt_assert(state_ == State::INITED || state_ == State::STARTING, + "Cannot change the priority of an io after its start"); + kernel::actor::simcall([this, priority] { + boost::static_pointer_cast(pimpl_)->set_sharing_penalty(1. / priority); + }); + return this; +} + IoPtr Io::set_size(sg_size_t size) { xbt_assert(state_ == State::INITED || state_ == State::STARTING, "Cannot set size once the Io is started"); -- 2.20.1