Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
bench
peer_eviction.cpp
Go to the documentation of this file.
1
// Copyright (c) 2021-present The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5
#include <
bench/bench.h
>
6
#include <
netaddress.h
>
7
#include <
node/eviction.h
>
8
#include <random.h>
9
#include <
test/util/net.h
>
10
11
#include <chrono>
12
#include <functional>
13
#include <vector>
14
15
static
void
EvictionProtectionCommon
(
16
benchmark::Bench
& bench,
17
int
num_candidates,
18
std::function<
void
(
NodeEvictionCandidate
&)> candidate_setup_fn)
19
{
20
using
Candidates = std::vector<NodeEvictionCandidate>;
21
FastRandomContext
random_context{
true
};
22
23
Candidates candidates{
GetRandomNodeEvictionCandidates
(num_candidates, random_context)};
24
for
(
auto
& c : candidates) {
25
candidate_setup_fn(c);
26
}
27
28
29
bench.
run
([&] {
30
// creating a copy has an overhead of about 3%, so it does not influence the benchmark results much.
31
auto
copy = candidates;
32
ProtectEvictionCandidatesByRatio
(copy);
33
});
34
}
35
36
/* Benchmarks */
37
38
static
void
EvictionProtection0Networks250Candidates
(
benchmark::Bench
& bench)
39
{
40
EvictionProtectionCommon
(
41
bench,
42
/*num_candidates=*/
250,
43
[](
NodeEvictionCandidate
& c) {
44
c.
m_connected
= std::chrono::seconds{c.
id
};
45
c.
m_network
=
NET_IPV4
;
46
});
47
}
48
49
static
void
EvictionProtection1Networks250Candidates
(
benchmark::Bench
& bench)
50
{
51
EvictionProtectionCommon
(
52
bench,
53
/*num_candidates=*/
250,
54
[](
NodeEvictionCandidate
& c) {
55
c.
m_connected
= std::chrono::seconds{c.
id
};
56
c.
m_is_local
=
false
;
57
if
(c.
id
>= 130 && c.
id
< 240) {
// 110 Tor
58
c.
m_network
=
NET_ONION
;
59
}
else
{
60
c.
m_network
=
NET_IPV4
;
61
}
62
});
63
}
64
65
static
void
EvictionProtection2Networks250Candidates
(
benchmark::Bench
& bench)
66
{
67
EvictionProtectionCommon
(
68
bench,
69
/*num_candidates=*/
250,
70
[](
NodeEvictionCandidate
& c) {
71
c.
m_connected
= std::chrono::seconds{c.
id
};
72
c.
m_is_local
=
false
;
73
if
(c.
id
>= 90 && c.
id
< 160) {
// 70 Tor
74
c.
m_network
=
NET_ONION
;
75
}
else
if
(c.
id
>= 170 && c.
id
< 250) {
// 80 I2P
76
c.
m_network
=
NET_I2P
;
77
}
else
{
78
c.
m_network
=
NET_IPV4
;
79
}
80
});
81
}
82
83
static
void
EvictionProtection3Networks050Candidates
(
benchmark::Bench
& bench)
84
{
85
EvictionProtectionCommon
(
86
bench,
87
/*num_candidates=*/
50,
88
[](
NodeEvictionCandidate
& c) {
89
c.
m_connected
= std::chrono::seconds{c.
id
};
90
c.
m_is_local
= (c.
id
== 28 || c.
id
== 47);
// 2 localhost
91
if
(c.
id
>= 30 && c.
id
< 47) {
// 17 I2P
92
c.
m_network
=
NET_I2P
;
93
}
else
if
(c.
id
>= 24 && c.
id
< 28) {
// 4 Tor
94
c.
m_network
=
NET_ONION
;
95
}
else
{
96
c.
m_network
=
NET_IPV4
;
97
}
98
});
99
}
100
101
static
void
EvictionProtection3Networks100Candidates
(
benchmark::Bench
& bench)
102
{
103
EvictionProtectionCommon
(
104
bench,
105
/*num_candidates=*/
100,
106
[](
NodeEvictionCandidate
& c) {
107
c.
m_connected
= std::chrono::seconds{c.
id
};
108
c.
m_is_local
= (c.
id
>= 55 && c.
id
< 60);
// 5 localhost
109
if
(c.
id
>= 70 && c.
id
< 80) {
// 10 I2P
110
c.
m_network
=
NET_I2P
;
111
}
else
if
(c.
id
>= 80 && c.
id
< 96) {
// 16 Tor
112
c.
m_network
=
NET_ONION
;
113
}
else
{
114
c.
m_network
=
NET_IPV4
;
115
}
116
});
117
}
118
119
static
void
EvictionProtection3Networks250Candidates
(
benchmark::Bench
& bench)
120
{
121
EvictionProtectionCommon
(
122
bench,
123
/*num_candidates=*/
250,
124
[](
NodeEvictionCandidate
& c) {
125
c.
m_connected
= std::chrono::seconds{c.
id
};
126
c.
m_is_local
= (c.
id
>= 140 && c.
id
< 160);
// 20 localhost
127
if
(c.
id
>= 170 && c.
id
< 180) {
// 10 I2P
128
c.
m_network
=
NET_I2P
;
129
}
else
if
(c.
id
>= 190 && c.
id
< 240) {
// 50 Tor
130
c.
m_network
=
NET_ONION
;
131
}
else
{
132
c.
m_network
=
NET_IPV4
;
133
}
134
});
135
}
136
137
// Candidate numbers used for the benchmarks:
138
// - 50 candidates simulates a possible use of -maxconnections
139
// - 100 candidates approximates an average node with default settings
140
// - 250 candidates is the number of peers reported by operators of busy nodes
141
142
// No disadvantaged networks, with 250 eviction candidates.
143
BENCHMARK
(
EvictionProtection0Networks250Candidates
);
144
145
// 1 disadvantaged network (Tor) with 250 eviction candidates.
146
BENCHMARK
(
EvictionProtection1Networks250Candidates
);
147
148
// 2 disadvantaged networks (I2P, Tor) with 250 eviction candidates.
149
BENCHMARK
(
EvictionProtection2Networks250Candidates
);
150
151
// 3 disadvantaged networks (I2P/localhost/Tor) with 50/100/250 eviction candidates.
152
BENCHMARK
(
EvictionProtection3Networks050Candidates
);
153
BENCHMARK
(
EvictionProtection3Networks100Candidates
);
154
BENCHMARK
(
EvictionProtection3Networks250Candidates
);
bench.h
BENCHMARK
#define BENCHMARK(n)
Definition
bench.h:68
FastRandomContext
Fast randomness source.
Definition
random.h:386
ankerl::nanobench::Bench
Main entry point to nanobench's benchmarking facility.
Definition
nanobench.h:627
ankerl::nanobench::Bench::run
Bench & run(char const *benchmarkName, Op &&op)
Repeatedly calls op() based on the configuration, and performs measurements.
Definition
nanobench.h:1234
ProtectEvictionCandidatesByRatio
void ProtectEvictionCandidatesByRatio(std::vector< NodeEvictionCandidate > &eviction_candidates)
Protect desirable or disadvantaged inbound peers from eviction by ratio.
Definition
eviction.cpp:105
eviction.h
netaddress.h
NET_I2P
@ NET_I2P
I2P.
Definition
netaddress.h:47
NET_ONION
@ NET_ONION
TOR (v2 or v3).
Definition
netaddress.h:44
NET_IPV4
@ NET_IPV4
IPv4.
Definition
netaddress.h:38
EvictionProtection2Networks250Candidates
static void EvictionProtection2Networks250Candidates(benchmark::Bench &bench)
Definition
peer_eviction.cpp:65
EvictionProtection3Networks100Candidates
static void EvictionProtection3Networks100Candidates(benchmark::Bench &bench)
Definition
peer_eviction.cpp:101
EvictionProtectionCommon
static void EvictionProtectionCommon(benchmark::Bench &bench, int num_candidates, std::function< void(NodeEvictionCandidate &)> candidate_setup_fn)
Definition
peer_eviction.cpp:15
EvictionProtection1Networks250Candidates
static void EvictionProtection1Networks250Candidates(benchmark::Bench &bench)
Definition
peer_eviction.cpp:49
EvictionProtection3Networks250Candidates
static void EvictionProtection3Networks250Candidates(benchmark::Bench &bench)
Definition
peer_eviction.cpp:119
EvictionProtection0Networks250Candidates
static void EvictionProtection0Networks250Candidates(benchmark::Bench &bench)
Definition
peer_eviction.cpp:38
EvictionProtection3Networks050Candidates
static void EvictionProtection3Networks050Candidates(benchmark::Bench &bench)
Definition
peer_eviction.cpp:83
NodeEvictionCandidate
Definition
eviction.h:18
NodeEvictionCandidate::id
NodeId id
Definition
eviction.h:19
NodeEvictionCandidate::m_network
Network m_network
Definition
eviction.h:30
NodeEvictionCandidate::m_connected
std::chrono::seconds m_connected
Definition
eviction.h:20
NodeEvictionCandidate::m_is_local
bool m_is_local
Definition
eviction.h:29
GetRandomNodeEvictionCandidates
std::vector< NodeEvictionCandidate > GetRandomNodeEvictionCandidates(int n_candidates, FastRandomContext &random_context)
Definition
net.cpp:136
net.h
Generated on
for Bitcoin Core by
1.17.0