gateway四个进程分别占满一半cpu

joytom

gatewayworker框架,开启了四个business进程、四个gateway进程。

使用:ps aux命令查看的:

root      3225  0.0  0.0 481304 10032 ?        S    Mar03   0:00 WorkerMan: master process  start_file=/opt/piplin/Gateway/start.php
root      3226  1.4  0.0 483352 15444 ?        S    Mar03  12:54 WorkerMan: worker process  IMBusinessWorker none
root      3228  1.4  0.0 483352 15148 ?        S    Mar03  12:54 WorkerMan: worker process  IMBusinessWorker none
root      3230 47.3  0.0 497724 28052 ?        S    Mar03 433:32 WorkerMan: worker process  IMGateway websocket://im.800hr.com:8002
root      3231 50.0  0.0 498044 28308 ?        R    Mar03 458:51 WorkerMan: worker process  IMGateway websocket://im.800hr.com:8002
root      3232 53.1  0.0 500192 30344 ?        R    Mar03 487:12 WorkerMan: worker process  IMGateway websocket://im.800hr.com:8002
root      3233 56.0  0.0 501200 31360 ?        R    Mar03 513:52 WorkerMan: worker process  IMGateway websocket://im.800hr.com:8002
root      3234  0.0  0.0 481304  9320 ?        S    Mar03   0:00 WorkerMan: worker process  Register text://0.0.0.0:1239
root      4198  1.3  0.0 483352 13072 ?        S    Mar03  11:24 WorkerMan: worker process  IMBusinessWorker none
root     14243  1.5  0.0 483352 13064 ?        S    08:50   0:10 WorkerMan: worker process  IMBusinessWorker none

服务器配置信息:

内存:62g
cup核数:10核
Speed: 10000Mb/s
已优化Linux内核、已安装扩展

业务请求量:1k——8k

想知道哪方面的原因会导致cpu上升?如果我提供的这些信息不能让你判断导致cpu上升的原因,可否列举几种导致cpu上升的原因?

1163 3 3
3个回答

Tinywan

需要贴出详细的信息

  • 服务器配置?
  • 请求量是多少?
iqige

客户端频繁建立连接?

  • 暂无评论
walkor

压测cpu上涨很正常,尤其业务调用api接口较多时。

除了几个操作client_id的接口,其它所有api接口(例如Gateway::sendToGroup() Gateway::sendToUid()等)被调用时都要向所有gateway进程发起请求,那么一个客户端请求在gatewayWorker里会裂变成多次gateway网络请求,复杂的逻辑可能裂变成数十次gateway网络请求。所以看起来是客户端发起几千请求,但是gatewayWorker内部实际上可能处理几万的内部网络请求调用,这会增加cpu调用消耗。然而一台服务器的极限网络请求可能就20万(好的服务器可能多一些),所以很容易成为瓶颈。

所以想办法减少不必要的接口调用,例如isUidOnline(),例如不调用session相关接口,直接用$_SESSION变量等。
开启尽量少的gateway进程,例如只开1个gateway进程一般会降低cpu消耗。

重点
最后比较重点的说下,GatewayWorker是一个长连接分布式即时通讯框架,它所对应的业务模型是类似聊天、物联网这种维持着大量连接,但是通讯量并不大的业务。所以压测时应该按照你实际业务场景压测,不能按照传统http业务模型压测。以传统http业务模型去压测10个客户端就可以把服务器cpu打满,那不能认为服务器只能支持10个连接。以QQ聊天为例,一个2000人在线的群里每秒产生一条消息就已经刷屏了,10个这样的群20000人在线每秒产生的请求数就几个,这样的请求量在服务端根本看不到什么cpu消耗。所以重点是评估下自己的业务模型,需要维持多少客户端在线,每个客户端多久向服务端发起一次请求,然后再查看cpu消耗。

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