Tuning for high throughput low latency #25
-
Hi. I've been experimenting with NORM, and found it's really excellent at providing reliable multicast communications. My use case matches the stream type of connection, for high data rate, low latency applications. I found that defaults in the NORM system really aren't conductive to this sort of use case. For example, the default socket baud rate is 64000 bits/s. Are there other parameters users should tune to improve the performance of low latency high data rate streaming use cases? |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 7 replies
-
There are a number of things that can be set or tweaked to get higher performance and lower latency. What sort of realm of throughput are you looking for? We have (with a lot of coaxing) gotten to as much as 6-8 Gbps on 10 Gbps connections in some testing. At those higher rates, setting larger socket buffer sizes and other factors help. And those rates, the FEC parameters are zeroed since computation of the FEC becomes a bottleneck. But NORM can work as an efficient ARQ protocol even without FEC enabled. FEC does maintain reliable delivery efficiency up to larger scale group sizes, but there are use cases where this isn't necessary and NORM can work without it. Another thing related to ARQ operation that can impact throughput is NORM buffer sizes, the default timer-based flow control the sender observes, and the RTT time among your sender(s) and receiver(s). Following one of the examples to do explicit ACK-based flow control (see normStreamer, normMsgr, or normCast examples in norm/examples) can help here rather than just following the timer-based flow control discipline. Similarly, another factor in NORM's ARQ protocol are some "backoff" timers used to suppress extraneous, duplicative NACK feedback as multicast group sizes grow. These "backoff" timeouts add latency to the ARQ process and latency can be reduced by zeroing these ( If high assurance data delivery for streaming purposes is sufficient without absolutely guaranteed reliable delivery, another way that NORM can be used is to configure "auto parity" that transmits some FEC "repair" packets at the end of each logical packet coding block without waiting for any receivers to NACK. This adds transmission overhead, of course, but can provide lower latency delivery than the ARQ. You can use "auto parity" in conjunction with NACking or run silent receivers that do not NACK but rely upon the "auto parity" alone for high assurance delivery. With this type of operation you can set smaller FEC block sizes to manage latency and used the "maxDelay" parameter of the NormSetSilentReceiver() call to limit how many partially-received FEC blocks a receiver will buffer before releasing the data to the application. The reason it buffers by default is that in a system with a mix of NACKing and silent receivers, the silent receivers can also often benefit from repair packet transmission elicited by the NACKing receivers. If you provide some more details on your use case, I may be able to help guide you on how to use some of these options and other tunable features. Yes - the default parameters are pretty antiquated (64 kbps, etc) and perhaps some more modern parameters (e.g., enabling TCP-friendly congestion control) should be used as default. In the ZeroMQ binding for NORM, I do something like that as opposed to the examples, etc. |
Beta Was this translation helpful? Give feedback.
There are a number of things that can be set or tweaked to get higher performance and lower latency. What sort of realm of throughput are you looking for? We have (with a lot of coaxing) gotten to as much as 6-8 Gbps on 10 Gbps connections in some testing. At those higher rates, setting larger socket buffer sizes and other factors help. And those rates, the FEC parameters are zeroed since computation of the FEC becomes a bottleneck. But NORM can work as an efficient ARQ protocol even without FEC enabled. FEC does maintain reliable delivery efficiency up to larger scale group sizes, but there are use cases where this isn't necessary and NORM can work without it. Another thing related to AR…