wokerker进程处理任务不均匀

codeninjia

压测的时候一个worker我开了50个进程。但是发现有些处理了几万个请求,有些只有几十个,差的特别多。想知道是因为什么。导致的。。我用的是腾讯的lb作为负载,但是客户端压测的时候会报出来链接超时,看woker负载也不是很大。最多的一个进程处理了3w个左右 的请求。其他的都是几百或者几十。现在没法找出具体的原因。

2991 1 1
1个回答

walkor

进程间负载均衡:
workerman默认是抢占式的,谁空闲谁去接受连接处理请求。这说明你的业务不用开这么多进程。

因为CPU数量有限,开很多进程后并不是每个进程都平均处理请求就好。
比如2个进程就能干完的活儿,非要50个进程一起干,那每个cpu处理的进程数就变多,
进程间切换的开销变大,整个系统吞吐量反而变低。
进程数不宜太多,关于http://doc.workerman.net/315230

如果非要平均,可以设置 $woker->reusePort = true,关于http://doc.workerman.net/315142,这样每个进程处理的连接数是平均的。

连接超时问题原因:
原因很多,要具体情况具体分析。
比如服务器负载变高、业务处理不够快导致backlog满、网络带宽不够(包括本地局域网带宽)、系统内核没有优化(包括压测端服务器)、网络环境差等等

http://doc.workerman.net/315302
还有,压测要给workerman安装event扩展,http://doc.workerman.net/315116

  • codeninjia 2017-11-10

    好的谢谢大大,昨天其实在群里问过你这个问题了。event 扩展之前已经装好了。我现在本地调用本地压测一下看看。排除下是网络的原因。还有就是reusePort 这个参数,如果我是短连接应用的话开启会有性能提示吗?

  • walkor 2017-11-10

    短连接会有一定的性能提升。但是进程数也不能过多,过多进程间切换开销很大。

  • codeninjia 2017-11-10

    @1:恩我现在繁忙的业务开了50个左右的进程,8核的机器。还有就是,连接关闭是由客户端关闭比较好。还是我sendmessage成功之后就直接关闭比较好呢。感觉客户端控制更好一点。

  • walkor 2017-11-10

    客户端收到后关闭

  • codeninjia 2017-11-10

    @1:我现在本地直接链接本地的服务 我用ab 压测 ab -c 2000 -n 2000 还是会报报错
    connect to tcp://10.8.6.98:13120 (Connection timed out)。已经优化过内核了。ulimit 也改成10w了。 $woker->reusePort 这个参数我也设置为true了, wokerman的运行信息如下

    Workerman version:3.5.1 PHP version:7.1.10
    start time:2017-11-10 11:38:02 run 0 days 0 hours
    load average: 0.26, 1, 1 event-loop:\Workerman\Events\Event
    16 workers 90 processes

    想知道还有什么原因可能导致吗。

  • codeninjia 2017-11-10

    @1:对了报错的时候还有一个压测客户端 链接redis超时的错误,不知道跟连上wokerman有没有关系

  • walkor 2017-11-10

    本机压测用127.0.0.1,这样才能排除网络问题

  • codeninjia 2017-11-10

    @1:好我改了再压看看

  • codeninjia 2017-11-10

    @1: 改成tcp://127.0.0.1 还是会报链接超时。压测的时候是 脚本 ab -c 2200 -n 2200

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