您当前的位置是:  首页 > 新闻 > 国内 >
 首页 > 新闻 > 国内 >

Kamailio/OpenSIPS学习笔记-九大核心模块和进程配置

2018-01-29 09:41:27   作者:   来源:CTI论坛   评论:0  点击:


  在前面的笔记中我们介绍了一些和开源软交换相关的SIP基本概念和消息内容。今天,我们将讨论Kamailio/OpenSIPS的九大核心模块的技术架构,它们包括具体九大核心模块的功能,软交换的几个核心进程的介绍,软交换进程数量对系统的影响等相关话题。
  1、笔者在前面的讲座中也提到过,两个开源平台的技术架构基本上是完全一致的,但是可能在解释上可能有所不同。今天,我们分别对各自的架构做一个说明。这里,我们首先介绍Kamailio 技术架构。根据以下图例我们可以看到,Kamailio的核心的架构包括九大部分。它们分别是:
  • SIP Parser 负责解析SIP消息内容。
  • SIP Transport Layer 负责收发UDP,SCTP,TUP和TLS加密。
  • Configuration file Interpreter负责处理各种配置文件,并且在runtime执行。
  • Variabels Framework是一个API接口负责处理系统伪变量,选择和转译功能。
  • Locking Manager负责对内部资源的同步管理。
  • DNS Resolver负责执行DNS查询和对结果进行缓存处理。
  • Control Interface API是一个API接口负责处理系统的控制命令。
  • Memory Manager负责对private和shared 内存进行管理。
  • Modules Interface 是一个API接口,负责加载模块和导入已导出参数和函数。
  2、OpenSIPS 核心模块介绍和kamailio模块基本上是一样架构。只是模块的命名稍微有差异。
  笔者会根据Kamailio的命名来进一步介绍各个模块的具体功能。
  3、因为两个软交换的架构基本一致,所以我们这里我们重点介绍一下Kamailio的九大模块的基本功能:
  • SIP Parser解析器。Kamailio有自己的解析器,其主要作用是支持SIP proxy的解析需要。和一些SIP终端的解析器相比,它可以同时处理上千个transactions和dialogcs,而一般终端只能同时处理几个dialogcs。另外,解析器可以仅处理它本身需要的消息内容,无需全部解析,同时对解析的消息进行缓存处理。解析器可以对SIP消息体中的消息头和body解析解析并且根据需要对部分信息进行删除添加等功能。
  • Memory Manager内存管理器。Kamailio有自己的内存管理工具对其进程进行管理。因为Kamailio是基于多进程设计的平台,它本身的同步管理管理比较简单。有时,为了配合第三方的软件平台,系统又需要共享内存的支持。Kamailio的内存管理器可以按照不同的内存需求来灵活调整内存大小。启动时附加不同的内存参数设置来实现共享内存和私有内存的配置。启动命令设置时用户需要根据内存命令来设置。例如,kamailio -m 521 -M 8 表示 使用的是512M的共享内存,使用 8M的私有内存。这里,读者一定要注意大小写的区别。M表示设置的是私有内存,m表示设置的是共享内存。另外,配置的变量存储在共享内存还是私有内存完全取于变量类型。大部分情况下,一般的SIP属性参数保存在私有内存($ru,$fu,$dbr等),一些avp变量/shv变量则保存在共享内存。但是明确一点,如果当正在处理一个SIP请求时,想保存此变量值用于处理相应的响应时,则必须使用共享内存变量。
  Locking manager 制锁管理。通过API支持互斥管理和内存范围管理。因为有时系统同时使用一个变量时,我们需要更新一个变量时,如果不先锁定此变量,就不可能对其进行同步更新,因为可能同时有其他进程正在使用此变量。此管理器的目的就是通过先锁定变量,更新此变量后,然后再其变量进行解锁操作。例如:
  • lock(“x”);// 锁定变量x
  • $shv()=$shv(x)+5 // 使用共享内存保存更新后的变量
  • unlock(); // 解锁操作
  Transport layer 传输层管理。此模块支持IPv4和IPv6,支持的传输方式包括UDP,TCP,TLS和SCTP。传输方式完全取决于用户的配置文件设置,软交换本身可以同时支持UDP和TCP传输。SCTP协议设计目的是专门针对SIP技术架构的,但是目前使用的场景比较少,所以也没有大规模商用。
  Configuration File Interpreter 配置文件解析器。从字面意思我们就可以知道,此接口负责处理对软交换配置文件的解析。软交换配置文件是一个文本配置文件,它主要包括三个部分的配置:全局变量设置自定义变量和预处理的文件,模块名称和参数设置和路由管理设置负责SIP路由管理。在软交换启动时,系统会加载经过优化的配置文件存储在内存中,以便在runtime时使用。解析器会编译正则表达式,检测静态变量,检测条件语句判断,重构路由和子路由路径结构,在runtime环境中添加各种函数的变量值。
  Variabels Framework 接口对变量进行处理。软交换本身支持了很多种变量,而且因为以前项目的继承和兼容性的问题,导致现在的支持两种变量:pseudo-variables(来自于OpenSER/Kamailio,使用$开始变量标注) 和selects(来自于SER,使用@开始变量标注)。关于具体每个变量的学习,大家可以查阅两个软交换的官方文档。
  DNS Reslover 负责软交换的DNS查询处理。目前软交换支持的DNS类型包括:A(IPv4),AAAA(IPv6),CNAME别名查询,SRV查询(服务器主机和端口),NAPTR(传输方式,服务地址和端口),TXT(服务器获取的任意数据内容)。软交换的DNS模块可以支持基于DNS SRV结果的均衡负载处理和基于DNS记录的黑名单管理。
  Control Interface 接口负责提供两种对软交换进行控制的接口命令,这两个接口包括RPC接口(SER开发),MI管理接口(Openser/Kamailio开发而来)。两种接口都提供同样的功能-对软交换通过人工命令进行互动管理,例如获取内存内容,后台加载数据,在运行时修改一些这些命令,发送SIP消息等功能。
  Modules Interface 此核心模块负责加载系统执行时需要的相关模块和其模块的传递参数,并且导入负责导入以导出的函数参数等数值。此模块是软交换非常重要的核心模块,所有的软交换认证模块,数据库对接模块,其他定位服务,路由等都需要相应的模块提前加载才能执行。这个模块接口对于一个非常庞大的模块数量,用户可以到官方网站查阅对应的模块使用说明。
  4、前面我们提到过,Kamailio是一个多进程的软交换平台,进程数量是一个变量,数量的多少取决于配置文件的设置。对于每个Kamailio的实例来说,每个进程都有其特别的功能角色。它们包括以下多种进程维护功能:
  主进程维护功能:进程启动,监控解析文件配置,设置创建环境变量,创建SIP worker 进程和定时器。
  TCP 维护进程:管理TCP worker 和连接的过程。
  SIP TCP 接收方:处理通过TCP收到的数据过程。
  SIP UDP 接收方:处理通过UDP端口的数据。
  SIP SCTP 接收方:处理通过SCTP传输的数据。
  Control Interface Receiver:负责处理MI/RPC 命令的数据交互,它们可能是FIFO,TCP/UDP/UNIXSOCK或者XML,RPC 接收方数据。
  定时器进程:此进程处理正在运行的周期性的任务,可能是core 模块或其他模块调用的。定时器进程可能是Core 定时器(main timers和slow times)和自定义的定时器包括NAT ping 定时器(发送保持NAT 存活数据包)和rtimer定时器,在定时器内执行执行一个配置文件的路由设置。
  Modue specific wokers:此进程是通过启动各种模块执行具体的任务,例如异步处理等。
  5、这里我们特别讨论一下关于子进程对系统性能的影响(children和tcp_children)。通过以上的介绍,我们知道软交换配置中的参数配置可以影响到子进程(默认设置会产生8个进程-默认children=4,两个UDP socket)数量的实现,这些进程数量的多少会直接影响系统的执行性能。这些参数决定着SIP worker的进程数量。因此我们必须注意,所有进程都是在启动时创建,启动以后,在运行环境中,不能再次创建进程或者结束结束进程。
  可能有读者问,进程数量到底多少是合适的?不幸的是,没有一个完整的公式可以计算出一个运行环境中究竟需要多少进程,这都完全取决于配置文件的复杂程度和脚本逻辑的复杂程度。当然,创建的进程越多,则需要更多的并行处理机制来处理数据流量。但是,如果创建了太多的进程则会导致系统性能下降。很多的进程处理的切换需要系统时间,内部同步和制锁都需要时间处理。因此,读者需要在系统进程数量和系统稳定性上做一个平衡。
  在配置文件的路由逻辑脚本中,很多的逻辑运算是依赖于CPU IO操作和计算能力。例如,基本上无IO操作的DNS,数据库简单操作和HTTP等。相对比较消耗IO操作的大量频繁的数据库查询命令,DNS 查询等。如果没有涉及太多的IO操作的进程,系统的默认进程设置基本上可以满足这些要求;如果是大量的IO操作的进程,需要用户创建更多的进程来保证运行的稳定性。如果涉及到太多的写入操作或者数据库连接等逻辑,用户也要考虑数据库的连接问题。
  用户可以通过每个SIP消息对IO操作的平均数和IO操作的平均时间来大致估算所需进程数量。大部分的软交换用户可能没有注意到children参数具体的细节,其实,这些参数的设置一开始就已经限定了系统的性能,有一些开发人员仅是一味地强调CPU性能和内存大小。读者可以查看cfg中的全局变量参数fork,children和tcp_children来进行配置。另外,如果系统确实确认不需要某些传输协议的话,可以通过配置文件来关闭这些传输协议。但是,一定要注意,UDP是不能关闭的,它总是处于开启状态。
  硬件服务器的CPU,网卡都是直接影响CPU性能的重要指标,另外硬件中断(CPU,网卡,硬盘,语音卡)的优先级同样影响服务器的性能。优先级高的中断可以优先运行执行某些进程,优先级低的中断则可能稍后执行。如果把网卡的优先级设置的比较低,则可能直接影响软交换对SIP数据的处理和锁切换时间。用户可能需要一些系统工具来尝试调整所需要的优先级(irqblance)。
  Italo Dacosta和他的团队的软交换(OpenSER)性能研究中也明确了关于数据库和进程数量影响软交换性能的测试数据。读者可以根据参考链接做进一步的研究。
  6、在本章节的讨论中,笔者和大家分享了Kamailio九大核心接口的主要功能和各自负责的任务处理,另外,也介绍了系统创建的主要进程和各个进程对特定任务的处理。为了帮助读者能够掌握软交换稳定性的配置问题,笔者也重点介绍了进程数量的设置,CPU(核数量)或IO操作的影响和硬件服务器的CPU,网卡以及相应中断的优先级问题。最后,笔者和大家分享了国外一位研究人员对OpenSER的性能测试数据,读者可以根据这些测试环境来进一步掌握本章节的重点内容。
  参考资料:
  http://blog.csrpswitch.com/tuning-kamailio-for-high-throughput-and-performance/
  Italo Dacosta, Improving Authentication Performance of Distributed SIP Proxies
  关注微信公众号:asterisk-cn,获得有价值的行业分享。访问5060社区-开源IPPBX论坛获得技术帮助:www.ippbx.org.cn/www.hiastar.com
【免责声明】本文仅代表作者本人观点,与CTI论坛无关。CTI论坛对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。

专题