Quantized Congestion Notification (QCN)
Congestion control is used to reduce packet drops in lossy environments and mitigate congestion spreading and resulting victim flows in lossless environments.
The Quantized Congestion Notification (QCN) IEEE standard (802.1Qau) provides congestion control for long-lived flows in limited bandwidth-delay product Ethernet networks. It is part of the IEEE Data Center Bridging (DCB) protocol suite, which also includes ETS, PFC, and DCBX. QCN in conducted at L2, and is targeted for hardware implementations. QCN applies to all Ethernet packets and all transports, and both the host and switch behavior is detailed in the standard.
QCN user interface allows the user to configure QCN activity. QCN configuration and retrieval of information is done by the mlnx_qcn tool. The command interface provides the user with a set of changeable attributes, and with information regarding QCN's counters and statistics. All parameters and statistics are defined per port and priority. QCN command interface is available if and only the hardware supports it.
This tool is supported on ConnectX-3 and ConnectX-3 Pro NICs only.
mlnx_qcn is a tool used to configure QCN attributes of the local host. It communicates directly with the driver thus does not require setting up a DCBX daemon on the system.
The mlnx_qcn enables the user to:
Inspect the current QCN configurations for a certain port sorted by priority
Inspect the current QCN statistics and counters for a certain port sorted by priority
Set values of chosen QCN parameters
Usage
mlnx_qcn -i <interface
> \[options\]
Options
--version | Show program's version number and exit |
-h, --help | Show this help message and exit |
-i INTF, --interface=INTF | Interface name |
-g TYPE, --get_type=TYPE | Type of information to get statistics/parameters |
--rpg_enable=RPG_ENABLE_LIST | Set value of rpg_enable according to priority, use spaces between values and -1 for unknown values. |
--rppp_max_rps=RPPP_MAX_RPS_LIST | Set value of rppp_max_rps according to priority, use spaces between values and -1 for unknown values. |
--rpg_time_reset=RPG_TIME_RESET_LIST | Set value of rpg_time_reset according to priority, use spaces between values and -1 for unknown values. |
--rpg_byte_reset=RPG_BYTE_RESET_LIST | Set value of rpg_byte_reset according to priority, use spaces between values and -1 for unknown values. |
--rpg_threshold=RPG_THRESHOLD_LIST | Set value of rpg_threshold according to priority, use spaces between values and -1 for unknown values. |
--rpg_max_rate=RPG_MAX_RATE_LIST | Set value of rpg_max_rate according to priority, use spaces between values and -1 for unknown values. |
--rpg_ai_rate=RPG_AI_RATE_LIST | Set value of rpg_ai_rate according to priority, use spaces between values and -1 for unknown values. |
--rpg_hai_rate=RPG_HAI_RATE_LIST | Set value of rpg_hai_rate according to priority, use spaces between values and -1 for unknown values. |
--rpg_gd=RPG_GD_LIST | Set value of rpg_gd according to priority, use spaces between values and -1 for unknown values. |
--rpg_min_dec_fac=RPG_MIN_DEC_FAC_LIST | Set value of rpg_min_dec_fac according to priority, use spaces between values and -1 for unknown values. |
--rpg_min_rate=RPG_MIN_RATE_LIST | Set value of rpg_min_rate according to priority, use spaces between values and -1 for unknown values. |
--cndd_state_machine=CNDD_STATE_MACHINE_LIST | Set value of cndd_state_machine according to priority, use spaces between values and -1 for unknown values. |
mlnx_qcn -i eth2 -g parameters
mlnx_qcn -i eth2 -g statistics
Output example of running mlnx_qcn -i eth2 -g parameters:
priority 0
:
rpg_enable: 0
rppp_max_rps: 1000
rpg_time_reset: 1464
rpg_byte_reset: 150000
rpg_threshold: 5
rpg_max_rate: 40000
rpg_ai_rate: 10
rpg_hai_rate: 50
rpg_gd: 8
rpg_min_dec_fac: 2
rpg_min_rate: 10
cndd_state_machine: 0
priority 1
:
rpg_enable: 0
rppp_max_rps: 1000
rpg_time_reset: 1464
rpg_byte_reset: 150000
rpg_threshold: 5
rpg_max_rate: 40000
rpg_ai_rate: 10
rpg_hai_rate: 50
rpg_gd: 8
rpg_min_dec_fac: 2
rpg_min_rate: 10
cndd_state_machine: 0
.............................
.............................
priority 7
:
rpg_enable: 0
rppp_max_rps: 1000
rpg_time_reset: 1464
rpg_byte_reset: 150000
rpg_threshold: 5
rpg_max_rate: 40000
rpg_ai_rate: 10
rpg_hai_rate: 50
rpg_gd: 8
rpg_min_dec_fac: 2
rpg_min_rate: 10
cndd_state_machine: 0
Setting QCN parameters requires updating its value for each priority. '-1' indicates no change in the current value.
Example for setting 'rpg_enable' in order to enable QCN for priorities 3, 5, 6:
mlnx_qcn -i eth2 --rpg_enable=-1
-1
-1
1
-1
1
1
-1
Example for setting 'rpg_hai_rate' for priorities 1, 6, 7:
mlnx_qcn -i eth2 --rpg_hai_rate=60
-1
-1
-1
-1
-1
60
60