2 * Copyright (C) 2016 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #define LOG_TAG "dns_benchmark"
20 #include <netinet/in.h>
21 #include <sys/types.h>
22 #include <sys/socket.h>
24 #include <android-base/stringprintf.h>
25 #include <benchmark/benchmark.h>
26 #include <utils/String16.h>
27 #include <utils/StrongPointer.h>
29 #include "dns_responder_client.h"
30 #include "NetdClient.h"
32 using android::base::StringPrintf;
34 constexpr int MIN_THREADS = 1;
35 constexpr int MAX_THREADS = 32;
37 class DnsFixture : public ::benchmark::Fixture {
39 static constexpr unsigned num_hosts = 1000;
40 DnsResponderClient dns;
41 std::vector<DnsResponderClient::Mapping> mappings;
42 std::vector<std::unique_ptr<test::DNSResponder>> mDns;
45 void SetUp(const ::benchmark::State& state) override {
46 if (state.thread_index == 0) {
49 std::vector<std::string> domains = { "example.com" };
50 std::vector<std::string> servers;
51 dns.SetupMappings(num_hosts, domains, &mappings);
53 dns.SetupDNSServers(MAXNS, mappings, &mDns, &servers);
55 const std::vector<int> mDefaultParams_Binder = { 300, 25, 8, 8 };
56 dns.SetResolversForNetwork(servers, domains, mDefaultParams_Binder);
60 void TearDown(const ::benchmark::State& state) override {
61 if (state.thread_index == 0) {
62 dns.ShutdownDNSServers(&mDns);
67 std::vector<DnsResponderClient::Mapping> const& getMappings() const {
71 android::sp<android::net::INetd> getNetd() const {
75 void getaddrinfo_until_done(benchmark::State &state) {
76 while (state.KeepRunning()) {
77 const uint32_t ofs = arc4random_uniform(getMappings().size());
78 const auto& mapping = getMappings()[ofs];
79 addrinfo* result = nullptr;
80 if (getaddrinfo(mapping.host.c_str(), nullptr, nullptr, &result)) {
81 state.SkipWithError(StringPrintf("getaddrinfo failed with errno=%d",
92 void benchmark_at_reporting_level(benchmark::State &state, int metricsLevel) {
93 const bool isMaster = (state.thread_index == 0);
98 auto rv = getNetd()->getMetricsReportingLevel(&oldMetricsLevel);
100 state.SkipWithError(StringPrintf("Failed saving metrics reporting level: %s",
101 rv.toString8().string()).c_str());
104 rv = getNetd()->setMetricsReportingLevel(metricsLevel);
106 state.SkipWithError(StringPrintf("Failed changing metrics reporting: %s",
107 rv.toString8().string()).c_str());
113 getaddrinfo_until_done(state);
117 auto rv = getNetd()->setMetricsReportingLevel(oldMetricsLevel);
119 state.SkipWithError(StringPrintf("Failed restoring metrics reporting level: %s",
120 rv.toString8().string()).c_str());
127 // DNS calls without any metrics logged or sent.
128 BENCHMARK_DEFINE_F(DnsFixture, getaddrinfo_log_nothing)(benchmark::State& state) {
129 benchmark_at_reporting_level(state, 0);
131 BENCHMARK_REGISTER_F(DnsFixture, getaddrinfo_log_nothing)
132 ->ThreadRange(MIN_THREADS, MAX_THREADS)
135 // DNS calls with metrics only (netId, latency, return code) sent to the system server.
136 BENCHMARK_DEFINE_F(DnsFixture, getaddrinfo_log_metrics)(benchmark::State& state) {
137 benchmark_at_reporting_level(state, 1);
139 BENCHMARK_REGISTER_F(DnsFixture, getaddrinfo_log_metrics)
140 ->ThreadRange(MIN_THREADS, MAX_THREADS)
143 // DNS calls with all information logged and sent to the system server.
144 BENCHMARK_DEFINE_F(DnsFixture, getaddrinfo_log_everything)(benchmark::State& state) {
145 benchmark_at_reporting_level(state, 2);
147 BENCHMARK_REGISTER_F(DnsFixture, getaddrinfo_log_everything)
148 ->ThreadRange(MIN_THREADS, MAX_THREADS)