发现问题
在平常开发过程中,要做一个细心的人,不轻易放过任何一个问题。
这次发现Freeswitch的内存泄漏,是因为经常有关注测试环境的Freeswitch内存占用。
发现在测试环境升级的第二天Freeswitch内存就升到了200-300M,非常异常!
观察问题
使用脚本定时统计Freeswitch的内存占用,同时打开Freeswitch的调试开关。
export TPORT_DUMP=/usr/local/freeswitch/log/tport_sip.log
输出Freeswitch收到和发出信令包的日志。
通过观察发现,Freeswitch内存占用升高时,大部分是发起了视频通话
复现问题
通过sipp工具,在开发环境做视频通话的性能压测,发现100个视频通话后,Freeswitch内存占用就到了200多M,妥妥的是内存泄漏了
/usr/local/cloud_monitor/sipp/sipp_3.5.1 -t t1 -m 10 -i 172.18.41.220 -sf test/reg_tcp.xml -inf test/uas1.csv -p 6168 39.108.105.163:5070 -trace_err -trace_screen -timeout 60
/usr/local/cloud_monitor/sipp/sipp_3.5.1 -t t1 -aa -i 172.18.41.220 -sf test/video_pcmuuas.xml -inf test/uas1.csv -p 6168 39.108.105.163:5070 39.108.105.163:5070 -trace_err -trace_screen -timeout 3000
/usr/local/cloud_monitor/sipp/sipp_3.5.1 -t t1 -m 100 -r 1 -i 172.18.41.220 -sf test/video_pcmuuac.xml -inf test/uac1.csv -p 6167 39.108.105.163:5070 39.108.105.163:5070 -trace_err -trace_screen -timeout 3000
定位问题
先注释掉freeswitch-1.6.17\src\include\akuvox.h所有的宏,重新编译Freeswitch。
然后通过sipp工具做视频通话压测,发现没有泄漏。
然后再依次添加AKCS_ADD_PRIMARY_KEY宏,
AKCS_ENABLE_RTP_CONFUSE宏 等,测试Freeswitch有没有内存泄漏。
最后定位到是AKCS_ENABLE_RTP_CONFUSE的修改引起。
解决问题
正常通话是没有走RTP-CONFUSE分支的,所以左边的代码没有走到switch_core_session_rwunlock,导致other_session没有被释放,最终导致内存泄漏。
解决方法就是不管有没有走RTP-CONFUSE,都要解锁session。