blob: 7cfd5a5603f81742228b21bf4f36c5945e67ace5 [file] [log] [blame]
Robin Lee2cf56172016-09-13 18:55:42 +09001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "dns_benchmark"
18
19#include <netdb.h>
20#include <netinet/in.h>
21#include <sys/types.h>
22#include <sys/socket.h>
23
24#include <android-base/stringprintf.h>
25#include <benchmark/benchmark.h>
26#include <utils/String16.h>
27#include <utils/StrongPointer.h>
28
29#include "dns_responder_client.h"
30#include "NetdClient.h"
Michal Karpinskid46aa712016-10-13 10:04:36 +010031#include "android/net/metrics/INetdEventListener.h"
Robin Lee2cf56172016-09-13 18:55:42 +090032
33using android::base::StringPrintf;
Michal Karpinskid46aa712016-10-13 10:04:36 +010034using android::net::metrics::INetdEventListener;
Robin Lee2cf56172016-09-13 18:55:42 +090035
36constexpr int MIN_THREADS = 1;
37constexpr int MAX_THREADS = 32;
38
39class DnsFixture : public ::benchmark::Fixture {
40protected:
41 static constexpr unsigned num_hosts = 1000;
42 DnsResponderClient dns;
43 std::vector<DnsResponderClient::Mapping> mappings;
44 std::vector<std::unique_ptr<test::DNSResponder>> mDns;
45
46public:
47 void SetUp(const ::benchmark::State& state) override {
48 if (state.thread_index == 0) {
49 dns.SetUp();
50
51 std::vector<std::string> domains = { "example.com" };
52 std::vector<std::string> servers;
53 dns.SetupMappings(num_hosts, domains, &mappings);
54
55 dns.SetupDNSServers(MAXNS, mappings, &mDns, &servers);
56
57 const std::vector<int> mDefaultParams_Binder = { 300, 25, 8, 8 };
58 dns.SetResolversForNetwork(servers, domains, mDefaultParams_Binder);
59 }
60 }
61
62 void TearDown(const ::benchmark::State& state) override {
63 if (state.thread_index == 0) {
64 dns.ShutdownDNSServers(&mDns);
65 dns.TearDown();
66 }
67 }
68
69 std::vector<DnsResponderClient::Mapping> const& getMappings() const {
70 return mappings;
71 }
72
73 android::sp<android::net::INetd> getNetd() const {
74 return dns.mNetdSrv;
75 }
76
77 void getaddrinfo_until_done(benchmark::State &state) {
78 while (state.KeepRunning()) {
79 const uint32_t ofs = arc4random_uniform(getMappings().size());
80 const auto& mapping = getMappings()[ofs];
81 addrinfo* result = nullptr;
82 if (getaddrinfo(mapping.host.c_str(), nullptr, nullptr, &result)) {
83 state.SkipWithError(StringPrintf("getaddrinfo failed with errno=%d",
84 errno).c_str());
85 break;
86 }
87 if (result) {
88 freeaddrinfo(result);
89 result = nullptr;
90 }
91 }
92 }
93
94 void benchmark_at_reporting_level(benchmark::State &state, int metricsLevel) {
95 const bool isMaster = (state.thread_index == 0);
96 int oldMetricsLevel;
97
98 // SETUP
99 if (isMaster) {
100 auto rv = getNetd()->getMetricsReportingLevel(&oldMetricsLevel);
101 if (!rv.isOk()) {
102 state.SkipWithError(StringPrintf("Failed saving metrics reporting level: %s",
103 rv.toString8().string()).c_str());
104 return;
105 }
106 rv = getNetd()->setMetricsReportingLevel(metricsLevel);
107 if (!rv.isOk()) {
108 state.SkipWithError(StringPrintf("Failed changing metrics reporting: %s",
109 rv.toString8().string()).c_str());
110 return;
111 }
112 }
113
114 // TEST
115 getaddrinfo_until_done(state);
116
117 // TEARDOWN
118 if (isMaster) {
119 auto rv = getNetd()->setMetricsReportingLevel(oldMetricsLevel);
120 if (!rv.isOk()) {
121 state.SkipWithError(StringPrintf("Failed restoring metrics reporting level: %s",
122 rv.toString8().string()).c_str());
123 return;
124 }
125 }
126 }
127};
128
129// DNS calls without any metrics logged or sent.
130BENCHMARK_DEFINE_F(DnsFixture, getaddrinfo_log_nothing)(benchmark::State& state) {
Michal Karpinskid46aa712016-10-13 10:04:36 +0100131 benchmark_at_reporting_level(state, INetdEventListener::REPORTING_LEVEL_NONE);
Robin Lee2cf56172016-09-13 18:55:42 +0900132}
133BENCHMARK_REGISTER_F(DnsFixture, getaddrinfo_log_nothing)
134 ->ThreadRange(MIN_THREADS, MAX_THREADS)
135 ->UseRealTime();
136
137// DNS calls with metrics only (netId, latency, return code) sent to the system server.
138BENCHMARK_DEFINE_F(DnsFixture, getaddrinfo_log_metrics)(benchmark::State& state) {
Michal Karpinskid46aa712016-10-13 10:04:36 +0100139 benchmark_at_reporting_level(state, INetdEventListener::REPORTING_LEVEL_METRICS);
Robin Lee2cf56172016-09-13 18:55:42 +0900140}
141BENCHMARK_REGISTER_F(DnsFixture, getaddrinfo_log_metrics)
142 ->ThreadRange(MIN_THREADS, MAX_THREADS)
143 ->UseRealTime();
144
145// DNS calls with all information logged and sent to the system server.
146BENCHMARK_DEFINE_F(DnsFixture, getaddrinfo_log_everything)(benchmark::State& state) {
Michal Karpinskid46aa712016-10-13 10:04:36 +0100147 benchmark_at_reporting_level(state, INetdEventListener::REPORTING_LEVEL_FULL);
Robin Lee2cf56172016-09-13 18:55:42 +0900148}
149BENCHMARK_REGISTER_F(DnsFixture, getaddrinfo_log_everything)
150 ->ThreadRange(MIN_THREADS, MAX_THREADS)
151 ->UseRealTime();