1*8542734aSAndroid Build Coastguard Worker /*
2*8542734aSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project
3*8542734aSAndroid Build Coastguard Worker *
4*8542734aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*8542734aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*8542734aSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*8542734aSAndroid Build Coastguard Worker *
8*8542734aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*8542734aSAndroid Build Coastguard Worker *
10*8542734aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*8542734aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*8542734aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8542734aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*8542734aSAndroid Build Coastguard Worker * limitations under the License.
15*8542734aSAndroid Build Coastguard Worker */
16*8542734aSAndroid Build Coastguard Worker
17*8542734aSAndroid Build Coastguard Worker #define LOG_TAG "dns_benchmark"
18*8542734aSAndroid Build Coastguard Worker
19*8542734aSAndroid Build Coastguard Worker /*
20*8542734aSAndroid Build Coastguard Worker * See README.md for general notes.
21*8542734aSAndroid Build Coastguard Worker *
22*8542734aSAndroid Build Coastguard Worker * This set of benchmarks measures the throughput of getaddrinfo() on between 1 and 32 threads for
23*8542734aSAndroid Build Coastguard Worker * the purpose of keeping track of the maximum load that netd can reasonably handle.
24*8542734aSAndroid Build Coastguard Worker *
25*8542734aSAndroid Build Coastguard Worker * Useful measurements
26*8542734aSAndroid Build Coastguard Worker * ===================
27*8542734aSAndroid Build Coastguard Worker *
28*8542734aSAndroid Build Coastguard Worker * - real_time: the average time taken to make a single getaddrinfo lookup on a local DNS resolver
29*8542734aSAndroid Build Coastguard Worker * run by DnsFixture. This will usually be higher on multithreaded tests as threads
30*8542734aSAndroid Build Coastguard Worker * block on DNS lookups and Binder connections.
31*8542734aSAndroid Build Coastguard Worker *
32*8542734aSAndroid Build Coastguard Worker * - iterations: total number of runs finished within the time limit. Higher is better. This is
33*8542734aSAndroid Build Coastguard Worker * roughly proportional to MinTime * nThreads / real_time.
34*8542734aSAndroid Build Coastguard Worker *
35*8542734aSAndroid Build Coastguard Worker */
36*8542734aSAndroid Build Coastguard Worker
37*8542734aSAndroid Build Coastguard Worker #include <netdb.h>
38*8542734aSAndroid Build Coastguard Worker #include <netinet/in.h>
39*8542734aSAndroid Build Coastguard Worker #include <sys/types.h>
40*8542734aSAndroid Build Coastguard Worker #include <sys/socket.h>
41*8542734aSAndroid Build Coastguard Worker
42*8542734aSAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
43*8542734aSAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
44*8542734aSAndroid Build Coastguard Worker
45*8542734aSAndroid Build Coastguard Worker #include "NetdClient.h"
46*8542734aSAndroid Build Coastguard Worker #include "dns_responder_client_ndk.h"
47*8542734aSAndroid Build Coastguard Worker
48*8542734aSAndroid Build Coastguard Worker using android::base::StringPrintf;
49*8542734aSAndroid Build Coastguard Worker
50*8542734aSAndroid Build Coastguard Worker constexpr int MIN_THREADS = 1;
51*8542734aSAndroid Build Coastguard Worker constexpr int MAX_THREADS = 32;
52*8542734aSAndroid Build Coastguard Worker
53*8542734aSAndroid Build Coastguard Worker class DnsFixture : public ::benchmark::Fixture {
54*8542734aSAndroid Build Coastguard Worker protected:
55*8542734aSAndroid Build Coastguard Worker static constexpr unsigned num_hosts = 1000;
56*8542734aSAndroid Build Coastguard Worker DnsResponderClient dns;
57*8542734aSAndroid Build Coastguard Worker std::vector<DnsResponderClient::Mapping> mappings;
58*8542734aSAndroid Build Coastguard Worker std::vector<std::unique_ptr<test::DNSResponder>> mDns;
59*8542734aSAndroid Build Coastguard Worker
60*8542734aSAndroid Build Coastguard Worker public:
SetUp(const::benchmark::State & state)61*8542734aSAndroid Build Coastguard Worker void SetUp(const ::benchmark::State& state) override {
62*8542734aSAndroid Build Coastguard Worker if (state.thread_index() == 0) {
63*8542734aSAndroid Build Coastguard Worker dns.SetUp();
64*8542734aSAndroid Build Coastguard Worker
65*8542734aSAndroid Build Coastguard Worker std::vector<std::string> domains = { "example.com" };
66*8542734aSAndroid Build Coastguard Worker std::vector<std::string> servers;
67*8542734aSAndroid Build Coastguard Worker dns.SetupMappings(num_hosts, domains, &mappings);
68*8542734aSAndroid Build Coastguard Worker dns.SetupDNSServers(MAXNS, mappings, &mDns, &servers);
69*8542734aSAndroid Build Coastguard Worker dns.SetResolversFromParcel(ResolverParams::Builder()
70*8542734aSAndroid Build Coastguard Worker .setDnsServers(servers)
71*8542734aSAndroid Build Coastguard Worker .setDotServers({})
72*8542734aSAndroid Build Coastguard Worker .setDomains(domains)
73*8542734aSAndroid Build Coastguard Worker .build());
74*8542734aSAndroid Build Coastguard Worker }
75*8542734aSAndroid Build Coastguard Worker }
76*8542734aSAndroid Build Coastguard Worker
TearDown(const::benchmark::State & state)77*8542734aSAndroid Build Coastguard Worker void TearDown(const ::benchmark::State& state) override {
78*8542734aSAndroid Build Coastguard Worker if (state.thread_index() == 0) {
79*8542734aSAndroid Build Coastguard Worker dns.TearDown();
80*8542734aSAndroid Build Coastguard Worker }
81*8542734aSAndroid Build Coastguard Worker }
82*8542734aSAndroid Build Coastguard Worker
getMappings() const83*8542734aSAndroid Build Coastguard Worker std::vector<DnsResponderClient::Mapping> const& getMappings() const {
84*8542734aSAndroid Build Coastguard Worker return mappings;
85*8542734aSAndroid Build Coastguard Worker }
86*8542734aSAndroid Build Coastguard Worker
benchmark(benchmark::State & state)87*8542734aSAndroid Build Coastguard Worker void benchmark(benchmark::State& state) {
88*8542734aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
89*8542734aSAndroid Build Coastguard Worker const uint32_t ofs = arc4random_uniform(getMappings().size());
90*8542734aSAndroid Build Coastguard Worker const auto& mapping = getMappings()[ofs];
91*8542734aSAndroid Build Coastguard Worker addrinfo* result = nullptr;
92*8542734aSAndroid Build Coastguard Worker if (getaddrinfo(mapping.host.c_str(), nullptr, nullptr, &result)) {
93*8542734aSAndroid Build Coastguard Worker state.SkipWithError(StringPrintf("getaddrinfo failed with errno=%d",
94*8542734aSAndroid Build Coastguard Worker errno).c_str());
95*8542734aSAndroid Build Coastguard Worker break;
96*8542734aSAndroid Build Coastguard Worker }
97*8542734aSAndroid Build Coastguard Worker if (result) {
98*8542734aSAndroid Build Coastguard Worker freeaddrinfo(result);
99*8542734aSAndroid Build Coastguard Worker result = nullptr;
100*8542734aSAndroid Build Coastguard Worker }
101*8542734aSAndroid Build Coastguard Worker }
102*8542734aSAndroid Build Coastguard Worker }
103*8542734aSAndroid Build Coastguard Worker };
104*8542734aSAndroid Build Coastguard Worker
BENCHMARK_DEFINE_F(DnsFixture,getaddrinfo)105*8542734aSAndroid Build Coastguard Worker BENCHMARK_DEFINE_F(DnsFixture, getaddrinfo)(benchmark::State& state) {
106*8542734aSAndroid Build Coastguard Worker benchmark(state);
107*8542734aSAndroid Build Coastguard Worker }
108*8542734aSAndroid Build Coastguard Worker BENCHMARK_REGISTER_F(DnsFixture, getaddrinfo)
109*8542734aSAndroid Build Coastguard Worker ->ThreadRange(MIN_THREADS, MAX_THREADS)
110*8542734aSAndroid Build Coastguard Worker ->UseRealTime();
111