  Interprocess communication, IPC, is one of the most fundamental functions of
a modern operating system, playing an essential role in the fabric of
contemporary applications. This report conducts an investigation in FreeBSD of
the real world performance considerations behind two of the most common IPC
mechanisms; pipes and sockets. A simple benchmark provides a fair sense of
effective bandwidth for each, and analysis using DTrace, hardware performance
counters and the operating system's source code is presented. We note that
pipes outperform sockets by 63% on average across all configurations, and
further that the size of userspace transmission buffers has a profound effect
on performance - larger buffers are beneficial up to a point (~32-64 KiB) after
which performance collapses as a result of devastating cache exhaustion. A deep
scrutiny of the probe effects at play is also presented, justifying the
validity of conclusions drawn from these experiments.
