首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
基于Swoole搭建的websocketServer的高并发压力测试问题(Jmeter)
基于Swoole搭建的websocketServer的高并发压力测试问题(Jmeter) 环境:阿里云服务器,4G内存 服务器:nginx websocket底层:swoole Php代码:基于swoole封装了一层分发 Php代码位置:https://github.com/bloodtear/template_websocket 缓存:redis 测试软件: JMETER4, websocket插件 测试条件:纯并发 简单说明 1 php的代码基本上就是为了处理业务逻辑,简单的封装了一层,cache用redis都是单例,感觉性能影响不大。 对所有的消息都是存到redis的message_list,然后send_all(message)处理, 循环所有的连接fd,发送消息过去。只为测试性能 2 在open连接, receive接收信息, 处理逻辑 的代码块 加上了缓存redis到对应的List(open_list,receive_list,message_list)。 2 用jmeter测试,发现300还比较正常, JMETER上看结果 400就开始抗不住了,有时候正常,有时候丢50包。 600就基本上丢100了, 1000就开始丢700的包 从redis记录来看 300 都是正常,open, recieve, message 都是300 400开始就有问题了,有时候是正常, 有时候是 open: 350, recieve : 350, message: 350 再加压跑的话,会发现甚至 recieve 数值 小于 open数据 也就是说,连接上,但是没收到数据。 想求助各位 1 是我的代码封装问题吗?导致性能下降,接收不到数据? 2 是jmeter的问题吗?没发送数据过去? 3 是需要消息队列吗? 但是我open的时候就被丢失了,就基本上有队列也没效果了。 更何况receive的时候有时候跟不上open的数量,也会丢一部分。 求助,不知道如何入手,请高人指点!!! 谢谢!!!!
发布于7年前 · 12 次浏览 · 来自
提问
a
axwing
基于Swoole搭建的websocketServer的高并发压力测试问题(Jmeter) 环境:阿里云服务器,4G内存 服务器:nginx websocket底层:swoole Php代码:基于swoole封装了一层分发 Php代码位置:https://github.com/bloodtear/template_websocket 缓存:redis 测试软件: JMETER4, websocket插件 测试条件:纯并发 简单说明 1 php的代码基本上就是为了处理业务逻辑,简单的封装了一层,cache用redis都是单例,感觉性能影响不大。 对所有的消息都是存到redis的message_list,然后send_all(message)处理, 循环所有的连接fd,发送消息过去。只为测试性能 2 在open连接, receive接收信息, 处理逻辑 的代码块 加上了缓存redis到对应的List(open_list,receive_list,message_list)。 2 用jmeter测试,发现300还比较正常, JMETER上看结果 400就开始抗不住了,有时候正常,有时候丢50包。 600就基本上丢100了, 1000就开始丢700的包 从redis记录来看 300 都是正常,open, recieve, message 都是300 400开始就有问题了,有时候是正常, 有时候是 open: 350, recieve : 350, message: 350 再加压跑的话,会发现甚至 recieve 数值 小于 open数据 也就是说,连接上,但是没收到数据。 想求助各位 1 是我的代码封装问题吗?导致性能下降,接收不到数据? 2 是jmeter的问题吗?没发送数据过去? 3 是需要消息队列吗? 但是我open的时候就被丢失了,就基本上有队列也没效果了。 更何况receive的时候有时候跟不上open的数量,也会丢一部分。 求助,不知道如何入手,请高人指点!!! 谢谢!!!!
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2019-09-22
T
The_Unicorn
你需要跟踪程序的运行。 - 查看错误日志,设置`log_file`,观察错误信息 - 使用 `strace` 工具查看程序运行 - 检查 `ulimit -n` 等内核设置是否正确
赞
0
回复
2019-09-25
♥
♥ゝ墨先生ノ
感谢本尊的回复, 尝试结果: 1 log_file写入server的set中,log_level调低至0 debug,依然没有Log输出。。。 3 ulimit -n 本机是1024,但是服务器是65525。 2 strace结果,出现一堆的细腻,看不太懂,不过感觉这个东西输出的信息最多。最有戏看出问题。 感谢您的回复,有进展我会告知您的,谢谢!
赞
0
回复
2019-09-25
唐
唐家三少
补充下.log已经开成777 了,还是没内容
赞
0
回复
2019-09-25
梦
梦醒
1 我的基于swoole的简易框架代码在这里 https://github.com/bloodtear/template_websocket。 实际上就是一个on_message的里面,加了一个reflect映射而已。。。 2 strance命令发现看不出什么,然后百度了下命令的参数,加了一些参数 命令 strace -o ~/swoole_server.php -f -F -tt -p 3127 (通过ps -ef | grep 查询到的Pid) 3 看结果,发现有unfinished ,我尝试了5
赞
0
回复
2019-09-26
M
Marco/
补充下业务逻辑说明, 现在实际上除了HTTP网站封装的登录之外,引入了一个ROOM的概念, 所有人都登录的时候,都有TOKEN,然后进入聊天室前都有所在的room. 说话只能单聊或者room内广播, 最开始是用send_all(真实广播)发现有点崩。 300-400并发就开始稳定的丢50的包 然后使用的房间广播send_room,把send_all给ban了。不允许全局广播 然后发现效果还是不是很好。 最后在send_room前加了exist判断,现在是1000并发丢10个包左右了
赞
0
回复
2019-11-29
s
sea
老哥,看了你的swoole - socket. 想咨询下,你的send_room 业务逻辑是什么? 我写的聊天室 是这样的,连接的时候将fd,放入连接带入的room中。而后遍历room中所有fd,进而push. 总感觉这个逻辑不太好。想请教下你的。 不胜感激!
赞
0
回复
2019-12-09
、
、与光同尘
[@swoole小白 ](/u/7472) 我也是用的你的方法,维护room中的所有fd。 然后并且需要维护fd和user的业务逻辑关系。 反正就是redis记录了不少内容…
赞
0
回复