偶然看到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 检查返回内容的稳定性
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.
异常返回: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.
异常返回: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
listen.backlog = 2048
然后重启nginx和php-fpm,就很少会有502的情况了
但……是……呢……
性能依旧没有明显变化……还有待于继续学习……
那么新的结论:
Unix domain socket和Tcp socket,在性能上没有显著差距。 当访问压力较小时,可以使用UnixSocket,因为不会占用额外的端口、且理论上效率较高。 当高并发的时候,Tcp Socket能表现出更高的稳定性,且性能并不差于UnixSocket,缺点是会占用大量的临时端口,需要用内核参数优化。