What is Unix Domain Socket?
Unix domain socket,它是*nix系统进程间通信(IPC)的一种被广泛采用方式,以文件(一般是.sock)作为socket的唯一标识(描述符),需要通信的两个进程引用同一个socket描述符文件就可以建立通道进行通信了。
UNIX Domain Socket 与 TCP/IP Socket 对比
socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。
虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),
但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。
UNIX域套接字与TCP套接字相比较,在同一台主机的传输速度前者是后者的两倍。
这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。
UNIX Domain Socket也提供面向流和面向数据包两种API接口,类似于TCP和UDP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。
Nginx & PHP-FPM使用两种交互方式的示意图
Unix domain socket减少了不必要的tcp开销,而tcp需要经过loopback,还要申请临时端口和tcp相关资源。
nginx和php-fpm 使用unix socket
将sock文件放在/dev/shm目录下,使用的内存读写更快。
1 | cd /dev/shm |
php-fpm 配置
1 | vim /etc/php/7.0/fpm/pool.d/www.conf |
nginx server块配置
1 | location ~* \.php$ { |
对比分析 文章
- Unix domain socket和Tcp socket,在性能上没有显著差距。
- 当访问压力较小时,可以使用UnixSocket,因为不会占用额外的端口、且理论上效率较高。
- 当高并发的时候,Tcp Socket能表现出更高的稳定性,且性能并不差于UnixSocket,缺点是会占用大量的临时端口,需要用内核参数优化。