numam-dpdk/lib/member/rte_member_sketch.h
Leyi Rong db354bd2e1 member: add NitroSketch mode
Sketching algorithm provide high-fidelity approximate measurements and
appears as a promising alternative to traditional approaches such as
packet sampling.

NitroSketch [1] is a software sketching framework that optimizes
performance, provides accuracy guarantees, and supports a variety of
sketches.

This commit adds a new data structure called sketch into
membership library. This new data structure is an efficient
way to profile the traffic for heavy hitters. Also use min-heap
structure to maintain the top-k flow keys.

[1] Zaoxing Liu, Ran Ben-Basat, Gil Einziger, Yaron Kassner, Vladimir
Braverman, Roy Friedman, Vyas Sekar, "NitroSketch: Robust and General
Sketch-based Monitoring in Software Switches", in ACM SIGCOMM 2019.
https://dl.acm.org/doi/pdf/10.1145/3341302.3342076

Signed-off-by: Alan Liu <zaoxingliu@gmail.com>
Signed-off-by: Yipeng Wang <yipeng1.wang@intel.com>
Signed-off-by: Leyi Rong <leyi.rong@intel.com>
Tested-by: Yu Jiang <yux.jiang@intel.com>
2022-10-09 23:11:43 +02:00

98 lines
2.1 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2017 Intel Corporation
*/
#ifndef RTE_MEMBER_SKETCH_H
#define RTE_MEMBER_SKETCH_H
#ifdef __cplusplus
extern "C" {
#endif
#include <rte_vect.h>
#include <rte_ring_elem.h>
#define NUM_ROW_SCALAR 5
#define INTERVAL (1 << 15)
#if !RTE_IS_POWER_OF_2(INTERVAL)
#error sketch INTERVAL macro must be a power of 2
#endif
int
rte_member_create_sketch(struct rte_member_setsum *ss,
const struct rte_member_parameters *params,
struct rte_ring *r);
int
rte_member_lookup_sketch(const struct rte_member_setsum *setsum,
const void *key, member_set_t *set_id);
int
rte_member_add_sketch(const struct rte_member_setsum *setsum,
const void *key,
member_set_t set_id);
int
rte_member_add_sketch_byte_count(const struct rte_member_setsum *ss,
const void *key, uint32_t byte_count);
void
sketch_update_scalar(const struct rte_member_setsum *ss,
const void *key,
uint32_t count);
uint64_t
sketch_lookup_scalar(const struct rte_member_setsum *ss,
const void *key);
void
sketch_delete_scalar(const struct rte_member_setsum *ss,
const void *key);
int
rte_member_delete_sketch(const struct rte_member_setsum *setsum,
const void *key);
int
rte_member_query_sketch(const struct rte_member_setsum *setsum,
const void *key, uint64_t *output);
void
rte_member_free_sketch(struct rte_member_setsum *ss);
void
rte_member_reset_sketch(const struct rte_member_setsum *setsum);
int
rte_member_report_heavyhitter_sketch(const struct rte_member_setsum *setsum,
void **key, uint64_t *count);
void
rte_member_update_heap(const struct rte_member_setsum *ss);
static __rte_always_inline uint64_t
count_min(const struct rte_member_setsum *ss, const uint32_t *hash_results)
{
uint64_t *count_array = ss->table;
uint64_t count;
uint32_t cur_row;
uint64_t min = UINT64_MAX;
for (cur_row = 0; cur_row < ss->num_row; cur_row++) {
uint64_t cnt = count_array[cur_row * ss->num_col + hash_results[cur_row]];
if (cnt < min)
min = cnt;
}
count = min;
return count;
}
#ifdef __cplusplus
}
#endif
#endif /* RTE_MEMBER_SKETCH_H */