使用strace为swoole查bug

最近使用swoole写了websocket系统服务,出现cpu和内存持续增长的故障。
使用strace工具查看系统栈调用情况:

strace -cp 进程

在syscall一栏发现socket创建过于频繁,系统服务定义了一个5秒的定时器进行轮询redis队列。而在这个定时器里,每次执行都会new redis对象,频繁创建socket连接是有开销的,这也是出现cpu持续增长的原因。

解决方案有两个:

  1. 使用连接池,连接池事先创建好一定数量的连接保存在内存,当需要使用连接的时候从内存取出空闲的连接对象,这样的好处是避免了频繁创建socket连接的开销,使数据连接得到重复利用。
  2. 使用长连接,使用static变量保存连接对象,避免了每次定时器触发的时候创建redis对象。

在当前场合,因为5秒轮询一次,redis连接是长期占用,无疑使用独占连接更适合。所以选择了方案二。

使用长连接后虽然cpu占用降低了,但观察strace发现sendto函数调用非常频繁超过了5秒执行一次的预期。

后查找代码找到了原因:定时器嵌套。代码在work进程定义了每秒触发的定时器去执行定时计划,而redis轮询服务是放在计划任务里又定义了5秒轮询的服务,而最后执行的结果已经不是5秒触发一次了。

总结

  • 不要在定时器里定义其他定时器。
  • 不要频繁创建socket连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值