Unix Domain Socket详解

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
2
3
4
cd /dev/shm
touch php7.0-fpm.sock
chown www-data:www-data php7.0-fpm.sock
chmod 777 php7.0-fpm.sock

php-fpm 配置

1
2
3
4
vim /etc/php/7.0/fpm/pool.d/www.conf
listen= /dev/shm/php7.0-fpm.sock
listen.owner = www-data
listen.group = www-data

nginx server块配置

1
2
3
4
5
location ~* \.php$ {
fastcgi_pass unix:/dev/shm/php7.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}

对比分析 文章

  • Unix domain socket和Tcp socket,在性能上没有显著差距。
  • 当访问压力较小时,可以使用UnixSocket,因为不会占用额外的端口、且理论上效率较高。
  • 当高并发的时候,Tcp Socket能表现出更高的稳定性,且性能并不差于UnixSocket,缺点是会占用大量的临时端口,需要用内核参数优化。

参考文章

0%