背景:关于Go的一协程和通道,PHP也是可以的。
实践中发现swoole去获取微信授权,在单队列网卡和多队列(2个物理核心,8逻辑CPU)的一个情况:
单队列:
8CPU8G:1000并发。
两队列:
8CPU8G:10000并发1W的TPS。
#ls /sys/class/net/enp0s3/queues/
rx-0 tx-0
Top的Cache有点多:
7111104 buff/cache
队列来自:https://jackxiang.com/post/10079/
技术:
也就是说三次访问以最长那个,在一些微信请求时以PHP-FPM进行阻塞时,80进程也就400个请求,用这个swoole的请求也就不存在这个问题,可以实现同时发出curl请求,而不是卡在那儿。
也即使是Mysql的访问,用协程,如果一次卡20秒,那么影响也就那一个请求,而不是所有的后面请求就排队等待,这也就是它的优势。
其实现方式,应该是用socket的句柄结合Epoll的事件驱动经过reactor的挂起和唤醒,用到系统的内核进行通知,性能是很不错的。也就是说:
1)必须开端口。
2)那个句柄数要设置大一些才行,一般设置个10万左右。
3)协程对内存的要求较高,内存大一些好。
系统三大杀手,一是内存拷贝(PHP内核支持写时拷贝)、二是系统调用、进程线程切换,而协程经过测试PHP切换一次150纳秒,而Go得160纳秒。
========================================================================================
#cat curl.php
php curl.php
PHP Fatal error: Swoole\Coroutine\Http\Client::__construct(): need to use `--enable-openssl` to support ssl when compiling swoole. in /data/www/coding.jackxiang.com/curl.php on line 6
[2019-07-22 16:53:17 $4830.0] WARNING swManager_check_exit_status: worker#0 abnormal exit, status=255, signal=0
curl 127.0.0.1:8000
curl: (52) Empty reply from server
重新编译:
configure: WARNING: unrecognized options: --enable-coroutine ,最新版本好像把这个给去了。
/usr/local/src/swoole-src-4.4.1/include/swoole.h:591:25: fatal error: openssl/ssl.h: No such file or directory
#include <openssl/ssl.h>
还是不行,参考了一下:
http://www.21yunwei.com/archives/5196
重新phpize再来一次就好了,估计是和phpize生成的configure有关吧。
mv /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/swoole.so /usr/local/php/ext/.
mv: overwrite ‘/usr/local/php/ext/./swoole.so’? y
启动服务端:
#php curl.php
strace -ff -o /tmp/s.txt -tt php curl.php
连接测试:
curl 127.0.0.1:8000
得到三个网站的返回。
实践中发现swoole去获取微信授权,在单队列网卡和多队列(2个物理核心,8逻辑CPU)的一个情况:
单队列:
8CPU8G:1000并发。
两队列:
8CPU8G:10000并发1W的TPS。
#ls /sys/class/net/enp0s3/queues/
rx-0 tx-0
Top的Cache有点多:
7111104 buff/cache
队列来自:https://jackxiang.com/post/10079/
技术:
也就是说三次访问以最长那个,在一些微信请求时以PHP-FPM进行阻塞时,80进程也就400个请求,用这个swoole的请求也就不存在这个问题,可以实现同时发出curl请求,而不是卡在那儿。
也即使是Mysql的访问,用协程,如果一次卡20秒,那么影响也就那一个请求,而不是所有的后面请求就排队等待,这也就是它的优势。
其实现方式,应该是用socket的句柄结合Epoll的事件驱动经过reactor的挂起和唤醒,用到系统的内核进行通知,性能是很不错的。也就是说:
1)必须开端口。
2)那个句柄数要设置大一些才行,一般设置个10万左右。
3)协程对内存的要求较高,内存大一些好。
系统三大杀手,一是内存拷贝(PHP内核支持写时拷贝)、二是系统调用、进程线程切换,而协程经过测试PHP切换一次150纳秒,而Go得160纳秒。
========================================================================================
#cat curl.php
php curl.php
PHP Fatal error: Swoole\Coroutine\Http\Client::__construct(): need to use `--enable-openssl` to support ssl when compiling swoole. in /data/www/coding.jackxiang.com/curl.php on line 6
[2019-07-22 16:53:17 $4830.0] WARNING swManager_check_exit_status: worker#0 abnormal exit, status=255, signal=0
curl 127.0.0.1:8000
curl: (52) Empty reply from server
重新编译:
configure: WARNING: unrecognized options: --enable-coroutine ,最新版本好像把这个给去了。
/usr/local/src/swoole-src-4.4.1/include/swoole.h:591:25: fatal error: openssl/ssl.h: No such file or directory
#include <openssl/ssl.h>
还是不行,参考了一下:
http://www.21yunwei.com/archives/5196
重新phpize再来一次就好了,估计是和phpize生成的configure有关吧。
mv /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/swoole.so /usr/local/php/ext/.
mv: overwrite ‘/usr/local/php/ext/./swoole.so’? y
启动服务端:
#php curl.php
strace -ff -o /tmp/s.txt -tt php curl.php
连接测试:
curl 127.0.0.1:8000
得到三个网站的返回。
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/10250/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2019-8-29 18:28
评论列表