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

news2024/9/23 18:32:27

 

概述

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

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

空空如常

求真得真

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/464748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【 Spring 事务 】

文章目录 一、为什么需要事务(简单回顾)二、MySQL 中的事务使⽤三、Spring 中事务的实现3.1 Spring 编程式事务(手动事务)3.2 Spring 声明式事务(自动事务)3.2.1 Transactional 作⽤范围3.2.2 Transactional 参数说明3.2.3 Transactional 不进行事务回滚的情况3.2.4 Transactio…

Android 使用Retrofit+协程实现超简单大文件下载并回显进度条

安卓自带的进度条弹窗过时了&#xff0c;这里简单创建一个进度条弹窗 在drawable文件夹创建progress_dialog_bg_style.xml一个圆角白色背景样式 <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com…

IPTV系统架构的分析与研究

1 引言   IPTV业务是伴随着宽带互联网的飞速发展而兴起的一项新兴的互联网增值业务,它利用宽带互联网的基础设施&#xff0c;以家用电视机和电脑作为主要终端 &#xff0c;利用网络机顶盒(STB,Set -TopBox) &#xff0c;通过互联网协议来传送电视信号.提供包括 电视节 目在 内…

嵌入式51单片机05-中断与定时器系列

文章目录 中断与定时器一、中断系统与定时器1. 中断简单介绍2. 定时器简单介绍 二、中断系列代码1. 中断操作&#xff08;中断控制LED灯亮灭&#xff09;&#xff08;1&#xff09;仿真电路图&#xff08;2&#xff09;源代码&#xff08;3&#xff09;实验结果 2. 中断操作&am…

c++强制类型转换:

强制类型转换&#xff1a;1. const属性用const_cast。 案例&#xff1a; 说明&#xff1a;该变量可以将变量的const 的属性去掉。如该案例&#xff0c;转换后修改x的值是合法的。2. 基本类型转换用static_cast。 案例&#xff1a; 说明&#xff1a;一般用在(1)基本类型&#xf…

新黑马头条项目经验(黑马)

swagger (1)简介 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(API Documentation & Design Tools for Teams | Swagger)。 它的主要作用是&#xff1a; 使得前后端分离开发更加方便&#xff0c;有利于团队协作 接…

微服务知识

Spring Cloud Netfix&#xff1a;Eureka&#xff0c;Ribbon&#xff0c;Feign&#xff0c;Hystrix&#xff0c;Zuul | Gateway&#xff0c;Config Spring Colud Alibaba&#xff1a;Nacos&#xff0c;Sentinel&#xff0c;Seata Nacos通过Ribbon实现负载均衡&#xff0c;Ribb…

【java笔记】java多线程

目录 一、概念 1.1 什么是进程&#xff1f; 1.2 什么是线程&#xff1f; 1.3 什么事多线程&#xff1f; 1.4 进程和线程的关系 二、线程对象的生命周期 三、实现线程有两种方式 3.1 继承 java.lang.Thread&#xff0c;重写 run方法 3.2 实现 java.lang.Runnable 接口…

材料写作素材:关于“大”排比句40例

1.一轮思想政治“大督查”&#xff0c;一轮政策落实“大检查”&#xff0c;一次非公企业“大走访”&#xff0c;一次问题线索“大起底”&#xff0c;一批典型案例“大曝光”。 2.在重大风险挑战面前豁得出去、顶得上去&#xff0c;在重大困难考验面前迎难而上、敢于胜利&#…

【计网】WebSocket协议

目录 一、背景 二、WebSocket握手过程 三、SpringBoot中使用WebSocket协议 1、服务器 2、客户端 一、背景 一般的web开发以请求响应为主即客户端发送一个请求&#xff0c;服务器返回一个响应&#xff0c;这就使得类似聊天等需求基于HTTP协议进行实现时比较消费资源&#xf…

大数据之Hadoop分布式文件系统HDFS

目录&#xff1a; 一、介绍二、HDFS 设计原理三、原理图形介绍四、HDFS 常用 shell 命令五、HDFS相关JavaAPI 一、介绍 HDFS &#xff08;Hadoop Distributed File System&#xff09;是 Hadoop 下的分布式文件系统&#xff0c;具有高容错、高吞吐量等特性&#xff0c;可以部署…

厨电新十年,不可逆的行业分化与老板电器的数字进化

“人生就像滚雪球&#xff0c;最重要之事是发现湿雪和长长的山坡。”股神巴菲特的这句名言&#xff0c;让坡是否长、雪是否厚成为人们评价一个行业、一家公司的标准之一。 家电行业&#xff0c;厨电曾是最后一块“坡长雪厚”之地&#xff0c;投资者也对相关企业给出了相当的热…

FIR半带滤波器

FIR半带滤波器 半带滤波器原理&#xff1a; CIC滤波器是一种适合于工作在高采样率条件下的滤波器。 半带滤波器是一种非常适合于2倍抽取的FIR滤波器。 半带滤波器可以使2倍抽取的每秒乘法次数比一般线性相位的FIR滤波器减少近1/2。 半带滤波器是一种实现数字下变频的高效数…

暗藏的比特币白皮书已删除 苹果其实与Web3“格格不入”?

据悉&#xff0c;Apple已从其最新的Mac OS Ventura beta中删除了比特币白皮书&#xff0c;虽然该公司从未对白皮书的存在提供任何官方解释&#xff0c;但许多人猜测这是对加密货币日益增长的重要性的认可。 4月上旬&#xff0c;科技专家Andy Baio偶然发现&#xff0c;自己的Mac…

浅述 国产仪器 1652AM任意波形发生器

1652AM任意波形发生器是一款多通道、多功能的任意波形发生器。它在兼顾了输出信号高质量的同时&#xff0c;实现了高通道密度。它可与其它通用或专用模块化测试仪器构成综合测试系统或平台&#xff0c;支持众多解决方案&#xff0c;包括量子计算机调控信号生成、大规模MIMO信号…

活动目录(Active Directory)安全审计

延迟响应变化的影响可能会使原本应该微不足道的颠簸滚雪球变成无法弥补的损害。这在 Windows Active Directory 环境中更为重要&#xff0c;因为这种延迟造成的损害可能会使组织损失数百万美元&#xff01;在这种情况下&#xff0c;需要一个警惕的警报系统&#xff0c;该系统可…

WPF学习

一、了解WPF的框架结构 &#xff08;第一小节随便看下就可以&#xff0c;简单练习就行&#xff09; 1、新建WPF项目 xmlns&#xff1a;XML的命名空间 Margin外边距&#xff1a;左上右下 HorizontalAlignment&#xff1a;水平位置 VerticalAlignment&#xff1a;垂直位置 2…

性能测试开始前的需求调研

之前的博客聊聊性能测试开始前的准备工作&#xff0c;聊了一些关于性能测试开始前要做的准备工作。这篇博客&#xff0c;来谈谈性能测试开始前的需求调研阶段&#xff0c;我们要做什么&#xff0c;关注那些Point。。。 一、基本信息 信息类型说明项目名称项目归属的业务线&am…

低代码应用开发平台,让数据管理更简单!

在数据管理越来越规范化的今天&#xff0c;低代码应用开发平台也获得了进步和发展的机会和空间。想要将企业内部的数据资源做好系统管理&#xff0c;从而为各个时期的经营决策提供强有力的证据和基础&#xff0c;低代码应用开发平台就是其中备受喜爱的工具。本文主要从它的特点…

重磅!阿里云云原生合作伙伴计划全新升级:加码核心权益,与伙伴共赢新未来

在今天的 2023 阿里云合作伙伴大会上&#xff0c;阿里云智能云原生应用平台运营&生态业务负责人王荣刚宣布&#xff1a; “阿里云云原生合作伙伴计划”全新升级。他表示&#xff1a; 云原生致力于帮助企业客户最大限度的减轻运维工作&#xff0c;更好的实现敏捷创新&#x…