mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 01:31:55 +00:00
Perf: allow testing with cached route attributes.
This commit is contained in:
parent
15a7583787
commit
6dda6931d1
@ -31,6 +31,7 @@ perf_proto_start: proto_start PERF
|
|||||||
PERF_CFG->repeat = 4;
|
PERF_CFG->repeat = 4;
|
||||||
PERF_CFG->threshold_max = 500 MS_;
|
PERF_CFG->threshold_max = 500 MS_;
|
||||||
PERF_CFG->threshold_min = 1 MS_;
|
PERF_CFG->threshold_min = 1 MS_;
|
||||||
|
PERF_CFG->attrs_per_rte = 0;
|
||||||
PERF_CFG->keep = 0;
|
PERF_CFG->keep = 0;
|
||||||
PERF_CFG->mode = PERF_MODE_IMPORT;
|
PERF_CFG->mode = PERF_MODE_IMPORT;
|
||||||
};
|
};
|
||||||
@ -48,6 +49,7 @@ perf_proto_item:
|
|||||||
| REPEAT NUM { PERF_CFG->repeat = $2; }
|
| REPEAT NUM { PERF_CFG->repeat = $2; }
|
||||||
| THRESHOLD MIN expr_us { PERF_CFG->threshold_min = $3; }
|
| THRESHOLD MIN expr_us { PERF_CFG->threshold_min = $3; }
|
||||||
| THRESHOLD MAX expr_us { PERF_CFG->threshold_max = $3; }
|
| THRESHOLD MAX expr_us { PERF_CFG->threshold_max = $3; }
|
||||||
|
| ATTRIBUTES NUM { PERF_CFG->attrs_per_rte = $2; }
|
||||||
| KEEP bool { PERF_CFG->keep = $2; }
|
| KEEP bool { PERF_CFG->keep = $2; }
|
||||||
| MODE IMPORT { PERF_CFG->mode = PERF_MODE_IMPORT; }
|
| MODE IMPORT { PERF_CFG->mode = PERF_MODE_IMPORT; }
|
||||||
| MODE EXPORT { PERF_CFG->mode = PERF_MODE_EXPORT; }
|
| MODE EXPORT { PERF_CFG->mode = PERF_MODE_EXPORT; }
|
||||||
|
@ -90,7 +90,7 @@ struct perf_random_routes {
|
|||||||
struct rta a;
|
struct rta a;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const uint perf_random_routes_size = sizeof(net_addr) + sizeof(rte *) + RTA_MAX_SIZE;
|
static const uint perf_random_routes_size = sizeof(struct perf_random_routes) + (RTA_MAX_SIZE - sizeof(struct rta));
|
||||||
|
|
||||||
static inline s64 timediff(struct timespec *begin, struct timespec *end)
|
static inline s64 timediff(struct timespec *begin, struct timespec *end)
|
||||||
{ return (end->tv_sec - begin->tv_sec) * (s64) 1000000000 + end->tv_nsec - begin->tv_nsec; }
|
{ return (end->tv_sec - begin->tv_sec) * (s64) 1000000000 + end->tv_nsec - begin->tv_nsec; }
|
||||||
@ -137,15 +137,18 @@ perf_loop(void *data)
|
|||||||
|
|
||||||
ip_addr gw = random_gw(&p->ifa->prefix);
|
ip_addr gw = random_gw(&p->ifa->prefix);
|
||||||
|
|
||||||
struct timespec ts_begin, ts_generated, ts_rte, ts_update, ts_withdraw;
|
struct timespec ts_begin, ts_generated, ts_update, ts_withdraw;
|
||||||
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &ts_begin);
|
clock_gettime(CLOCK_MONOTONIC, &ts_begin);
|
||||||
|
|
||||||
|
struct rta *a = NULL;
|
||||||
|
|
||||||
for (uint i=0; i<N; i++) {
|
for (uint i=0; i<N; i++) {
|
||||||
struct perf_random_routes *prr = p->data + offset * i;
|
struct perf_random_routes *prr = p->data + offset * i;
|
||||||
*((net_addr_ip4 *) &prr->net) = random_net_ip4();
|
*((net_addr_ip4 *) &prr->net) = random_net_ip4();
|
||||||
|
|
||||||
rta *a = &prr->a;
|
if (!p->attrs_per_rte || !(i % p->attrs_per_rte)) {
|
||||||
|
a = &prr->a;
|
||||||
bzero(a, RTA_MAX_SIZE);
|
bzero(a, RTA_MAX_SIZE);
|
||||||
|
|
||||||
a->src = p->p.main_source;
|
a->src = p->p.main_source;
|
||||||
@ -156,17 +159,18 @@ perf_loop(void *data)
|
|||||||
a->nh.iface = p->ifa->iface;
|
a->nh.iface = p->ifa->iface;
|
||||||
a->nh.gw = gw;
|
a->nh.gw = gw;
|
||||||
a->nh.weight = 1;
|
a->nh.weight = 1;
|
||||||
|
|
||||||
|
if (p->attrs_per_rte)
|
||||||
|
a = rta_lookup(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &ts_generated);
|
ASSERT(a);
|
||||||
|
|
||||||
for (uint i=0; i<N; i++) {
|
prr->ep = rte_get_temp(a);
|
||||||
struct perf_random_routes *prr = p->data + offset * i;
|
|
||||||
prr->ep = rte_get_temp(&prr->a);
|
|
||||||
prr->ep->pflags = 0;
|
prr->ep->pflags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &ts_rte);
|
clock_gettime(CLOCK_MONOTONIC, &ts_generated);
|
||||||
|
|
||||||
for (uint i=0; i<N; i++) {
|
for (uint i=0; i<N; i++) {
|
||||||
struct perf_random_routes *prr = p->data + offset * i;
|
struct perf_random_routes *prr = p->data + offset * i;
|
||||||
@ -184,13 +188,12 @@ perf_loop(void *data)
|
|||||||
clock_gettime(CLOCK_MONOTONIC, &ts_withdraw);
|
clock_gettime(CLOCK_MONOTONIC, &ts_withdraw);
|
||||||
|
|
||||||
s64 gentime = timediff(&ts_begin, &ts_generated);
|
s64 gentime = timediff(&ts_begin, &ts_generated);
|
||||||
s64 temptime = timediff(&ts_generated, &ts_rte);
|
s64 updatetime = timediff(&ts_generated, &ts_update);
|
||||||
s64 updatetime = timediff(&ts_rte, &ts_update);
|
|
||||||
s64 withdrawtime = timediff(&ts_update, &ts_withdraw);
|
s64 withdrawtime = timediff(&ts_update, &ts_withdraw);
|
||||||
|
|
||||||
if (updatetime NS >= p->threshold_min)
|
if (updatetime NS >= p->threshold_min)
|
||||||
PLOG("exp=%u times: gen=%lu temp=%lu update=%lu withdraw=%lu",
|
PLOG("exp=%u times: gen=%lu update=%lu withdraw=%lu",
|
||||||
p->exp, gentime, temptime, updatetime, withdrawtime);
|
p->exp, gentime, updatetime, withdrawtime);
|
||||||
|
|
||||||
if (updatetime NS < p->threshold_max)
|
if (updatetime NS < p->threshold_max)
|
||||||
p->stop = 0;
|
p->stop = 0;
|
||||||
@ -269,6 +272,7 @@ perf_init(struct proto_config *CF)
|
|||||||
p->repeat = cf->repeat;
|
p->repeat = cf->repeat;
|
||||||
p->keep = cf->keep;
|
p->keep = cf->keep;
|
||||||
p->mode = cf->mode;
|
p->mode = cf->mode;
|
||||||
|
p->attrs_per_rte = cf->attrs_per_rte;
|
||||||
|
|
||||||
switch (p->mode) {
|
switch (p->mode) {
|
||||||
case PERF_MODE_IMPORT:
|
case PERF_MODE_IMPORT:
|
||||||
|
@ -22,6 +22,7 @@ struct perf_config {
|
|||||||
uint to;
|
uint to;
|
||||||
uint repeat;
|
uint repeat;
|
||||||
uint keep;
|
uint keep;
|
||||||
|
uint attrs_per_rte;
|
||||||
enum perf_mode mode;
|
enum perf_mode mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -39,6 +40,7 @@ struct perf_proto {
|
|||||||
uint exp;
|
uint exp;
|
||||||
uint stop;
|
uint stop;
|
||||||
uint keep;
|
uint keep;
|
||||||
|
uint attrs_per_rte;
|
||||||
enum perf_mode mode;
|
enum perf_mode mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user