This adds the memory consumed by any kind of as-set, prefix-set,
origin-set or roa-set to the output of show rib mem.
Here the output of a system that has RPKI ROA loaded.
RDE memory statistics
714982 IPv4 unicast network entries using 27.3M of memory
56393 IPv6 unicast network entries using 3.0M of memory
1526718 rib entries using 93.2M of memory
3053428 prefix entries using 280M of memory
270426 BGP path attribute entries using 28.9M of memory
112881 BGP AS-PATH attribute entries using 5.2M of memory,
and holding 270426 references
18337 BGP attributes entries using 716K of memory
and holding 330395 references
18336 BGP attributes using 252K of memory
61415 as-set elements in 57669 tables using 1.8M of memory
102389 prefix-set elments using 4.3M of memory
RIB using 438M of memory
Sets using 6.0M of memory
--
:wq Claudio
Index: bgpctl/bgpctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/bgpctl.c,v
retrieving revision 1.219
diff -u -p -r1.219 bgpctl.c
--- bgpctl/bgpctl.c 1 Oct 2018 23:09:53 -0000 1.219
+++ bgpctl/bgpctl.c 26 Oct 2018 11:09:07 -0000
@@ -1875,12 +1875,19 @@ show_rib_memory_msg(struct imsg *imsg)
(long long)stats.attr_refs);
printf("%10lld BGP attributes using %s of memory\n",
(long long)stats.attr_dcnt, fmt_mem(stats.attr_data));
+ printf("%10lld as-set elements in %lld tables using "
+ "%s of memory\n", stats.aset_nmemb, stats.aset_cnt,
+ fmt_mem(stats.aset_size));
+ printf("%10lld prefix-set elments using %s of memory\n",
+ stats.pset_cnt, fmt_mem(stats.pset_size));
printf("RIB using %s of memory\n", fmt_mem(pts +
stats.prefix_cnt * sizeof(struct prefix) +
stats.rib_cnt * sizeof(struct rib_entry) +
stats.path_cnt * sizeof(struct rde_aspath) +
stats.aspath_size + stats.attr_cnt * sizeof(struct attr) +
stats.attr_data));
+ printf("Sets using %s of memory\n", fmt_mem(stats.aset_size +
+ stats.pset_size));
printf("\nRDE hash statistics\n");
break;
case IMSG_CTL_SHOW_RIB_HASH:
Index: bgpd/bgpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
retrieving revision 1.349
diff -u -p -r1.349 bgpd.h
--- bgpd/bgpd.h 3 Oct 2018 11:36:39 -0000 1.349
+++ bgpd/bgpd.h 26 Oct 2018 11:23:53 -0000
@@ -1077,6 +1077,11 @@ struct rde_memstats {
int64_t attr_refs;
int64_t attr_data;
int64_t attr_dcnt;
+ int64_t aset_cnt;
+ int64_t aset_size;
+ int64_t aset_nmemb;
+ int64_t pset_cnt;
+ int64_t pset_size;
};
struct rde_hashstats {
Index: bgpd/rde_sets.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_sets.c,v
retrieving revision 1.5
diff -u -p -r1.5 rde_sets.c
--- bgpd/rde_sets.c 20 Sep 2018 11:45:59 -0000 1.5
+++ bgpd/rde_sets.c 26 Oct 2018 11:01:26 -0000
@@ -125,6 +125,8 @@ set_new(size_t nmemb, size_t size)
return NULL;
}
+ rdemem.aset_cnt++;
+ rdemem.aset_size += sizeof(*set);
return set;
}
@@ -133,6 +135,10 @@ set_free(struct set_table *set)
{
if (set == NULL)
return;
+ rdemem.aset_cnt--;
+ rdemem.aset_size -= sizeof(*set);
+ rdemem.aset_size -= set->size * set->max;
+ rdemem.aset_nmemb -= set->nmemb;
free(set->set);
free(set);
}
@@ -154,6 +160,7 @@ set_add(struct set_table *set, void *elm
s = reallocarray(set->set, new_size, set->size);
if (s == NULL)
return -1;
+ rdemem.aset_size += set->size * (new_size - set->max);
set->set = s;
set->max = new_size;
}
@@ -161,6 +168,7 @@ set_add(struct set_table *set, void *elm
memcpy((u_int8_t *)set->set + set->nmemb * set->size, elms,
nelms * set->size);
set->nmemb += nelms;
+ rdemem.aset_nmemb += nelms;
return 0;
}
Index: bgpd/rde_trie.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_trie.c,v
retrieving revision 1.9
diff -u -p -r1.9 rde_trie.c
--- bgpd/rde_trie.c 29 Sep 2018 08:11:11 -0000 1.9
+++ bgpd/rde_trie.c 26 Oct 2018 10:49:20 -0000
@@ -165,6 +165,8 @@ trie_add_v4(struct trie_head *th, struct
*/
if ((b = calloc(1, sizeof(*b))) == NULL)
return NULL;
+ rdemem.pset_cnt++;
+ rdemem.pset_size += sizeof(*b);
b->plen = inet4findmsb(&n->addr, &mp);
inet4applymask(&b->addr, &n->addr, b->plen);
@@ -202,6 +204,8 @@ trie_add_v4(struct trie_head *th, struct
/* create new node */
if ((new = calloc(1, sizeof(*new))) == NULL)
return NULL;
+ rdemem.pset_cnt++;
+ rdemem.pset_size += sizeof(*new);
new->addr = p;
new->plen = plen;
new->node = 1;
@@ -241,6 +245,8 @@ trie_add_v6(struct trie_head *th, struct
*/
if ((b = calloc(1, sizeof(*b))) == NULL)
return NULL;
+ rdemem.pset_cnt++;
+ rdemem.pset_size += sizeof(*b);
b->plen = inet6findmsb(&n->addr, &mp);
inet6applymask(&b->addr, &n->addr, b->plen);
@@ -278,6 +284,8 @@ trie_add_v6(struct trie_head *th, struct
/* create new node */
if ((new = calloc(1, sizeof(*new))) == NULL)
return NULL;
+ rdemem.pset_cnt++;
+ rdemem.pset_size += sizeof(*new);
new->addr = p;
new->plen = plen;
new->node = 1;
@@ -420,6 +428,8 @@ trie_free_v4(struct tentry_v4 *n)
trie_free_v4(n->trie[1]);
set_free(n->set);
free(n);
+ rdemem.pset_cnt--;
+ rdemem.pset_size -= sizeof(*n);
}
static void
@@ -431,6 +441,8 @@ trie_free_v6(struct tentry_v6 *n)
trie_free_v6(n->trie[1]);
set_free(n->set);
free(n);
+ rdemem.pset_cnt--;
+ rdemem.pset_size -= sizeof(*n);
}
void