您当前的位置是:  首页 > 资讯 > 文章精选 >
 首页 > 资讯 > 文章精选 >

OpenSIPS学习笔记-浅析如何使用MemCache优化系统性能

2021-02-01 13:48:53   作者: james.zhu    来源:Asterisk开源派   评论:0  点击:


  作为一个SIP信令服务器,因为需要承载运营级的语音呼叫,OpenSIPS的性能是大家非常关心的问题。根据维基百科中的计算机基准测试七大类型的测试类型中,如果要讨论关于计算机的基准测试时,我们需要涵盖以上七类的测试。这里,我们重点讨论关于IO,数据库和软件本身的性能测试讨论。在其他的具体的测试场景中,技术研究人员也仍然遵从以上原则不断进行评测。哈佛大学研究人员J. Bradley Chen等研究人员早期发表的论文-The Measured Performance of Personal Computer Operating Systems是比较经典的关于个人计算机测试的论文,他们也是从内存访问,文件读取,平台等方面做的研究,如果读者有兴趣的话,可以查看文章链接来学习。
  关于针对OpenSIPS性能优化的讨论中,无论从早期的研究还是当前的研究中,大家对优化的手段仍然集中在数据库处理,CPU消耗和存储设备的处理上。因为技术的不断进步和其他软件手段的更新和资源的关系,一些优化手段也逐渐被引入,包括了分布式部署,云计算的其他工具。因为本人能力和资源有限,笔者不可能涉及太多的讨论,我们仅简单讨论通过自己资源可以优化的方式,以便帮助读者能够对OpenSIPS的优化有一个非常基本的认识,也是对OpenSIPS的性能做一个比较浅显的分析。这里,笔者首先介绍了关于OpenSIPS的早期版本OpenSERR的优化研究成果的背景介绍,然后介绍了关于MYSQL如何影响OpenSIPS的性能,接下来介绍了使用内存做某些模块优化的概念,最后介绍了如何使用Cache实现SIP用户注册的示例实践。
  测试前说明,如果用户没有安装OpenSIPS和MYSQL数据库的话,笔者不再介绍如何安装OpenSIPS和mysql数据库,用户需要首先安装OpenSIPS和MYSQL环境,然后再进行下面的示例测试。具体安装配置方式,读者可以参考:
  最完整快速的安装方式安装开源OpenSIPS-3.1和CP控制界面-class 8
  如何使用OpenSIPS实现呼叫队列/hunt group
  1关于OpenSIPS的性能研究背景介绍
  在早期的OpenSER(OpenSIPS/Kamailio前身)版本使用中,一些研究人员一直对其服务器的性能数据库的使用做不同环境的研究,其中对数据库和CPU操作的研究做了很多工作,研究人员也提出了很多有价值的建议和测试结果。除了官方的测试文档以外,个人觉得几位研究人员的论文也值得参考。C. P. Wright就在OpenSER的早期版本针对不同的硬件平台和不同的mysql数据库的处理发布了关于SIP server performance on multicore systems的论文。如果读者对此论文有兴趣的话,可以参考此另外作为一个理论支撑来优化自己的系统。
  此图片以及以下图片均来自于互联网资源
  Charles Shen和其他研究人员针对OpenSIPS的TLS加密对OpenSIPS的影响做了一个研究(The Impact of TLS on SIP Server Performance),通过其研究结果我们仍然可以看到针对CPU的性能的测试数据。
  2OpenSIPS使用mysql
  随着OpenSIPS的技术架构不断优化,各种应用场景的优化,OpenSIPS的性能也得到了很大的提升。官方对OpenSIPS的性能有一个关于压力测试的检测数据。在其结论中,数据库的操作是影响OpenSIPS的CPS的一个非常重要的因素。如果想提高OpenSIPS的性能,官方推荐尽量使用Caching(缓存)来提升OpenSIPS的性能。在默认的OpenSIPS环境中,到了使用了mysql数据库对一些模块的数据进行查处,很多时候也对数据库进行调用。OpenSIPS中使用了数据库的模块包括:
  • AUTH_DB
  • USRLOC
  • PERMISSIONS
  • DIALPLAN
  • DROUTING
  • BLACKLIST
  • DOMAIN
  • AVPOPS
  • 其他模块
  在一般中小型的平台应用环境中,这些模块数据读取可能不会影响OpenSIPS的性能。但是,如果SIP用户数量达到一定的级别,呼叫路由规则,黑白名单模块的数量达到一定级别以后,每个呼叫都要经过这些流程的处理的话,如果这些数据通过数据库的频繁读取就会严重影响系统的性能,可能数据库也会受到严重影响。在默认环境中,MYSQL的连接是100,这就会导致CPU不断频繁调用数据库操作, 对存储设备的使用频率也会增加。很多时候,因为设计原因或者处理速度减慢,一些MYSQL具体的命令也会影响到CPU的消耗,这仍然需要用户通过一定的命令手段来进行排查。比较幸运的是,目前MYSQL开源数据库都支持了相应的排查工具来实现跟踪MYSQL命令检测CPU的消耗。具体实现方式:
  pidstat -t -p <mysqld_pid> 1
  mysql > select * from performance_schema.threads where THREAD_OS_ID = XXXXX \G
  mysql > select * from performance_schema.threads where THREAD_OS_ID = XXXXX \G
  一步步排查每个SQL 命令的消耗状态。具体排查方式,请参考链接。
  除了MYSQL数据库的配置以外,存储设备的读取速度也是一个影响系统性能的重要因素。目前,无论是HDD还是SSD的存储方式,它们的读取速度仍然落后内存读取的速度。因此优化内存是一个比较可行的,相对低成本的方式。具体关于通过存储设备选择优化系统的讨论,读者可以参考链接的内容,这里不再赘述。
  3OpenSIPS中使用Cache缓存
  在缓存使用的优化中,SIP用户注册就是一个非常典型的例子(其他模块,例如TM/事务处理也非常消耗资源)。在我们的用户场景中,假设,SIP用户需要一般每隔60秒对OpenSIPS进行注册,这样OpenSIPS才能获得其状态。为了让服务器端获得其状态,SIP客户端只能每隔一段时间对服务器支持,刷新数据库的数据。这样的操作其实是非常消耗系统的注意,数据库性能也会大大下降。在OpenSIPS的模块中,例如INVITE呼叫,拨号规则路由查询等类似SIP注册这样的操作很多,需要经常频繁调用一些常规数据。这样的操作可以通过一定的手段进行优化,从而达到系统优化的目的。catching就是其中一种非常实用的优化方式,通过在内存存储这些数据,OpenSIPS可以不通过数据库调用来查询数据,直接调用内存中的数据,从而提高了OpenSIPS的运行速度。如果OpenSIPS优化中使用caching(缓存方式)的话,可以直接从caching缓存中获取用户注册信息,速度快,也无需访问数据库。在OpenSIPS环境中,目前支持的缓存是通过OpenSIPS core 模块和其他模块实现。支持的方式包括:Local Cache, MemCache,Redis, Cassandra, MongoDB和CouchBase。在OpenSIPS中的其设置非常简单:
  除了存储以外,OpenSIPS还可以移除cache,提取,查询新的数据等功能。OpenSIPS支持的cache用户验证流程:
  
  通过以上图例,我们可以看到,OpenSIPS关于缓存处理的基本处理逻辑是,OpenSIPS通过执行MYSQL 认证数据库,把用户名称和密码存储在cache中,缓存数据保持一定的生命周期。如果新新用户需要验证的话,首先检测缓存中存储的数据,如果此用户的数据存储在缓存中,则直接此缓存中查询用户验证信息;如果在缓存中没有此用户的信息,则返回数据库进行查询,执行验证流程。下一次用户需要认证时,OpenSIPS就会从缓存中提取用户验证信息而不是再次通过执行数据库验证来验证用户信息,这样就会降低对mysql的读取次数。用户名称和用户密码通过不同的key pair来实现。
  4OpenSIPS中使用Memcache支持SIP注册
  笔者介绍了基本的cache的操作步骤,现在我们针对SIP用户注册的缓存处理做一个配置示例,通过此示例说明OpenSIPS如何通过缓存数据来验证用户密码的流程。OpenSIPS官方网站对此配置有简单的说明,具体模块配置的细节读者可以参考官方配置文档,我们这里仅通过一个配置cfg基本来说明演示SIP账号的验证处理流程。用户需要按照以下几个步骤来配置缓存验证的流程。
  首先,用户需要编辑cfg文件,添加必要的支持模块:
  modparam("auth", "calculate_ha1", 1)
  modparam("auth","username_spec","$avp(userspec)")
  modparam("auth","password_spec","$avp(passwd)")
  然后加载此模块:
  loadmodule "cachedb_local.so"
  处理cache数据的逻辑,添加缓存中的数据库用户名称和用户密码。在注册处理流程模块做用户验证,cfg首先执行缓存数据的验证,然后执行mysql数据库验证,最后保存缓存数据流程。
  route[handle_register] // 执行缓存处理和数据库验证处理流程:
  if(cache_fetch("local","passwd_$tU@$td",$avp(passwd))) {
  $avp(userspec) = $tU;
  // 通过缓存数据验证用户名称和密码,否则执行mysql数据库验证
  if (!pv_www_authorize("")) {
  www_challenge("", " auth,auth-int " );
  exit;
  }
  } else { // 执行mysql数据库验证
  if (!www_authorize("", "subscriber")) {
  www_challenge("", "auth");
  exit;
  }
  // 执行数据库用户的密码验证,保存到缓存中
  cache_store("local","passwd_$tU@$td","$avp(passwd)",1200);
  }
  // 完成验证
  if (!$au==$tU) {
  send_reply(403,"Forbidden auth ID");
  exit;
  }
  if (!save("location"))
  sl_reply_error();
  exit;
  }
  保存cfg配置文件以后,用户重新启动OpenSIPS,然后通过mysql log日志观察log消息,查看数据库数据的变化。具体mysql数据库的log设置,用户可以通过:
  mysql -e "SET GLOBAL general_log=1;"
  mysql -e "SET GLOBAL general_log_file='mariadb.log';"
  其log保存的文件路径在 /var/lib/mysql/mariadb.log 。
  如果用户要测试其配置是否成功的话,用户也可以使用一个SIP软电话执行注册然后退出,再次执行注册流程,查看打印日志的变化。通过两次SIP账号注册,如果配置正确的话,用户注册时应该分别访问了mysql数据库和cache的保存的数据。
  通过缓存方式验证SIP注册以外,此用户的密码仍然可以使用在其他的请求中,例如INVITE请求呼叫或者订阅消息中。如果实现INVITE呼叫的话,需要使用pv_proxy_authorize()来实现,同时需要修改几个相关的变量(例如,$fu等)来保存相关的缓存数据。用户也可以通过此思路做进一步的验证,这里不做过多讨论。
  通过以上示例,读者可以看到,我们使用一个SIP 账号实现的缓存数据验证的流程。读者可以想象一下,如果服务器启动以后,成百上千个SIP用户同时对OpenSIPS服务器端发起注册的话,没有缓存验证的支持的话,对数据库是一个非常大的挑战。所以,通过缓存数据的调用可以优化OpenSIPS的性能。
  另外,读者可以看到,我们实际上实现的是一个按需验证数据库的过程,每个用户注册时,需要重复执行以上的步骤,把数据库数据缓存到内存的缓存数据中。另外一个更加优化的方式是,在OpenSIPS启动以后,使用full caching的方式,在起始的启动脚本逻辑模块中就完全提取数据库用户验证数据,然后在缓存中保存这些完整的全部验证数据。通过这样的操作就避免了每一次用户注册都需要进行数据库的验证处理,仅需要通过缓存验证流程。
  5总结
  在本文章中,笔者首先介绍了关于系统性能测试的背景,然后介绍了mysql对OpenSIPS的影响,接下来笔者针对OpenSIPS中使用的一些必要模块做了介绍,最后通过SIP注册的示例说明使用缓存的方式。通过此基本示例让读者了解如何优化自己的OpenSIPS平台,实现更强大的性能处理能力。
  用户使用MemCache可以优化OpenSIPS的性能,但是使用内存处理同样也会引起其他的问题,例如系统维护问题,脚本处理流程需要规范,同步cache和拓展性的问题。用户最终需要评估使用MemCache的风险来决定是否使用MemCache。
  随着技术的不断进步,用户当然也可以考虑使用其他的方式来优化或者改善OpenSIPS的性能,例如,使用分布式数据库,使用更高速的存储设备,其他的软件手段等方式。
  参考资料:
  C. P. Wright,SIP server performance on multicore systems
  Charles Shen,The Impact of TLS on SIP Server Performance
  J. Bradley Chen, The Measured Performance of Personal Computer Operating Systems
  https://en.wikipedia.org/wiki/Benchmark_(computing)
  https://core.ac.uk/download/pdf/207501118.pdf
  https://www.opensips.org/About/PerformanceTests-StressTests
  https://www.sqlite.org/fasterthanfs.html
  https://medium.com/@denisanikin/when-and-why-i-use-an-in-memory-database-or-a-traditional-database-management-system-5737f6d406b5
  https://web.archive.org/web/20120319101435/http://www.pcguide.com/ref/hdd/perf/perf/spec/posAccess-c.html
  https://www.opensips.org/Documentation/Tutorials-MemoryCaching
  融合通信/IPPBX/FreePBX商业解决方案:www.hiastar.com
  最新Asterisk完整中文用户手册详解:www.asterisk.org.cn
  Freepbx/FreeSBC技术文档: www.freepbx.org.cn
  如何使用免费会话边界控制器-FreeSBC,qq技术分享群:334023047
  关注微信公众号:asterisk-cn,获得有价值的通信行业技术分享
 
【免责声明】本文仅代表作者本人观点,与CTI论坛无关。CTI论坛对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。

专题

CTI论坛会员企业