【FreeSwitch开发实践】死锁问题解决Over Session Limit 1000/Locked, Waiting on external entities

🏠 作     者:小小马车夫
🍅 所属专栏:【FreeSwitch开发实践】
🥝 专栏介绍:主要介绍博主在实际项目中使用FreeSwitch开发外呼类项目的一些经验心得,主要涉及FreeSwitch的基本安装编译、基本配置、ESL、WSS、录音、自定义模块、media bug、语音播放、MRCP及对接AI机器人等内容。内容在持续更新中,如果感兴趣可以对专栏进行订阅~
🍒 个人警醒与诸君共勉:间歇性的努力和蒙混过日子,都是对之前努力的清零

系列文章目录

【FreeSwitch开发实践】centos7下编译安装freeswitch及常见编译问题的解决
【FreeSwitch开发实践】freeswitch配置wss
【FreeSwitch开发实践】freeswitch配置wss证书问题 Encrypted Alert/Certification Unknown
【FreeSwitch开发实践】ESL简介
【FreeSwitch开发实践】ESL配置
【FreeSwitch开发实践】在nodejs中用ESL连接FreeSwitch



前言

今天介绍一个博主项目中遇到的问题, 当日系统外呼数达到1000之后,后续外呼无法再成功,查看FreeSwitch日志发现有如下错误:

2022-07-14 13:51:36.101122 100.00% [DEBUG] switch_ivr_originate.c:2281 Parsing global variables
2022-07-14 13:51:36.101122 100.00% [CRIT] switch_core_session.c:2432 Over Session Limit! 1000
2022-07-14 13:51:36.101122 100.00% [CRIT] mod_sofia.c:4762 Error Creating Session
2022-07-14 13:51:36.101122 100.00% [NOTICE] switch_ivr_originate.c:3039 Cannot create outgoing channel of type [sofia] cause: [DESTINATION_OUT_OF_ORDER]

从日志上看Over Session Limit! 1000 即有错误信息,就好办了,顺藤摸瓜查就是了。

环境简介:
系统: CentOS7.6 64位
FreeSwitch版本: 1.10.7


一、第一处错误:Over Session Limit! 1000

这一处理错误日志是在源码switch_core_session.c switch_core_session_request_uuid 函数中,大致看下,可知此函数功能是创建会话session进获取uuid。

在这里插入图片描述

这里session_manager.session_limit值是1000,意思是呼叫的最大值, 它是在配置switch.conf.xml中配置的,如下:

在这里插入图片描述

看到这里,第一反应呼叫达到最大限制, 但是项目中并发并没有1000这么高,那就继续查吧。

二、第二处错误:Locked, Waiting on external entities

查到这里基本是用的对比的方法, 对比线上环境打的手机号码,和线下测试环境打的软电话:

1 线上环境打的手机号码
2 线下测试环境的打的软电话

先看下日志上的区别:
在这里插入图片描述

区别就是线上没有中间蓝色字体的日志, 说明在打印Locked, Waiting on external entities 之后卡住了! 离问题原因更进一步了,接着在看Locked, Waiting on external entities打印,源码位置:

switch_core_session.c switch_core_session_thread

在这里插入图片描述

可以看到在switch_core_session_write_lock这一行之后就卡住了, 这个函数是加锁的, 说明在之前某些地方加锁了没有释放,造成这里死锁了。

三、github buglist的一些答案

从第二章看switch_core_session_write_lock函数加锁为线索,找加锁的地方,发现还是非常多的,貌似不是顷刻间能有发现的,先google一下,看看是不是有前人已经遇到过这类问题了。发现还真有:

https://github.com/signalwire/freeswitch/issues/960

在这里插入图片描述

从中看到确实有好多人遇到过这个问题,解决办法如下:

在这里插入图片描述

但是我所用的FreeSwitch版本1.10.7 已经有了这些修改!所以这并不能解决我遇到的问题,还是按第二章的思路继续查吧。
相关修改 switch_ivr_originate.c对应位置的代码:

在这里插入图片描述

四、问题定位:switch_core_session_force_locate

这里着重查加锁的地方,全工程查一下都在哪里用到了加锁,逐个排查看哪里没有释放。最后还是定位到一个接口:
switch_core_session_force_locate

switch_core.h
在这里插入图片描述
switch_core_session.c
在这里插入图片描述

这个函数在返回成功的时候调用了switch_thread_rwlock_tryrdlock函数来加锁, 但没有释放,而恰好项目确实用到了这个函数。那么问题基本定位了,所有用到了switch_core_session_force_locate的函数,用完获取到的session之后要解锁,如下:

switch_core_session_t *session;		
if ((session = switch_core_session_force_locate(uuid))) {
	//do_something
	switch_core_session_rwunlock(session);
}

总结

以上就是今天的内容,通过日志寻找线索,最后顺藤摸瓜解决Locked, Waiting on external entities问题的过程。

如果觉得有些帮助或觉得文章还不错,请关注一下博主,您的关注是我持续写作的动力。另外,如果有什么问题,可以在评论区留言,或者私信博主,博主看到后会第一时间回复。

  • 40
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 69
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 69
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一马途追

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值