Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

unix socket vs shared memory message which is faster

I am looking at a linux server program which, for each client, creates some shared memory and uses message queues (a C++ class called from the code) in that shared memory to send messages to and fro. On the face of it this sounds like the same usage pattern as domain sockets - i.e. have a server program that sends and recvs payloads from its clients.

My question is - what extra work do unix domain sockets do? What could conceivably cause shared memory with a message queue to be faster than a socket and vice versa?

My guess is there is some overhead to calling send and recv, but I'm not exactly sure what. I might try and benchmark this, just looking for some insight before I do this.

like image 909
grasevski Avatar asked Sep 13 '14 12:09

grasevski


People also ask

Are UNIX sockets fast?

Unix domain sockets are often twice as fast as a TCP socket when both peers are on the same host. The Unix domain protocols are not an actual protocol suite, but a way of performing client/server communication on a single host using the same API that is used for clients and servers on different hosts.

How fast is a UNIX domain socket?

For comparison, the figure also shows the throughput of two Unix processes communicating through a UNIX domain socket stream on a native Linux system. ... ... these optimizations the authors achieve a maximum receive throughput of 970 Mb/s and transmit throughput of 3310 Mb/s.

Are pipes faster than sockets?

So, in relative terms, named pipes are approximately 30% faster than UNIX sockets with a block size of 100 bytes.

Is Socket an IPC mechanism?

IPC sockets (aka Unix domain sockets) enable channel-based communication for processes on the same physical device (host), whereas network sockets enable this kind of IPC for processes that can run on different hosts, thereby bringing networking into play.


1 Answers

Here is one discussion: UNIX Domain sockets vs Shared Memory (Mapped File)

I can add that sockets are very primitive, just a stream of bytes for stream sockets. This may actually be an advantage - it tends to make messages between different subsystems small and simple, promoting lean interfaces and loose coupling. But sometimes, shared memory is really useful. I used shared memory in a C++ Linux back-end to a data-intensive Google Maps application - the database was just huge (+1 Gigabyte) png rasters in shared memory.

like image 162
Erik Alapää Avatar answered Oct 29 '22 18:10

Erik Alapää