压测的时候一个worker我开了50个进程。但是发现有些处理了几万个请求,有些只有几十个,差的特别多。想知道是因为什么。导致的。。我用的是腾讯的lb作为负载,但是客户端压测的时候会报出来链接超时,看woker负载也不是很大。最多的一个进程处理了3w个左右 的请求。其他的都是几百或者几十。现在没法找出具体的原因。
进程间负载均衡: 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
好的谢谢大大,昨天其实在群里问过你这个问题了。event 扩展之前已经装好了。我现在本地调用本地压测一下看看。排除下是网络的原因。还有就是reusePort 这个参数,如果我是短连接应用的话开启会有性能提示吗?
短连接会有一定的性能提升。但是进程数也不能过多,过多进程间切换开销很大。
@1:恩我现在繁忙的业务开了50个左右的进程,8核的机器。还有就是,连接关闭是由客户端关闭比较好。还是我sendmessage成功之后就直接关闭比较好呢。感觉客户端控制更好一点。
客户端收到后关闭
@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
想知道还有什么原因可能导致吗。
@1:对了报错的时候还有一个压测客户端 链接redis超时的错误,不知道跟连上wokerman有没有关系
本机压测用127.0.0.1,这样才能排除网络问题
@1:好我改了再压看看
@1: 改成tcp://127.0.0.1 还是会报链接超时。压测的时候是 脚本 ab -c 2200 -n 2200
进程间负载均衡:
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
好的谢谢大大,昨天其实在群里问过你这个问题了。event 扩展之前已经装好了。我现在本地调用本地压测一下看看。排除下是网络的原因。还有就是reusePort 这个参数,如果我是短连接应用的话开启会有性能提示吗?
短连接会有一定的性能提升。但是进程数也不能过多,过多进程间切换开销很大。
@1:恩我现在繁忙的业务开了50个左右的进程,8核的机器。还有就是,连接关闭是由客户端关闭比较好。还是我sendmessage成功之后就直接关闭比较好呢。感觉客户端控制更好一点。
客户端收到后关闭
@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
想知道还有什么原因可能导致吗。
@1:对了报错的时候还有一个压测客户端 链接redis超时的错误,不知道跟连上wokerman有没有关系
本机压测用127.0.0.1,这样才能排除网络问题
@1:好我改了再压看看
@1: 改成tcp://127.0.0.1 还是会报链接超时。压测的时候是 脚本 ab -c 2200 -n 2200