gatewayworker做的登录服, 1个gate,5个worker;另有一客户端,开了10个worker,每个worker启动时向登录服发起1000个tcp连接,发现建立连接时出现unable to connect to tcp://192.168.20.166:18310 (Unknown error)
我的测试模型有什么问题吗?出现这个问题,我感觉应该是gate在处理客户端连接时响应不过来造成的,有什么好的测试模型吗?目前的测试,这个登录服只作了账号创建,然后就没有了!
账号创建,确实是写数据库的,因为用户id是自增,所以依赖于这个创建结果,难道这个就是我的瓶颈!?
假如这个创建过程我省略了,难道就能应付这个压力测试吗,我感觉还是挺担心的!
1、首先workerman是高性能异步非阻塞IO的socket框架,所以毋庸置疑其高性能,对付高并发连接不在话下。而gatewayworker 基于 workerman开发的,那gatewayworker自然也继承了这一本领。
2、测试模型看上去没问题呢,10个worker也不过1w个连接而已。
3、高并发连接,尤其是超过1000个连接的应用,需要安装event扩展,并优化内核:
http://doc.workerman.net/appendices/kernel-optimization.html
event扩展我已经安装, 但是内核优化没做,做完了再测试下,谢谢
您好,您提供的连接是关于linux内核优化的,但是我按类似的方法在mac下找,一直没找到对应的配置文件,可有在mac下进行内核优化的文章呢,感谢!
MAC下不了解,没有 /etc/sysctl.conf 这个文件吗? 全局再搜索下sysctl.conf试试,只晓得MAC内核和LINUX内核有很多相似之处。
@614:这个文件确实没有的,不过网上有人说新建一个,我试了下,确实能生效。然后我又重新测试了下,发现遇到2类错误:
不知道是什么原因呢?
相关配置参数我列下:
[zcm@GatewayWorker 9]$ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1048576
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
[zcm@GatewayWorker 10]$sysctl -a | grep files
kern.maxfiles: 1048600
kern.maxfilesperproc: 1048576
kern.num_files: 2717
修改了客户端,在connect到server进入onclose时,1秒后重新调用建立连接接口,发现变成死循环了,难道10个worker,和1000个连接,一台电脑上都无法承受吗?
1、每个进程你不是模拟的1000个链接吗? 为什么会是死循环不停的建立连接?应该有个出口才对的
2、一台机器能承受多少连接数,是受限于内存和内核的参数设置的
3、Warning: socket_set_option(): unable to set socket option 这个报错对应源码我看了下,底层的不应该啊,是最新代码吗?
gatewayworker今年前几个月下的,Worker版本3.5.14,死循环是因为我的客户端去连接服务器,$connection->onClose里,我用了Timer::add(1, reconnect, [], false), 大概是这个样子!
1、对于那个warning,我建议你检查下你PHP版本、或执行用户的权限、或sockets扩展问题等【sockets扩展随官方PHP默认发布】
2、按你说的 onClose 这里只是 reconnect 逻辑,不冲突呢,弄个全局计数器,直接在onConnect 里发起指定计数器的长连接,其实最简单了。
php版本应该没什么问题,sockets扩展也是随php安装的,没有单独安装过!
[zcm@GatewayWorker 2]$php -v
PHP 7.2.11 (cli) (built: Oct 11 2018 16:23:06) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Xdebug v2.6.0, Copyright (c) 2002-2018, by Derick Rethans
with Zend OPcache v7.2.11, Copyright (c) 1999-2018, by Zend Technologies
执行用户的权限应该也没问题,因为客户端数量少一点就不会出错,多了才出上面的错误,所以我想主要问题可能还是在内核参数上面吧,因为用mac作服务器,他上面的内核参数不知道有没有区别,我把服务器部署到linux上试了下,没有任何错误,所以这压力还是可以承受的,只不过有可能是我测试模型的原因,10个worker进程,但每个进程中发起客户端连接是串行的,所以全部跑下来花了一二分钟,代码里有少量的打印信息!
你说的第2个问题是怕我有逻辑上的问题,导致死循环连接是吧,这个我可以修改下,问题不大!
@614:将服务器部署到linux(普通笔记本硬盘)上,客户端在mac上(SSD),服务器的gate开了3个进程,worker开了10个进程,客户端是开了10个worker,每个worker发起1000个客户端连接,全程跑下来用了近5分钟,每个客户端要处理的事情是创建账号(向mysql插入一条记录), 并有4-5条报文交互!这样的性能感觉太差了点,用的是php7.2,不知还有多少优化的空间!
客户端使用mysql创建账号?是服务端的 worker进程在处理这个业务吧?
QPS也是衡量性能高低的一个指标,性能高低也是受制于方方面面方面因素,从语言本身到脚本的优化、硬件、内存、带宽以及分布式部署等等都有影响。另外这几个链接你再参考下:
http://doc.workerman.net/315230
https://wenda.workerman.net/question/3285
http://doc.workerman.net/appendices/kernel-optimization.html
@614:客户端登录,服务端处理时会在mysql中插入一条记录创建新账号!是服务端的worker做的!