[实践OK]swoole4.4.1协程和通道实现并发访问三个网站。

jackxiang 2019-7-22 17:03 | |
背景:关于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

得到三个网站的返回。


作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/10250/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2019-8-29 18:28
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]