xyzt
xyzt

Reputation: 1311

Which method do you suggest for reading multicast stream in Linux?

I have written a program in Linux using C/C++ that reads multicast packets and tries to understand that a specific event occurred or not as quickly as possible. Latency is the key point here.

In the protocol, first two bytes represent the message type. In my current implementation, I read the first two bytes and decide how many bytes I should read for the payload according to the message type. Namely, I perform 2 read operations for 1 packet. One of the read operations is for the packet length and the other is for the payload. So, there are 2 I/O operations.

Alternatively, I could do that, I read as much as I can, check the first 2 bytes, let's say it is N, go for N bytes and form the packet1 and packet2. If there are remaining bytes after reading packet1 and packet2, read more bytes and again process the byte buffer as above. In this method, I do 1 I/O but it is required to traverse in the byte buffer.

Which one is faster theoretically? I know I must implement and measure both but I just wanted to hear your suggestions.

Thanks

Upvotes: 2

Views: 343

Answers (1)

Ctx
Ctx

Reputation: 18410

The fastest method I know of is:

  • Open a raw packet socket (AF_PACKET)
  • Implement a BPF filter, that filters the packets you need as specific as possible
  • Switch to a memory-mapped ringbuffer (PACKET_MMAP/PACKET_RX_RING)
  • Read the packets directly from memory instead of using recv(). This can be done using poll() or, alternatively, by busy-looping over the in-memory packet meta-data to avoid the poll() syscall.
  • Process the packet directly in the ring-buffer (zero-copy)
  • Mark the buffer as "free for reuse"

This way, no syscalls at all are necessary, the path through the kernel is short and the latency should be minimal.

For more information, see the packet mmap kernel documentation

Upvotes: 2

Related Questions