概述

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的任务引擎问题与解决方案的更多相关文章

  1. freeswitch的任务引擎实现分析

    概述 freeswitch核心框架中有一个定时任务系统,在开发过程中用来做一些延时操作和异步操作很方便. 我们在VOIP的呼叫流程中,经常会有一些对实时性要求没那么高的操作,或者会有阻塞流程的操作,我 ...

  2. springboot默认Thymeleaf模板引擎js的解决方案

    <script th:inline="javascript"> var btnexam=[[${btnexam}]]; console.log(btnexam); va ...

  3. .Net 三款工作流引擎比较:WWF、netBPM 和 ccflow

    下面将对目前比较主流的三款工作流进行介绍和比较,然后通过三款流程引擎分别设计一个较典型的流程来给大家分别演示这三款创建流程的过程.这三款工作流程引擎分别是 Windows Workflow Found ...

  4. 三款工作流引擎比较:WWF、netBPM 和 ccflow

    下面将对目前比较主流的三款工作流进行介绍和比较,然后通过三款流程引擎分别设计一个较典型的流程来给大家分别演示这三款创建流程的过程.这三款工作流程引擎分别是 Windows Workflow Found ...

  5. [原创]如何让freeswitch转发客户端自定义的INFO消息

    如何让freeswitch转发客户端自定义的INFO消息 英文概述: this article is about how to configure freeswitch to forward self ...

  6. Ubuntu安装FreeSWITCH亲测

    本人在安装FreeSWITCH的时候遇到了相当多的坑,网上很多方法都模棱两可,经常装失败,最后终于装成功后做一下总结 最顺利的安装方式 1. 下载压缩文件 下载地址:http://files.free ...

  7. HTML5 网络拓扑图整合 OpenLayers 实现 GIS 地图应用

    在前面<百度地图.ECharts整合HT for Web网络拓扑图应用>我们有介绍百度地图和 HT for Web 的整合,我们今天来谈谈 OpenLayers 和 HT for Web  ...

  8. HTML5拓扑图形组件设计之道(一)

    HT for Web(http://www.hightopo.com/guide/readme.html)提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表 ...

  9. HT for Web整合OpenLayers实现GIS地图应用

    HT for Web作为逻辑拓扑图形组件自身没有GIS功能,但可以与各种GIS引擎即其客户端组件进行融合,各取所长实现逻辑拓扑和物理拓扑的无缝融合,本章将具体介绍HT for Web与开发免费的Ope ...

  10. HT图形组件设计之道(一)

    HT for Web简称HT提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表达的我们希望提供:Everything you need to create ...

随机推荐

  1. [ABC246B] Get Closer

    section> Problem Statement From the point $(0,0)$ in a two-dimensional plane, let us move the dis ...

  2. 使用CEF(七)详解macOS下基于CEF的多进程应用程序CMake项目搭建

    由于macOS下的应用程序结构导致了CEF这样的多进程架构程序在项目结构.运行架构上有很多细节需要关注,这一块的内容比起Windows要复杂的多,所以本文将会聚焦macOS下基于CEF的多进程应用架构 ...

  3. 这些常见的python编码习惯,你都会吗

    本文分享自华为云社区<不得不知的十个常见PY编码习惯>,作者:码乐. 简介 语言在发展和变化,编码习惯也在发生改变.这里简单聊聊 17个python中常见的编码习惯或者风格. 1,可变数据 ...

  4. 通过 KernelUtil.dll 劫持 QQ / TIM 客户端 QQClientkey / QQKey 详细教程(附源码)

    前言 由于 QQ 9.7.20 版本后已经不能通过模拟网页快捷登录来截取 QQClientkey / QQKey,估计是针对访问的程序做了限制,然而经过多方面测试,诸多的地区.环境.机器也针对这种获取 ...

  5. Text Intelligence - TextIn.com AI时代下的智能文档识别、处理、转换

    一.智能文档处理介绍 在AI时代,智能文档处理技术正变得越来越重要.它包括了智能文字识别(OCR).智能文档信息抽取.文档图像处理以及文档转换等多个方面.这些技术共同构成了现代信息处理的核心,广泛应用 ...

  6. 微服务下,使用 ELK 进行日志采集以及统一处理

    摘要:微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等. 微服务各个组件的相关实践会涉 ...

  7. CSV:简单格式下隐藏的那些坑

    摘要:本文将盘点处理CSV数据时我遇到的一些坑. 本文分享自华为云社区<CSV-简单格式下隐藏的那些坑>,作者:aKi. 前言 CSV(Comma-Separated Values),是一 ...

  8. 华为云PB级数据库GaussDB(for Redis)揭秘第九期:与HBase的对比

    摘要: 高斯Redis,兼具开源Redis和HBase各自优点,提供成本更低.性能更好.灵活性更强的数据库服务! 本文分享自华为云社区<华为云PB级数据库GaussDB(for Redis)揭秘 ...

  9. 5步带你掌握工作流Activiti框架的使用

    摘要:本文通过一个工作流Activiti框架的具体使用示例,具体详尽的介绍了工作流Activiti框架的使用方式. 本文分享自华为云社区<一个使用示例,五个操作步骤!从此轻松掌握项目中工作流的开 ...

  10. 企业诊断屋:二手车交易平台 APP 如何用 AB 测试赋能业务

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 2023年汽车行业新车市场低靡,由新车降价引发的车辆价格波动很快传导到二手车市场,二手车的交易也受到了冲击,收车验 ...