Php-fpm TcpSocket vs UnixSocket

原创 2012年07月12日 19:25:25

偶然看到CNXCT小组的文章:http://www.cnxct.com/default-configuration-and-performance-of-nginx-phpfpm-and-tcp-socket-or-unix-domain-socket/

受到一些启发,遂google了一下,的确有很多人推荐使用php-fpm的UnixSocket的方式,尝试测试之


简单准备了一个测试页面,包含一些循环、判断、加减、以及常用的phpinfo

<?php
function make_seed() {
  list($usec,$sec)=explode(' ',microtime());
  return(float) $sec+((float)$usec*100000);
}

$i=0;
$k=0;
while($i < 1000){
        $i++;
        mt_srand(make_seed());
        if($i%2 == 0)
                $k += mt_rand();
        else
                $k -= mt_rand();
}
echo $k;

phpinfo();
?>


测试方法:

在同网段找一台服务器
使用webbench来测试
./webbench -c 500 -t 30 http://ip/cgi-bin/Liv.php

cat nginx-access.log | grep -v 200 | grep WebBench | wc -l
检查返回内容的稳定性

测试结果(每种测试3次,每次都重启nginx和php-fpm):


Tcp socket的情况

异常返回:4
Speed=14502 pages/min, 11660916 bytes/sec.
Requests: 7251 susceed, 0 failed.
异常返回:0
Speed=14480 pages/min, 11644002 bytes/sec.
Requests: 7240 susceed, 0 failed.
异常返回:1 (http 499 客户端断开连接)
Speed=14542 pages/min, 11693312 bytes/sec.
Requests: 7271 susceed, 0 failed.


Unix socket的情况(放在/dev/shm中)

异常返回:388
Speed=15194 pages/min, 11600151 bytes/sec.
Requests: 7596 susceed, 1 failed.
异常返回:271
Speed=15020 pages/min, 11644336 bytes/sec.
Requests: 7510 susceed, 0 failed.
异常返回:831
Speed=16110 pages/min, 11625129 bytes/sec.
Requests: 8054 susceed, 1 failed.

Unix socket的情况(放在/tmp中)

异常返回:230
Speed=14972 pages/min, 11632380 bytes/sec.
Requests: 7459 susceed, 27 failed.
异常返回:647
Speed=15804 pages/min, 11687138 bytes/sec.
Requests: 7898 susceed, 4 failed. 
异常返回:698
Speed=15944 pages/min, 11685551 bytes/sec.
Requests: 7972 susceed, 0 failed.


针对上面的测试结果,简单总结一下,未必客观,仅供参考:

UnixSocket性能比TcpSocket最多高不超过10%
UnixSocket的异常率比TcpSocket至少高226倍
UnixSocket返回异常时,Http Code 502,php-fpm返回11: Resource temporarily unavailable,google后尝试修改backlog,但结果无明显变化

结论:在查明UnixSocket异常原因之前,建议依然使用TcpSocket(即默认的127.0.0.1:9000方式)




附:

看到了这篇文章:http://www.hao32.com/webserver/459.html

解决了UnixSocket时,大量http code 502,11: Resource temporarily unavailable的问题,操作如下

echo 'net.core.somaxconn = 2048' >> /etc/sysctl.conf 
sysctl -p


修改 php-fpm.conf

listen.backlog = 2048

然后重启nginx和php-fpm,就很少会有502的情况了


但……是……呢……

性能依旧没有明显变化……还有待于继续学习……


那么新的结论:

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




进程笔记2:进程之间的通信(UNIX域套接字socket)

socket的地址数据结构根据不同的系统以及网络环境有不同形式。为了使不同格式地址能够被传入套接字函数,必须强制将地址结构转换为: struct sockaddr{ sa_family_t...
  • timebomb
  • timebomb
  • 2012年02月20日 17:45
  • 10785

域套接字通信域共享内存通信性能比较

域套接字通信域共享内存通信性能小小小小比较
  • timebomb
  • timebomb
  • 2014年08月07日 14:15
  • 8548

nginx、php-fpm默认配置与性能–TCP socket还是unix domain socket

前几天看到一篇博客,提到php所在服务器在大并发情况下,频繁创建TCP短连接,而其所在服务器的2MSL时间过长,导致没有端口可用,系统无法创建TCP socket,而大量报错。博主在后面给的解决方案是...
  • hemengsi123
  • hemengsi123
  • 2015年08月19日 21:09
  • 945

Php TcpSocket还是UnixSocket?

 偶然看到CNXCT小组的文章:http://www.cnxct.com/default-configuration-and-performance-of-nginx-phpfpm-and-tc...
  • abv123456789
  • abv123456789
  • 2014年08月11日 11:02
  • 1123

nginx 和 php-fpm 通信使用unix socket还是TCP,及其配置

前言 nginx和fastcgi的通信方式有两种,一种是TCP的方式,一种是unix socke方式。两种方式各有优缺点,这里先给出两种的配置方法,然后再对性能、安全性等做出总结。 配置指南 T...
  • pcyph
  • pcyph
  • 2015年06月16日 06:43
  • 4231

Unix域套接字(Unix Domain Socket)介绍

在Linux系统中,有很多进程间通信方式,套接字(Socket)就是其中的一种。但传统的套接字的用法都是基于TCP/IP协议栈的,需要指定IP地址。如果不同主机上的两个进程进行通信,当然这样做没什么问...
  • Roland_Sun
  • Roland_Sun
  • 2015年12月16日 15:48
  • 8492

nginx、php-fpm默认配置与性能–TCP socket还是unix domain socket

类似经历 之所以多这篇文章兴趣这么高,是因为在前段时间,末学也经历了一件类似的优化历程,先简短的描述下我们的服务器架构。如图 一款webgame 粗略架构图 想必...
  • lifushan123
  • lifushan123
  • 2015年05月14日 00:22
  • 871

php-fpm 和 nginx 网络模型差别

nginx 是master-worker  其中master只是 负责管理worker进程 (接受子进程信号 拉起子进程 接受用户操作关闭nginx) 不负责监听端口 php-fpm ma...
  • pzqingchong
  • pzqingchong
  • 2016年10月18日 20:00
  • 204

lnmp使用socket方式连接nginx优化php-fpm性能

lnmp使用socket方式连接nginx优化php-fpm性能 Nginx连接fastcgi的方式有2种:TCP和unix domain socket 什么是Unix domai...
  • reblue520
  • reblue520
  • 2016年10月27日 14:59
  • 826

UNIX网络编程--socket中的同步/异步 阻塞/非阻塞

UNIX网络编程--socket中的同步/异步 阻塞/非阻塞 分类: linux编程2013-09-23 15:21 138人阅读 评论(0) 收藏 举报 UNIX网络编程同步异步...
  • pi9nc
  • pi9nc
  • 2013年09月24日 15:06
  • 1931
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Php-fpm TcpSocket vs UnixSocket
举报原因:
原因补充:

(最多只允许输入30个字)