Background
In a high-completion-rate workload, we observed that calling progress several
times in one scheduling iteration improved throughput. The improvement became
smaller after a few progress calls.
This led us to look at the difference between the RC transports:
rc_verbs can poll multiple work completions in one call through
RX_MAX_POLL and TX_MAX_POLL.
- The
rc_mlx5 Direct Verbs path normally processes one RX CQE and, when TX
polling is selected, one TX CQE per interface progress call.
We would like to understand whether bounded batch CQ draining would be a
reasonable optimization for rc_mlx5.
Questions
- Is processing one CQE per
rc_mlx5 progress call an intentional part of
the UCT design, for example to preserve latency or fairness?
- Would it be consistent with the UCT progress model for
rc_mlx5 to drain a
bounded number of CQEs in one progress call?
- If supported, should the limit reuse
RX_MAX_POLL and TX_MAX_POLL, or
should it be mlx5-specific?
- Which layer would be preferred for this behavior: the mlx5 CQ polling
helper, the rc_mlx5 RX/TX progress functions, or the upper worker
progress loop?
- Are there known constraints, such as RX/TX fairness, multiple interfaces on
one worker, CQE zipping, MP-RQ or tag matching, that make batch draining
unsuitable for rc_mlx5?
Background
In a high-completion-rate workload, we observed that calling progress several
times in one scheduling iteration improved throughput. The improvement became
smaller after a few progress calls.
This led us to look at the difference between the RC transports:
rc_verbscan poll multiple work completions in one call throughRX_MAX_POLLandTX_MAX_POLL.rc_mlx5Direct Verbs path normally processes one RX CQE and, when TXpolling is selected, one TX CQE per interface progress call.
We would like to understand whether bounded batch CQ draining would be a
reasonable optimization for
rc_mlx5.Questions
rc_mlx5progress call an intentional part ofthe UCT design, for example to preserve latency or fairness?
rc_mlx5to drain abounded number of CQEs in one progress call?
RX_MAX_POLLandTX_MAX_POLL, orshould it be mlx5-specific?
helper, the
rc_mlx5RX/TX progress functions, or the upper workerprogress loop?
one worker, CQE zipping, MP-RQ or tag matching, that make batch draining
unsuitable for
rc_mlx5?