("maximum-qps", po::value<uint32_t>(), "Stop incrementing once this rate has been reached, to provide a stable load")
("minimum-success-rate", po::value<double>()->default_value(0), "Stop the test as soon as the success rate drops below this value, in percent")
("plot-file", po::value<string>(), "Write results to the specific file")
+ ("quiet", "Whether to run quietly, outputting only the maximum QPS reached. This option is mostly useful when used with --minimum-success-rate")
("want-recursion", "Set the Recursion Desired flag on queries");
po::options_description alloptions;
po::options_description hidden("hidden options");
}
bool wantRecursion = g_vm.count("want-recursion");
+ bool beQuiet = g_vm.count("quiet");
bool useECSFromFile = g_vm.count("ecs-from-file");
double hitrate = g_vm["hitrate"].as<double>();
return EXIT_FAILURE;
}
- cout<<"Adding ECS option to outgoing queries with random addresses from the "<<ecsRange.toString()<<" range"<<endl;
+ if (!beQuiet) {
+ cout<<"Adding ECS option to outgoing queries with random addresses from the "<<ecsRange.toString()<<" range"<<endl;
+ }
}
}
catch (const NetmaskException& e) {
unknown.emplace_back(std::make_shared<vector<uint8_t>>(packet));
}
random_shuffle(unknown.begin(), unknown.end());
- cout<<"Generated "<<unknown.size()<<" ready to use queries"<<endl;
+ if (!beQuiet) {
+ cout<<"Generated "<<unknown.size()<<" ready to use queries"<<endl;
+ }
vector<Socket*> sockets;
ComboAddress dest;
for(qps=qpsstart;;) {
double seconds=1;
- cout<<"Aiming at "<<qps<< "qps (RD="<<wantRecursion<<") for "<<seconds<<" seconds at cache hitrate "<<100.0*hitrate<<"%";
+ if (!beQuiet) {
+ cout<<"Aiming at "<<qps<< "qps (RD="<<wantRecursion<<") for "<<seconds<<" seconds at cache hitrate "<<100.0*hitrate<<"%";
+ }
unsigned int misses=(1-hitrate)*qps*seconds;
unsigned int total=qps*seconds;
if (misses == 0) {
misses = 1;
}
- cout<<", need "<<misses<<" misses, "<<total<<" queries, have "<<unknown.size()<<" unknown left!"<<endl;
+ if (!beQuiet) {
+ cout<<", need "<<misses<<" misses, "<<total<<" queries, have "<<unknown.size()<<" unknown left!"<<endl;
+ }
if (misses > unknown.size()) {
cerr<<"Not enough queries remaining (need at least "<<misses<<" and got "<<unknown.size()<<", please add more to the query file), exiting."<<endl;
const auto udiff = dt.udiffNoReset();
const auto realqps=toSend.size()/(udiff/1000000.0);
- cout<<"Achieved "<<realqps<<" qps over "<< udiff/1000000.0<<" seconds"<<endl;
+ if (!beQuiet) {
+ cout<<"Achieved "<<realqps<<" qps over "<< udiff/1000000.0<<" seconds"<<endl;
+ }
usleep(50000);
const auto received = g_recvcounter.load();
const auto udiffReceived = dt.udiff();
const auto realReceivedQPS = received/(udiffReceived/1000000.0);
double perc=received*100.0/toSend.size();
- cout<<"Received "<<received<<" packets over "<< udiffReceived/1000000.0<<" seconds ("<<perc<<"%, adjusted received rate "<<realReceivedQPS<<" qps)"<<endl;
+ if (!beQuiet) {
+ cout<<"Received "<<received<<" packets over "<< udiffReceived/1000000.0<<" seconds ("<<perc<<"%, adjusted received rate "<<realReceivedQPS<<" qps)"<<endl;
+ }
if (plot) {
plot<<qps<<" "<<realqps<<" "<<perc<<" "<<received/(udiff/1000000.0)<<" " << 8*g_recvbytes.load()/(udiff/1000000.0)<<endl;
}
if (minimumSuccessRate > 0.0 && perc < minimumSuccessRate) {
- cout<<"The latest success rate ("<<perc<<") dropped below the minimum success rate of "<<minimumSuccessRate<<", stopping."<<endl;
- cout<<"The final rate reached before failing was "<<bestQPS<<" qps (best rate at 100% was "<<bestPerfectQPS<<" qps)"<<endl;
+ if (beQuiet) {
+ cout<<bestQPS<<endl;
+ }
+ else {
+ cout<<"The latest success rate ("<<perc<<") dropped below the minimum success rate of "<<minimumSuccessRate<<", stopping."<<endl;
+ cout<<"The final rate reached before failing was "<<bestQPS<<" qps (best rate at 100% was "<<bestPerfectQPS<<" qps)"<<endl;
+ }
break;
}