详情参见 本链接
总结一下,使用Unix socket与直接使用TCP具有以下不同:
- UNIX socket使用文件系统作为URI,因此可以使用文件系统的权限管理控制哪些进程可以连接该Socket
- localhost回环接口被有意设计为无视“用于连接本地”这一信息,因此系统没有对回环接口上的TCP连接较之普通TCP连接做任何额外的优化。这意味着它是真正的TCP连接:超过MTU-size的包将被分割为多个数据段,每个数据段将需要包装头部,计算checksum,写入发送缓冲区,进行路由,等等,再到达接收缓冲区。UNIX socket则利用了“用于连接本地”这一信息进行了优化,在传输时直接将数据写入接收缓冲区。
Overhead
When the server and client benchmark programs run on the same box, both the TCP/IP loopback and unix domain sockets can be used. Depending on the platform, unix domain sockets can achieve around 50% more throughput than the TCP/IP loopback (on Linux for instance). The default behavior of redis-benchmark is to use the TCP/IP loopback.
Factors impacting redis performance
参考 redis 对 TCP over lo和 UNIX socket 进行 benchmark 的结果,根据平台的不同,UNIX socket 能较 TCP over lo 多承担50%左右的吞吐。
但在频繁使用 redis pipeline 的情况下,TCP over lo 较 UNIX socket 产生的 overhead 将趋向于降低。这是符合直觉的,使用 pipeline 相当于将 n 个指令产生的 n 次 TCP wrapping overhead 降低至1次(或若干次,取决于 MTU )。