From 25c18b4fc563fa9db9ba0e20faaa4547545e2316 Mon Sep 17 00:00:00 2001 From: quackerd Date: Sun, 5 Mar 2023 16:48:54 +0100 Subject: [PATCH] stdin based pct control --- util/memloadgen.cc | 74 ++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/util/memloadgen.cc b/util/memloadgen.cc index ad53f7b..80765ad 100644 --- a/util/memloadgen.cc +++ b/util/memloadgen.cc @@ -1,4 +1,5 @@ #include +#include #include #include "gen.hh" #include @@ -23,7 +24,6 @@ usage() " -v: verbose mode\n" " -b: buffer size\n" " -q: bytes per second\n" - " -p: target throughput percentage (triggered by SIGUSR1)\n" " -d: destination domain index\n" " -s: worker threads cpu list\n" " -S: enable shared buffer\n" @@ -35,16 +35,8 @@ usage() " -M: print this string when threads are ready to run\n"); fflush(stdout); } -static std::atomic rate_control {0}; -static char output_file[256] = "memloadgen_samples.txt"; -void sig_handler(int sig) -{ - if (sig == SIGUSR1 && rate_control.load(std::memory_order_relaxed) == 0) { - rate_control.store(1, std::memory_order_relaxed); - ntr(NTR_DEP_USER1, NTR_LEVEL_INFO, "enabling rate control....\n"); - } -} +static char output_file[256] = "memloadgen_samples.txt"; int main(int argc, char * argv[]) { @@ -56,7 +48,6 @@ int main(int argc, char * argv[]) uint64_t bps = 0; uint64_t transaction_size = arr_sz; cpuset_t threads; - uint32_t pct = 0; char magic[256] = {0}; CPU_ZERO(&threads); CPU_SET(0, &threads); @@ -65,13 +56,14 @@ int main(int argc, char * argv[]) std::list history; int shared_buffer = 0; + int rate_ctrl = 0; cpuset_t domain_mask; CPU_ZERO(&domain_mask); CPU_SET(0, &domain_mask); { int c; // parse arguments - while ((c = getopt(argc, argv, "vhb:d:s:So:T:t:q:i:p:H:M:")) != -1) { + while ((c = getopt(argc, argv, "vhb:d:s:So:T:t:q:i:H:M:")) != -1) { switch (c) { case 'v': ntr_set_level(NTR_DEP_USER1, ntr_get_level(NTR_DEP_USER1) + 1); @@ -106,9 +98,6 @@ int main(int argc, char * argv[]) case 'i': strncpy(ia_dist, optarg, sizeof(ia_dist)); break; - case 'p': - pct = strtoul(optarg, nullptr, 10); - break; case 'H': history_sz = strtol(optarg, nullptr, 10); break; @@ -127,7 +116,6 @@ int main(int argc, char * argv[]) " num threads: %d\n" " target domain: %ld\n" " bytes per second: %lu\n" - " percentage: %d%%\n" " interarrival distribution: %s\n" " shared buffer: %d\n" " transaction time: %lu\n" @@ -136,7 +124,7 @@ int main(int argc, char * argv[]) " magic: %s\n", arr_sz, CPU_COUNT(&threads), CPU_FFS(&domain_mask) - 1, bps, - pct, ia_dist, shared_buffer, + ia_dist, shared_buffer, transaction_size,time, history_sz, magic); // init topo @@ -150,10 +138,7 @@ int main(int argc, char * argv[]) fprintf(stderr, "libnms init failed!\n"); exit(1); } - if (signal(SIGUSR1, sig_handler) == SIG_ERR) { - fprintf(stderr, "signal() failed %d!\n", errno); - exit(1); - } + bool success = false; memload_generator::memload_generator_options opts; opts.buffer_size = arr_sz; @@ -175,6 +160,11 @@ int main(int argc, char * argv[]) exit(1); } + struct timeval stval; + stval.tv_sec = 0; + stval.tv_usec = 0; + char pct_line[64] = {0}; + uint64_t prev_ts = topo_uptime_ns(); uint64_t prev_trans = mgen->get_transactions(); uint32_t cur_time = 0; @@ -191,18 +181,30 @@ int main(int argc, char * argv[]) prev_trans = trans; cur_time++; - int rc = rate_control.load(std::memory_order_relaxed); - switch(rc) { - case 0: - case 1: - // keep history - history.emplace_back(bps); - if ((int)history.size() > history_sz) { - history.pop_front(); - } + if (rate_ctrl == 0) { + // keep history + history.emplace_back(bps); + if ((int)history.size() > history_sz) { + history.pop_front(); + } - if (rc == 1) { - rate_control.store(2, std::memory_order_relaxed); + fd_set fdset; + FD_ZERO(&fdset); + FD_SET(STDIN_FILENO, &fdset); + int ret = select(1, &fdset, NULL, NULL, &stval); + if (ret < 0) { + if (errno != EINTR) { + fprintf(stderr, "select() failed with %d\n", errno); + exit(1); + } + } else if (ret > 0) { + if (FD_ISSET(STDIN_FILENO, &fdset)) { + ret = read(STDIN_FILENO, pct_line, sizeof(pct_line) - 1); + if (ret < 0) { + fprintf(stderr, "read() failed with %d\n", errno); + exit(1); + } + unsigned int pct = strtoul(pct_line, NULL, 10); uint64_t sum = 0; size_t sz = history.size(); while (history.size() > 0) { @@ -212,11 +214,11 @@ int main(int argc, char * argv[]) uint64_t newbps = ((sum / sz) * (double)pct / 100.0); mgen->set_transactions(newbps / transaction_size); - ntr(NTR_DEP_USER1, NTR_LEVEL_INFO, "adjusted target bps = %ld ~= %ldM\n", newbps, newbps / 1024 / 1024); + ntr(NTR_DEP_USER1, NTR_LEVEL_INFO, "adjusted target bps to %u%% = %ldB ~= %ldM\n", pct, newbps, newbps / 1024 / 1024); + + rate_ctrl = 1; } - break; - default: - break; + } } } mgen->stop();