freeswitch的任务引擎问题与解决方案

概述
freeswitch核心框架中有一个定时任务系统task,在开发过程中用来做一些延时操作和异步操作很方便。
我们在VOIP的呼叫流程中,经常会有一些对实时性要求没那么高的操作,或者会有阻塞流程的操作,我们都可以开启一个定时任务子流程,来达到延时和异步的目标。
但是在实际的生产应用中,该task模块在任务高并发的情况下发生了一些问题,通过压力测试可以重现。
问题现象。
1,task的group和desc为空的问题,并有极小概率造成coredump。
2,task.runtime错误的问题,导致任务无法执行。
环境
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.6.20
GCC:4.8.5
task的group和desc为空的问题
在对fs压力测试的同时,使用“show tasks”命令查询当前的任务队列。
其中,47号任务,2184号任务的task_group为空,24586号任务的task_desc和task_group均为空。
freeswitch@as137> show tasks
task_id,task_desc,task_group,task_runtime,task_sql_manager,hostname
1,heartbeat,core,1681351218,0,localhost.localdomain
2,check_ip,core,1681351258,0,localhost.localdomain
3,limit_hash_cleanup,mod_hash,1681351740,0,localhost.localdomain
4,task_keep_redis_alive,task_keep_redis_alive,1681351200,0,localhost.localdomain
5,as_common_city_forbidden_update_task,as_common_city_forbidden_update_task,1681351440,0,localhost.localdomain
6,update_cops_task,update_cops_task,1681351448,0,localhost.localdomain
36,task_report_event_hangup,task_report_event_hangup,1681350862,0,localhost.localdomain
47,task_report_event_hangup,,1681350862,0,localhost.localdomain
61,task_report_event_hangup,task_report_event_hangup,1681350862,0,localhost.localdomain
2077,task_report_event_hangup,task_report_event_hangup,1681350872,0,localhost.localdomain
2184,task_report_event_hangup,,1681350872,0,localhost.localdomain
24586,,,1681350985,0,localhost.localdomain
24647,task_report_event_hangup,task_report_event_hangup,1681350985,0,localhost.localdomain
问题分析
switch_scheduler_add_task函数中,主要逻辑分两步。
第一步,将task加入执行链表。该部分逻辑有加锁
第二步,将task信息通过event事件转发db模块保存。该部分没有加锁。
task_thread_loop函数中,主要逻辑分两步。
第一步,遍历task链表,并执行task。该部分有加解锁。
第二步,遍历task链表,删除已执行的task并清理内存。该部分有加解锁。
在多线程高并发场景下,一个任务在add_task的步骤二晚于task_thread_loop的步骤二执行时,就会发生task_desc和task_group的内存已被清理,event转发db的信息中字段为空的情况。
在极端情况下,task_desc和task_group的内存被重写,event事件在使用task_group的内存时会发生coredump的严重问题。
解决方案
在有switch_event_create函数调用和赋值的过程中,需要加锁,防止task_desc和task_group的内存已被清理。
该问题在1.10.7版本已修复。
task.runtime错误的问题
在对fs压力测试的同时,使用“show tasks”命令查询当前的任务队列。
其中,17022231号和19514678号任务的task_runtime时间为3363320919,换算为UTC时间为“2076-07-30 15:48:39”,这还执行个毛线。
freeswitch@as137> show tasks
task_id,task_desc,task_group,task_runtime,task_sql_manager,hostname
1,heartbeat,core,1681693601,0,localhost.localdomain
2,check_ip,core,1681693641,0,localhost.localdomain
3,limit_hash_cleanup,mod_hash,1681694183,0,localhost.localdomain
4,task_keep_redis_alive,task_keep_redis_alive,1681693584,0,localhost.localdomain
5,as_common_city_forbidden_update_task,as_common_city_forbidden_update_task,1681693584,0,localhost.localdomain
6,update_cops_task,update_cops_task,1681693592,0,localhost.localdomain
17022231,task_report_event_hangup,task_report_event_hangup,3363320919,0,localhost.localdomain
19514678,task_report_event_hangup,task_report_event_hangup,3363352225,0,localhost.localdomain
22295783,task_report_event_hangup,task_report_event_hangup,1681693583,0,localhost.localdomain
问题分析
从数值上分析,3363320919大概是1681693583的两倍,猜测是switch_scheduler_add_task函数第一个参数task_runtime的处理有问题。代码如下。
if (task_runtime < now) {
container->task.repeat = (uint32_t)task_runtime;
task_runtime += now;
}
临界情况下,我们希望任务马上执行,task_runtime传参为当前时间1681693583.999999,但是函数内部now的值取得1681693584.000000,这样task.task_runtime就会变成3363320919这样一个极端值。
解决方案
switch_scheduler_add_task,第一个参数task_runtime的填法,在回调函数中需要做出对应的修改。
1,不删除的定时重复执行的任务。
传入task_runtime = 60
task.repeat =60
task.runtime = 60 + switch_epoch_time_now(NULL)
2,需要马上执行的不需要重复执行的任务。
传入task_runtime = 0
task.repeat = 0
task.runtime = 0 + switch_epoch_time_now(NULL)
3,需要延时执行的不需要重复执行的任务。
传入task_runtime = switch_epoch_time_now(NULL) + 10
task.repeat = 0
task.runtime = switch_epoch_time_now(NULL) + 10
总结
freeswitch的新版本修复了很多问题,应尽量使用最新版本。
在高并发场景下的压力测试是必须要做的。
空空如常
求真得真
freeswitch的任务引擎问题与解决方案的更多相关文章
- freeswitch的任务引擎实现分析
概述 freeswitch核心框架中有一个定时任务系统,在开发过程中用来做一些延时操作和异步操作很方便. 我们在VOIP的呼叫流程中,经常会有一些对实时性要求没那么高的操作,或者会有阻塞流程的操作,我 ...
- springboot默认Thymeleaf模板引擎js的解决方案
<script th:inline="javascript"> var btnexam=[[${btnexam}]]; console.log(btnexam); va ...
- .Net 三款工作流引擎比较:WWF、netBPM 和 ccflow
下面将对目前比较主流的三款工作流进行介绍和比较,然后通过三款流程引擎分别设计一个较典型的流程来给大家分别演示这三款创建流程的过程.这三款工作流程引擎分别是 Windows Workflow Found ...
- 三款工作流引擎比较:WWF、netBPM 和 ccflow
下面将对目前比较主流的三款工作流进行介绍和比较,然后通过三款流程引擎分别设计一个较典型的流程来给大家分别演示这三款创建流程的过程.这三款工作流程引擎分别是 Windows Workflow Found ...
- [原创]如何让freeswitch转发客户端自定义的INFO消息
如何让freeswitch转发客户端自定义的INFO消息 英文概述: this article is about how to configure freeswitch to forward self ...
- Ubuntu安装FreeSWITCH亲测
本人在安装FreeSWITCH的时候遇到了相当多的坑,网上很多方法都模棱两可,经常装失败,最后终于装成功后做一下总结 最顺利的安装方式 1. 下载压缩文件 下载地址:http://files.free ...
- HTML5 网络拓扑图整合 OpenLayers 实现 GIS 地图应用
在前面<百度地图.ECharts整合HT for Web网络拓扑图应用>我们有介绍百度地图和 HT for Web 的整合,我们今天来谈谈 OpenLayers 和 HT for Web ...
- HTML5拓扑图形组件设计之道(一)
HT for Web(http://www.hightopo.com/guide/readme.html)提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表 ...
- HT for Web整合OpenLayers实现GIS地图应用
HT for Web作为逻辑拓扑图形组件自身没有GIS功能,但可以与各种GIS引擎即其客户端组件进行融合,各取所长实现逻辑拓扑和物理拓扑的无缝融合,本章将具体介绍HT for Web与开发免费的Ope ...
- HT图形组件设计之道(一)
HT for Web简称HT提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表达的我们希望提供:Everything you need to create ...
随机推荐
- WPF 入门基础
关于 WPF 和 XAML 什么是 WPF WPF(Windows Presentation Foundation)是由微软开发的桌面应用程序框架,用于创建现代化.高度交互和具有视觉吸引力的用户界面. ...
- 衡兰芷若成绝响,人间不见周海媚(4k修复基于PaddleGan)
一代人有一代人的经典回忆,1994年由周海媚.马景涛.叶童主演的<神雕侠侣>曾经风靡一时,周海媚所诠释的周芷若凝聚了汉水之钟灵,峨嵋之毓秀,遇雪尤清,经霜更艳,俘获万千观众,成为了一代人的 ...
- 数字孪生技术结合GIS系统能在农业领域作出什么改变?
数字孪生技术和地理信息系统(GIS)是两个独立但高度互补的领域,它们的结合在农业领域具有巨大的潜力,可以带来巨大的改变.在这篇文章中,我们将讨论数字孪生技术和GIS系统如何协同作用,为农业带来创新和可 ...
- 在Linux Docker中部署RStudio Server,实现高效远程访问
在Linux Docker中部署RStudio Server,实现高效远程访问 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE ...
- CodeForces 1307D BFS最短路 思维
原题链接 题意 给出一个简单无向图,边权全部为1,同时给我们k个特殊点,要求我们从这k个特殊点中选出两个来连一条边权为1的边.同时,我们的决策要保证1~n的最短路程最大,求最终这个最短路长度. 思路 ...
- PB从入坑到放弃(七)PBer们的福音来了
写在前面 也许现在的你需要用PB完成毕业设计.需要维护远古时代的代码,又或者是你呆的公司就是要求要用PB开发项目. 不管你是出于什么原因还在使用PB,不可否认PB在数据窗口非常优秀,熟练使用之后开发数 ...
- 【小白学YOLO】一文带你学YOLOv1 Testing
摘要:本文将为初学者带详细分析如何进行YOLOv1 Testing的内容. YOLOv1 Testing 进入testing阶段,我们已经得到98个bounding box和confidence还有C ...
- SQL操作:WITH表达式及其应用
摘要:本文将围绕WITH,以及更高阶的WITH RECURSIVE表达式介绍其语法特征和具体使用规范,以及在GaussDB(DWS)中如何进行WITH表达式的调优 本文分享自华为云社区<Gaus ...
- 华为云FusionInsight连续三次获得第一,加速释放数据要素价值
摘要:近日,IDC发布<中国大数据平台市场研究报告,2021 H1>,华为云FusionInsight智能数据湖已连续三次获得大数据平台市场份额第一. 本文分享自华为云社区<华为云F ...
- 这8个JS 新功能,你应该去尝试一下
摘要:本文主要介绍几个已经进入stage4的提案,这几个提案有望在2022年逐步纳入标准. 本文分享自华为云社区<2022 年你应该尝试的 8个 JavaScript 新功能>,作者:前端 ...