gatewayworker多客户端并发处理太弱了吗?

zhouciming

gatewayworker做的登录服, 1个gate,5个worker;另有一客户端,开了10个worker,每个worker启动时向登录服发起1000个tcp连接,发现建立连接时出现unable to connect to tcp://192.168.20.166:18310 (Unknown error)
 
我的测试模型有什么问题吗?出现这个问题,我感觉应该是gate在处理客户端连接时响应不过来造成的,有什么好的测试模型吗?目前的测试,这个登录服只作了账号创建,然后就没有了!
 
账号创建,确实是写数据库的,因为用户id是自增,所以依赖于这个创建结果,难道这个就是我的瓶颈!?
假如这个创建过程我省略了,难道就能应付这个压力测试吗,我感觉还是挺担心的!
 

5459 1 0
1个回答

blogdaren

1、首先workerman是高性能异步非阻塞IO的socket框架,所以毋庸置疑其高性能,对付高并发连接不在话下。而gatewayworker 基于 workerman开发的,那gatewayworker自然也继承了这一本领。
2、测试模型看上去没问题呢,10个worker也不过1w个连接而已。
3、高并发连接,尤其是超过1000个连接的应用,需要安装event扩展,并优化内核:
http://doc.workerman.net/appendices/kernel-optimization.html

  • zhouciming 2018-12-08

    event扩展我已经安装, 但是内核优化没做,做完了再测试下,谢谢

  • zhouciming 2018-12-10

    您好,您提供的连接是关于linux内核优化的,但是我按类似的方法在mac下找,一直没找到对应的配置文件,可有在mac下进行内核优化的文章呢,感谢!

  • blogdaren 2018-12-10

    MAC下不了解,没有 /etc/sysctl.conf 这个文件吗? 全局再搜索下sysctl.conf试试,只晓得MAC内核和LINUX内核有很多相似之处。

  • zhouciming 2018-12-10

    @614:这个文件确实没有的,不过网上有人说新建一个,我试了下,确实能生效。然后我又重新测试了下,发现遇到2类错误:

    1. connection->onError: code=1, msg=connect 192.168.20.166:18310 fail after 72.1939 seconds
    2. Warning: socket_set_option(): unable to set socket option [22]: Invalid argument in /Users/zcm/work/mini/git/GatewayWorker/vendor/workerman/workerman/Connection/AsyncTcpConnection.php on line 311

    不知道是什么原因呢?

    相关配置参数我列下:
    [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

  • zhouciming 2018-12-10

    修改了客户端,在connect到server进入onclose时,1秒后重新调用建立连接接口,发现变成死循环了,难道10个worker,和1000个连接,一台电脑上都无法承受吗?

  • blogdaren 2018-12-10

    1、每个进程你不是模拟的1000个链接吗? 为什么会是死循环不停的建立连接?应该有个出口才对的
    2、一台机器能承受多少连接数,是受限于内存和内核的参数设置的
    3、Warning: socket_set_option(): unable to set socket option 这个报错对应源码我看了下,底层的不应该啊,是最新代码吗?

  • zhouciming 2018-12-10

    gatewayworker今年前几个月下的,Worker版本3.5.14,死循环是因为我的客户端去连接服务器,$connection->onClose里,我用了Timer::add(1, reconnect, [], false), 大概是这个样子!

  • blogdaren 2018-12-10

    1、对于那个warning,我建议你检查下你PHP版本、或执行用户的权限、或sockets扩展问题等【sockets扩展随官方PHP默认发布】
    2、按你说的 onClose 这里只是 reconnect 逻辑,不冲突呢,弄个全局计数器,直接在onConnect 里发起指定计数器的长连接,其实最简单了。

  • zhouciming 2018-12-10

    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个问题是怕我有逻辑上的问题,导致死循环连接是吧,这个我可以修改下,问题不大!

  • zhouciming 2018-12-11

    @614:将服务器部署到linux(普通笔记本硬盘)上,客户端在mac上(SSD),服务器的gate开了3个进程,worker开了10个进程,客户端是开了10个worker,每个worker发起1000个客户端连接,全程跑下来用了近5分钟,每个客户端要处理的事情是创建账号(向mysql插入一条记录), 并有4-5条报文交互!这样的性能感觉太差了点,用的是php7.2,不知还有多少优化的空间!

  • blogdaren 2018-12-11

    客户端使用mysql创建账号?是服务端的 worker进程在处理这个业务吧?

  • blogdaren 2018-12-11

    QPS也是衡量性能高低的一个指标,性能高低也是受制于方方面面方面因素,从语言本身到脚本的优化、硬件、内存、带宽以及分布式部署等等都有影响。另外这几个链接你再参考下:
    http://doc.workerman.net/315230
    https://wenda.workerman.net/question/3285
    http://doc.workerman.net/appendices/kernel-optimization.html

  • zhouciming 2018-12-17

    @614:客户端登录,服务端处理时会在mysql中插入一条记录创建新账号!是服务端的worker做的!

年代过于久远,无法发表回答
🔝