xref: /aosp_15_r20/system/netd/tests/benchmarks/dns_benchmark.cpp (revision 8542734a0dd1db395a4d42aae09c37f3c3c3e7a1)
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