首页 > 其他分享 >freeswitch的任务引擎问题与解决方案

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

时间:2023-04-26 18:22:16浏览次数:40  
标签:task 解决方案 report 引擎 localhost freeswitch runtime event localdomain

 

概述

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的新版本修复了很多问题,应尽量使用最新版本。

在高并发场景下的压力测试是必须要做的。

 

空空如常

求真得真

 

标签:task,解决方案,report,引擎,localhost,freeswitch,runtime,event,localdomain
From: https://www.cnblogs.com/qiuzhendezhen/p/17356934.html

相关文章

  • 单窗算法的地表温度反演:谷歌地球引擎GEE代码
      本文介绍在GEE中基于Landsat遥感影像实现地表温度(LST)单窗算法反演的代码。1背景知识  基于遥感数据的地表温度(LST)反演目前得到了广泛的应用,尤其是面向大尺度、长时间范围的温度数据需求,遥感方法更是可以凸显其优势。目前,基于各类遥感数据源的地表温度反演方法不断得以改......
  • 【FAQ】关于JavaScript版本的华为地图服务Map的点击事件与Marker的点击事件存在冲突的
    一. 问题描述创建地图对象,并添加marker标记,对map和marker均添加了点击事件;<body><script>functioninitMap(){//创建地图对象constmap=newHWMapJsSDK.HWMap(document.getElementById('map'),{center:{lat:39.36322,lng:......
  • 关于在linux-centos7下部署 .net core程序绘图(PDF等)丢失中文字体的解决方案
    关于在linux-centos7下部署.netcore程序绘图(PDF等)丢失中文字体的解决方案说明:1:以下操作基于新系统,如果步骤一,二已经安装则不需要额外安装.需要注意的是,在使用(yuminstall包)的时候如果提示包不存在;需要运行步骤(一:5安装epel,企业版Linux额外包)2:以下()内代表......
  • error: Your local changes to the following files would be overwritten by merge
    拉取代码出现error:Yourlocalchangestothefollowingfileswouldbeoverwrittenbymerge解决方案你团队其他成员修改了某文件并已提交入库。你在pull之前修改了本地该文件,等你修改完代码再pull时,这时会报错如下错误:error:Yourlocalchangestothefollowingfiles......
  • 利用CMake生成同一解决方案下多个项目管理文件
    ​  有的时候,我们需要在同一解决方案下管理多个项目,如果通过VS将项目一个一个添加,这项工作将变得十分繁琐。举例来讲,拿服务端和客户端的SOCKET通信来说,服务端和客户端两部分代码应作为两个单独的项目进行编译,而为了在同一解决方案下对这两个(或多个)项目进行管理,此时便可以借助C......
  • 虚拟机|--Hyper-V|--Start PXE over IPv4.报错解决方案
    前言在Hyper-V管理器中>>操作>>"快速创建"了一个WIndowsXP系统的虚拟机,结果启动的时候报错了解决方案在创建虚拟机的时候不要快速创建,而使用新建,在指定代数步骤选择第一代(1),开始创建的步骤改一下就可以了.其他配置推荐在分配内存步骤我写的是8000M左右,(根......
  • 07.存储引擎
    1.MYSQL体系结构连接层最上层是一些客户端和链接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可......
  • Microsoft Azure 解决方案: 了解和合理规划数据存储
    51CTO博客地址: https://blog.51cto.com/14669127Azure培训视频地址: https://space.bilibili.com/2000820534Gartner研究副总裁MichaelWarrilow表示:“由于新冠疫情的爆发,企业机构为了应对新的业务和社会变化才在过去两年开始加快云迁移速度。未能跟上云迁移速度的技术和服务提供......
  • vue-element-admin报错Error: error:0308010C:digital envelope routines::unsupporte
    安装vue-element-admin报错 nodejs  Node.jsv18.15.0  opensslErrorStack:['error:03000086:digitalenveloperoutines::initializationerror'],library:'digitalenveloperoutines',reason:'unsupported',code:'ERR_OSSL......
  • 火山引擎 DataLeap:在数据研发中,如何提升效率?
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群在数仓及中台研发过程中,研发人员经常需要在不同任务中维护相同或类似代码,不仅费时费力,并且代码迭代后也面临不同业务单元逻辑性不一致的问题,对运维管理形成挑战。 一般来说,研发人员往往通......