Skip to content

Add buffer pool watermark support in watermarkstat, counterpoll, and show #521

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jun 4, 2019
Merged
10 changes: 10 additions & 0 deletions counterpoll/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import swsssdk
from tabulate import tabulate

BUFFER_POOL_WATERMARK = "BUFFER_POOL_WATERMARK"

@click.group()
def cli():
""" SONiC Static Counter Poll configurations """
Expand Down Expand Up @@ -123,11 +125,14 @@ def interval(poll_interval):
configdb.connect()
queue_wm_info = {}
pg_wm_info = {}
buffer_pool_wm_info = {}
if poll_interval is not None:
queue_wm_info['POLL_INTERVAL'] = poll_interval
pg_wm_info['POLL_INTERVAL'] = poll_interval
buffer_pool_wm_info['POLL_INTERVAL'] = poll_interval
configdb.mod_entry("FLEX_COUNTER_TABLE", "QUEUE_WATERMARK", queue_wm_info)
configdb.mod_entry("FLEX_COUNTER_TABLE", "PG_WATERMARK", pg_wm_info)
configdb.mod_entry("FLEX_COUNTER_TABLE", BUFFER_POOL_WATERMARK, buffer_pool_wm_info)

@watermark.command()
def enable():
Expand All @@ -138,6 +143,7 @@ def enable():
fc_info['FLEX_COUNTER_STATUS'] = 'enable'
configdb.mod_entry("FLEX_COUNTER_TABLE", "QUEUE_WATERMARK", fc_info)
configdb.mod_entry("FLEX_COUNTER_TABLE", "PG_WATERMARK", fc_info)
configdb.mod_entry("FLEX_COUNTER_TABLE", BUFFER_POOL_WATERMARK, fc_info)

@watermark.command()
def disable():
Expand All @@ -148,6 +154,7 @@ def disable():
fc_info['FLEX_COUNTER_STATUS'] = 'disable'
configdb.mod_entry("FLEX_COUNTER_TABLE", "QUEUE_WATERMARK", fc_info)
configdb.mod_entry("FLEX_COUNTER_TABLE", "PG_WATERMARK", fc_info)
configdb.mod_entry("FLEX_COUNTER_TABLE", BUFFER_POOL_WATERMARK, fc_info)

@cli.command()
def show():
Expand All @@ -159,6 +166,7 @@ def show():
rif_info = configdb.get_entry('FLEX_COUNTER_TABLE', 'RIF')
queue_wm_info = configdb.get_entry('FLEX_COUNTER_TABLE', 'QUEUE_WATERMARK')
pg_wm_info = configdb.get_entry('FLEX_COUNTER_TABLE', 'PG_WATERMARK')
buffer_pool_wm_info = configdb.get_entry('FLEX_COUNTER_TABLE', BUFFER_POOL_WATERMARK)

header = ("Type", "Interval (in ms)", "Status")
data = []
Expand All @@ -172,6 +180,8 @@ def show():
data.append(["QUEUE_WATERMARK_STAT", queue_wm_info["POLL_INTERVAL"] if 'POLL_INTERVAL' in queue_wm_info else 'default (10000)', queue_wm_info["FLEX_COUNTER_STATUS"] if 'FLEX_COUNTER_STATUS' in queue_wm_info else 'disable' ])
if pg_wm_info:
data.append(["PG_WATERMARK_STAT", pg_wm_info["POLL_INTERVAL"] if 'POLL_INTERVAL' in pg_wm_info else 'default (10000)', pg_wm_info["FLEX_COUNTER_STATUS"] if 'FLEX_COUNTER_STATUS' in pg_wm_info else 'disable'])
if buffer_pool_wm_info:
data.append(["BUFFER_POOL_WATERMARK_STAT", buffer_pool_wm_info["POLL_INTERVAL"] if 'POLL_INTERVAL' in buffer_pool_wm_info else 'default (10000)', buffer_pool_wm_info["FLEX_COUNTER_STATUS"] if 'FLEX_COUNTER_STATUS' in buffer_pool_wm_info else 'disable'])

print tabulate(data, headers=header, tablefmt="simple", missingval="")

85 changes: 55 additions & 30 deletions scripts/watermarkstat
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ from tabulate import tabulate
headerPg = ['Port', 'PG0', 'PG1', 'PG2', 'PG3', 'PG4', 'PG5', 'PG6', 'PG7']
headerUc = ['Port', 'UC0', 'UC1', 'UC2', 'UC3', 'UC4', 'UC5', 'UC6', 'UC7']
headerMc = ['Port', 'MC8', 'MC9', 'MC10', 'MC11', 'MC12', 'MC13', 'MC14', 'MC15']
headerBufferPool = ['Pool', 'Bytes']


STATUS_NA = 'N/A'
Expand All @@ -43,6 +44,7 @@ COUNTERS_QUEUE_PORT_MAP = "COUNTERS_QUEUE_PORT_MAP"
COUNTERS_PG_NAME_MAP = "COUNTERS_PG_NAME_MAP"
COUNTERS_PG_PORT_MAP = "COUNTERS_PG_PORT_MAP"
COUNTERS_PG_INDEX_MAP = "COUNTERS_PG_INDEX_MAP"
COUNTERS_BUFFER_POOL_NAME_MAP = "COUNTERS_BUFFER_POOL_NAME_MAP"


class Watermarkstat(object):
Expand Down Expand Up @@ -127,27 +129,36 @@ class Watermarkstat(object):
port = self.port_name_map[get_pg_port(counter_pg_name_map[pg])]
self.port_pg_map[port][pg] = counter_pg_name_map[pg]

# Get all buffer pools
self.buffer_pool_name_to_oid_map = self.counters_db.get_all(self.counters_db.COUNTERS_DB, COUNTERS_BUFFER_POOL_NAME_MAP)
if self.buffer_pool_name_to_oid_map is None:
print "COUNTERS_BUFFER_POOL_NAME_MAP is empty!"
sys.exit(1)

self.watermark_types = {
"pg_headroom": {"message": "Ingress headroom per PG:",
"obj_map": self.port_pg_map,
"idx_func": self.get_pg_index,
"wm_name": "SAI_INGRESS_PRIORITY_GROUP_STAT_XOFF_ROOM_WATERMARK_BYTES",
"header": headerPg},
"pg_shared": {"message": "Ingress shared pool occupancy per PG:",
"obj_map": self.port_pg_map,
"idx_func": self.get_pg_index,
"wm_name": "SAI_INGRESS_PRIORITY_GROUP_STAT_SHARED_WATERMARK_BYTES",
"header": headerPg},
"q_shared_uni": {"message": "Egress shared pool occupancy per unicast queue:",
"obj_map": self.port_uc_queues_map,
"idx_func": self.get_queue_index,
"wm_name": "SAI_QUEUE_STAT_SHARED_WATERMARK_BYTES",
"header": headerUc},
"q_shared_multi": {"message": "Egress shared pool occupancy per multicast queue:",
"obj_map": self.port_mc_queues_map,
"idx_func": self.get_queue_index,
"wm_name": "SAI_QUEUE_STAT_SHARED_WATERMARK_BYTES",
"header": headerMc}
"pg_headroom" : {"message" : "Ingress headroom per PG:",
"obj_map" : self.port_pg_map,
"idx_func": self.get_pg_index,
"wm_name" : "SAI_INGRESS_PRIORITY_GROUP_STAT_XOFF_ROOM_WATERMARK_BYTES",
"header" : headerPg},
"pg_shared" : {"message" : "Ingress shared pool occupancy per PG:",
"obj_map" : self.port_pg_map,
"idx_func": self.get_pg_index,
"wm_name" : "SAI_INGRESS_PRIORITY_GROUP_STAT_SHARED_WATERMARK_BYTES",
"header" : headerPg},
"q_shared_uni" : {"message" : "Egress shared pool occupancy per unicast queue:",
"obj_map" : self.port_uc_queues_map,
"idx_func": self.get_queue_index,
"wm_name" : "SAI_QUEUE_STAT_SHARED_WATERMARK_BYTES",
"header" : headerUc},
"q_shared_multi": {"message" : "Egress shared pool occupancy per multicast queue:",
"obj_map" : self.port_mc_queues_map,
"idx_func": self.get_queue_index,
"wm_name" : "SAI_QUEUE_STAT_SHARED_WATERMARK_BYTES",
"header" : headerMc},
"buffer_pool" : {"message": "Shared pool maximum occupancy:",
"wm_name": "SAI_BUFFER_POOL_STAT_WATERMARK_BYTES",
"header" : headerBufferPool}
}

def get_queue_index(self, table_id):
Expand All @@ -171,7 +182,7 @@ class Watermarkstat(object):
Get the counters from specific table.
"""

fields = ["0"]*8
fields = ["0"] * 8

for name, obj_id in port_obj.items():
full_table_id = table_prefix + obj_id
Expand All @@ -184,14 +195,25 @@ class Watermarkstat(object):
cntr = tuple(fields)
return cntr

def get_print_all_stat(self, table_prefix, type):
# Get stat for each port
def get_print_all_stat(self, table_prefix, key):
table = []
for port in natsorted(self.counter_port_name_map):
data = self.get_counters(table_prefix,
type["obj_map"][port], type["idx_func"], type["wm_name"])
table.append((port, data[0], data[1], data[2], data[3],
data[4], data[5], data[6], data[7]))
type = self.watermark_types[key]
if key == 'buffer_pool':
# Get stats for each buffer pool
for buf_pool, bp_oid in natsorted(self.buffer_pool_name_to_oid_map.items()):
key = table_prefix + bp_oid
data = self.counters_db.get(self.counters_db.COUNTERS_DB, key, type["wm_name"])
if data is None:
data = STATUS_NA
table.append((buf_pool, data))
else:
# Get stat for each port
for port in natsorted(self.counter_port_name_map):
data = self.get_counters(table_prefix,
type["obj_map"][port], type["idx_func"], type["wm_name"])
table.append((port, data[0], data[1], data[2], data[3],
data[4], data[5], data[6], data[7]))

print(type["message"])
print tabulate(table, type["header"], tablefmt='simple', stralign='right')

Expand All @@ -214,12 +236,15 @@ Examples:
watermarkstat -t q_shared_multi -c
watermarkstat -p -t pg_shared
watermarkstat -p -t q_shared_multi -c
watermarkstat -t buffer_pool
watermarkstat -t buffer_pool -c
watermarkstat -p -t buffer_pool -c
""")

parser.add_argument('-c', '--clear', action='store_true', help='Clear watermarks request')
parser.add_argument('-p', '--persistent', action='store_true', help='Do the operations on the persistent watermark')
parser.add_argument('-t', '--type', required=True, action='store',
choices=['pg_headroom', 'pg_shared', 'q_shared_uni', 'q_shared_multi'],
choices=['pg_headroom', 'pg_shared', 'q_shared_uni', 'q_shared_multi', 'buffer_pool'],
help='The type of watermark')
args = parser.parse_args()
watermarkstat = Watermarkstat()
Expand All @@ -229,7 +254,7 @@ Examples:
sys.exit(0)

table_prefix = PERSISTENT_TABLE_PREFIX if args.persistent else USER_TABLE_PREFIX
watermarkstat.get_print_all_stat(table_prefix, watermarkstat.watermark_types[args.type])
watermarkstat.get_print_all_stat(table_prefix, args.type)
sys.exit(0)


Expand Down