概述
freeswitch是一款简单好用的VOIP开源软交换平台。
在fs的使用过程中,会遇到各种各样的问题,各种问题中,性能问题是最头疼的。
最近在测试某些场景的时候,压测会造成fs的内存占用持续升高,并在达到某个临界点的时候击溃fs的端口服务,导致全部sip呼叫响应503。
环境
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.10.7
GCC:4.8.5
起因
在问题发生后,通过对fs的模块、配置等进行排查,确定了几个方向。
方向1,日志写缓存。
方向2,呼叫session处理线程池。
方向3,端口启动数目。
经过测试和复现,方向锁定3端口启动数目。
测试方案
首先,在fs的conf/sip_profiles目录下生成1200个external****.xml文件,每个文件使用不同的端口号。
external9200.xml
<profile name="external9200">
...
<param name="sip-port" value="9200"/>
...
启动fs,使用sipp进行压测(脚本参见之前的文章)。
测试结果
启动fs后,没有呼叫的时候,已经占用了3.6G(46%)的内存。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20596 root -2 -10 17.1g 3.6g 8252 S 97.3 46.5 1:26.05 freeswitch
使用sipp-auto.py脚本进行并发测试。
测试呼叫跑满1小时。
20596 root -2 -10 18.5g 5.2g 3308 S 121.6 68.6 15:11.83 freeswitch
测试呼叫经过3个小时。
20596 root -2 -10 21.3g 5.4g 3168 S 231.5 70.4 772:38.37 freeswitch
从top的显示中可以看到fs的内存占用持续升高。
总结
fs启动打开的端口超过一定数目(1000)之后,会有内存占用过大和内存持续升高的问题。
在删除多余的端口资源后,测试恢复正常。
具体原因需要对sofia模块代码走读确定。
空空如常
求真得真