diff options
-rwxr-xr-x | scripts/run_client.sh | 2 | ||||
-rw-r--r-- | scripts/thr_hist.py | 24 | ||||
-rw-r--r-- | src/hotstuff_client.cpp | 22 |
3 files changed, 43 insertions, 5 deletions
diff --git a/scripts/run_client.sh b/scripts/run_client.sh index 92d3add..9e7d1db 100755 --- a/scripts/run_client.sh +++ b/scripts/run_client.sh @@ -194,7 +194,7 @@ function start_all { local ip="$(get_ip_by_id $rid)" local pport="$(get_peer_port_by_id $rid)" local cport="$(get_client_port_by_id $rid)" - local rworkdir="$remote_base/$workdir/${i}" + local rworkdir="$remote_base/$workdir/${j}" ( echo "Starting a client @ $cip, connecting to server #$rid @ $ip:$cport" _remote_load "$workdir" "$rworkdir" "$cip" diff --git a/scripts/thr_hist.py b/scripts/thr_hist.py index c5f2a72..b6ef40a 100644 --- a/scripts/thr_hist.py +++ b/scripts/thr_hist.py @@ -1,8 +1,24 @@ import sys import re import argparse +import numpy as np from datetime import datetime, timedelta +def remove_outliers(x, outlierConstant = 1.5): + a = np.array(x) + upper_quartile = np.percentile(a, 75) + lower_quartile = np.percentile(a, 25) + IQR = (upper_quartile - lower_quartile) * outlierConstant + quartileSet = (lower_quartile - IQR, upper_quartile + IQR) + resultList = [] + removedList = [] + for y in a.tolist(): + if y >= quartileSet[0] and y <= quartileSet[1]: + resultList.append(y) + else: + removedList.append(y) + return (resultList, removedList) + def str2datetime(s): parts = s.split('.') dt = datetime.strptime(parts[0], "%Y-%m-%d %H:%M:%S") @@ -29,14 +45,14 @@ if __name__ == '__main__': begin_time = None next_begin_time = None cnt = 0 - lat = 0 + lats = [] timestamps = [] values = [] for line in sys.stdin: m = commit_pat.match(line) if m: timestamps.append(str2datetime(m.group(1))) - lat += float(m.group(2)) + lats.append(float(m.group(2))) timestamps.sort() for timestamp in timestamps: if begin_time and timestamp < next_begin_time: @@ -49,5 +65,7 @@ if __name__ == '__main__': cnt = 1 values.append(cnt) print(values) - print("lat = {:.3f}ms".format(lat / len(timestamps) * 1e3)) + print("lat = {:.3f}ms".format(sum(lats) / len(lats) * 1e3)) + lats, _ = remove_outliers(lats) + print("lat = {:.3f}ms".format(sum(lats) / len(lats) * 1e3)) plot_thr(args.output) diff --git a/src/hotstuff_client.cpp b/src/hotstuff_client.cpp index 62b13ed..31c6c0a 100644 --- a/src/hotstuff_client.cpp +++ b/src/hotstuff_client.cpp @@ -1,5 +1,6 @@ #include <cassert> #include <random> +#include <signal.h> #include "salticidae/type.h" #include "salticidae/netaddr.h" #include "salticidae/network.h" @@ -42,6 +43,7 @@ struct Request { std::unordered_map<ReplicaID, MsgNetwork<opcode_t>::conn_t> conns; std::unordered_map<const uint256_t, Request> waiting; std::vector<NetAddr> replicas; +std::vector<std::pair<struct timeval, double>> elapsed; MsgNetwork<opcode_t> mn(eb, 10, 10, 4096); void set_proposer(ReplicaID rid) { @@ -97,7 +99,10 @@ void client_resp_cmd_handler(MsgRespCmd &&msg, MsgNetwork<opcode_t>::Conn &) { std::string(fin).c_str(), et.elapsed_sec, et.cpu_elapsed_sec); #else - HOTSTUFF_LOG_INFO("%.6f %.6f", et.elapsed_sec, et.cpu_elapsed_sec); + struct timeval tv; + gettimeofday(&tv, nullptr); + elapsed.push_back(std::make_pair(tv, et.elapsed_sec)); + //HOTSTUFF_LOG_INFO("%.6f %.6f", et.elapsed_sec, et.cpu_elapsed_sec); #endif waiting.erase(it); try_send(); @@ -108,8 +113,16 @@ std::pair<std::string, std::string> split_ip_port_cport(const std::string &s) { return std::make_pair(ret[0], ret[1]); } +void signal_handler(int) { + throw HotStuffError("got terminal signal"); +} + int main(int argc, char **argv) { Config config("hotstuff.conf"); + + signal(SIGTERM, signal_handler); + signal(SIGINT, signal_handler); + auto opt_idx = Config::OptValInt::create(0); auto opt_replicas = Config::OptValStrVec::create(); auto opt_max_iter_num = Config::OptValInt::create(100); @@ -152,6 +165,13 @@ int main(int argc, char **argv) { eb.dispatch(); } catch (HotStuffError &e) { HOTSTUFF_LOG_ERROR("exception: %s", std::string(e).c_str()); + for (const auto &e: elapsed) + { + char fmt[64]; + struct tm *tmp = localtime(&e.first.tv_sec); + strftime(fmt, sizeof fmt, "%Y-%m-%d %H:%M:%S.%%06u [hotstuff info] %%.6f\n", tmp); + fprintf(stderr, fmt, e.first.tv_usec, e.second); + } } return 0; } |