1. 使用用unix socket来代替tcp socket进行nginx,php之间的数据传输。
因为tcp 四层协议并不只是逻辑上存在的,在操作系统内核里都有它们对应的C代码的,那么一次请求,相当于nginx这边是四层从上往下走,
然后到php进程那边,四层协议从下往上走,然后php执行完脚本产生html,把数据再在四层里从上往下走输送到nginx这边,而等在这边的nginx进程把那些数据又从下往上走,
然后经过一系列处理,再在四层协议里去走一遍,这次是经过eth0接口返回浏览器了。
单次请求,相当于单单nginx,php之间,那四层协议的代码都走了4次。如果高并发时,
亿级请求时呢,要消耗多少内存和cpu和时间!!
2. 如果用unix socket,
当然没有那4层协议的C代码了,虽然说也是要用到系统调用的,socket,bind,send,recv这些函数接口都一样,但底层实现不一样。
简而言之,unix socket 就是buffer与bufer之间数据交换。而一般的大型网站,
都可以用unix socket 的,除非nginx 进程,php进程不在同一台机器上。
数据实例:
这个有时间做一次压力测试进行数据比较下:
使用 ab 压力测试工具请求 php 文件, php 文件中简单调用数据库,一次插入,一次查询。
ab -n 100000 -c 2000 http://10.88.230.200/test.php
1. tcp方式:
Time taken for tests: 584.813 seconds
Complete requests: 100000
Failed requests: 8195
(Connect: 0, Receive: 0, Length: 8195, Exceptions: 0)
Write errors: 0
Non-2xx responses: 8195
Total transferred: 187038170 bytes
HTML transferred: 171338425 bytes
Requests per second: 170.99 [#/sec] (mean)
Time per request: 11696.268 [ms] (mean)
Time per request: 5.848 [ms] (mean, across all concurrent requests)
Transfer rate: 312.33 [Kbytes/sec] received
2. socket方式
Time taken for tests: 32.492 seconds
Complete requests: 100000
Failed requests: 1462
(Connect: 0, Receive: 0, Length: 1462, Exceptions: 0)
Write errors: 0
Non-2xx responses: 98538
Total transferred: 34959084 bytes
HTML transferred: 19751774 bytes
Requests per second: 3077.69 [#/sec] (mean)
Time per request: 649.838 [ms] (mean)
Time per request: 0.325 [ms] (mean, across all concurrent requests)
Transfer rate: 1050.72 [Kbytes/sec] receive
从完成同样的请求时间来看socket方式要比tcp方式快了10倍
服务器的压力其实是没有太大区别只是php处理请求时间差别很多。
另外,socket方式在处理请求的速度方面比tcp有明显优势,但在压力高的情况下,稳定性会差点。我用上面的ab模拟高压力的情况下,用浏览器再访问该服务器时,会出现大量的php-timeout502错误,相对tcp模式来说,出现错误几率要高20-30%(这是在压力不是特别高,服务器压力在30-40%的时候,如果压力再高的话,两种模式出现502几率都差不多很高)。