Skip to content

Commit f3e4846

Browse files
RichardWu-Hebutjleveque
authored andcommitted
[portstat] Fix portstat show RX_UTIL over 100% for 100G (sonic-net#563)
When calc the RX_UTIL, currently it use hardcode 40G, now change to get the real port speed via APP DB Signed-off-by: Richard Wu <wutong23@baidu.com>
1 parent 87ae732 commit f3e4846

2 files changed

Lines changed: 22 additions & 8 deletions

File tree

scripts/portstat

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ PORT_OPER_STATUS_FIELD = "oper_status"
5959
PORT_ADMIN_STATUS_FIELD = "admin_status"
6060
PORT_STATUS_VALUE_UP = 'UP'
6161
PORT_STATUS_VALUE_DOWN = 'DOWN'
62+
PORT_SPEED_FIELD = "speed"
6263

6364
PORT_STATE_UP = 'U'
6465
PORT_STATE_DOWN = 'D'
@@ -100,6 +101,19 @@ class Portstat(object):
100101
cnstat_dict[port] = get_counters(counter_port_name_map[port])
101102
return cnstat_dict
102103

104+
def get_port_speed(self, port_name):
105+
"""
106+
Get the port speed
107+
"""
108+
# Get speed from APPL_DB
109+
full_table_id = PORT_STATUS_TABLE_PREFIX + port_name
110+
speed = self.db.get(self.db.APPL_DB, full_table_id, PORT_SPEED_FIELD)
111+
if speed is None:
112+
speed = PORT_RATE
113+
else:
114+
speed = int(speed)/1000
115+
return speed
116+
103117
def get_port_state(self, port_name):
104118
"""
105119
Get the port state
@@ -137,34 +151,34 @@ class Portstat(object):
137151
old_cntr = cnstat_old_dict.get(key)
138152
else:
139153
old_cntr = NStats._make([0] * BUCKET_NUM)
140-
154+
port_speed = self.get_port_speed(key)
141155
if print_all:
142156
table.append((key, self.get_port_state(key),
143157
ns_diff(cntr.rx_ok, old_cntr.rx_ok),
144158
ns_brate(cntr.rx_byt, old_cntr.rx_byt, time_gap),
145159
ns_prate(cntr.rx_ok, old_cntr.rx_ok, time_gap),
146-
ns_util(cntr.rx_byt, old_cntr.rx_byt, time_gap),
160+
ns_util(cntr.rx_byt, old_cntr.rx_byt, time_gap, port_speed),
147161
ns_diff(cntr.rx_err, old_cntr.rx_err),
148162
ns_diff(cntr.rx_drop, old_cntr.rx_drop),
149163
ns_diff(cntr.rx_ovr, old_cntr.rx_ovr),
150164
ns_diff(cntr.tx_ok, old_cntr.tx_ok),
151165
ns_brate(cntr.tx_byt, old_cntr.tx_byt, time_gap),
152166
ns_prate(cntr.tx_ok, old_cntr.tx_ok, time_gap),
153-
ns_util(cntr.tx_byt, old_cntr.tx_byt, time_gap),
167+
ns_util(cntr.tx_byt, old_cntr.tx_byt, time_gap, port_speed),
154168
ns_diff(cntr.tx_err, old_cntr.tx_err),
155169
ns_diff(cntr.tx_drop, old_cntr.tx_drop),
156170
ns_diff(cntr.tx_ovr, old_cntr.tx_ovr)))
157171
else:
158172
table.append((key, self.get_port_state(key),
159173
ns_diff(cntr.rx_ok, old_cntr.rx_ok),
160174
ns_brate(cntr.rx_byt, old_cntr.rx_byt, time_gap),
161-
ns_util(cntr.rx_byt, old_cntr.rx_byt, time_gap),
175+
ns_util(cntr.rx_byt, old_cntr.rx_byt, time_gap, port_speed),
162176
ns_diff(cntr.rx_err, old_cntr.rx_err),
163177
ns_diff(cntr.rx_drop, old_cntr.rx_drop),
164178
ns_diff(cntr.rx_ovr, old_cntr.rx_ovr),
165179
ns_diff(cntr.tx_ok, old_cntr.tx_ok),
166180
ns_brate(cntr.tx_byt, old_cntr.tx_byt, time_gap),
167-
ns_util(cntr.tx_byt, old_cntr.tx_byt, time_gap),
181+
ns_util(cntr.tx_byt, old_cntr.tx_byt, time_gap, port_speed),
168182
ns_diff(cntr.tx_err, old_cntr.tx_err),
169183
ns_diff(cntr.tx_drop, old_cntr.tx_drop),
170184
ns_diff(cntr.tx_ovr, old_cntr.tx_ovr)))

utilities_common/netstat.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@ def ns_prate(newstr, oldstr, delta):
4141
rate = int(ns_diff(newstr, oldstr).replace(',',''))/delta
4242
return "{:.2f}".format(rate)+'/s'
4343

44-
def ns_util(newstr, oldstr, delta):
44+
def ns_util(newstr, oldstr, delta, port_rate=PORT_RATE):
4545
"""
4646
Calculate the util.
4747
"""
4848
if newstr == STATUS_NA or oldstr == STATUS_NA:
4949
return STATUS_NA
5050
else:
5151
rate = int(ns_diff(newstr, oldstr).replace(',',''))/delta
52-
util = rate/(PORT_RATE*1024*1024*1024/8.0)*100
52+
util = rate/(port_rate*1024*1024*1024/8.0)*100
5353
return "{:.2f}%".format(util)
5454

5555
def table_as_json(table, header):
@@ -64,4 +64,4 @@ def table_as_json(table, header):
6464
if_name = line[0]
6565
output[if_name] = {header[i]: line[i] for i in range(1, len(header))}
6666

67-
return json.dumps(output, indent=4, sort_keys=True)
67+
return json.dumps(output, indent=4, sort_keys=True)

0 commit comments

Comments
 (0)