OpenSIPS OutOfMemory 崩溃处理

1. 问题背景

新项目开发结束,为了评估系统容量和性能,在上线前使用 SIPp 模拟客户端对 OpenSIPS 进行了压测。压测时发现当会话数量超过 1000 时,OpenSIPS 必现崩溃宕机,不满足交付标准

2. 排查

查看 OpenSIPS 日志文件,发现如下 ERROR 日志,显而易见是共享内存用尽的问题。实际上在 OpenSIPS 中内存主要分为以下两部分:

  1. SHM_MEM
    共享内存,整个程序共同使用的一块内存区域,相当于 JVM 中的堆内存
  2. PKG_MEM
    子进程独享内存,相当于 JVM 中的栈内存

查看 OpenSIPS 官方 OOM 文档,可以看到 OpenSIPS 报出这个异常主要有两个原因,一个是共享内存配置太小,另一个是发生了内存泄漏。OpenSIPS 是开源项目,而笔者项目中使用的又是稳定的发行版本,发生内存泄漏的可能性很小。查阅 OpenSIPS 源码,发现在未配置共享内存参数的情况下,默认分配的共享内存大小只有 32M,因此初步判断 OOM 的原因是共享内存配置太小不满足程序需求

WARNING:core:fm_malloc: not enough contiguous free shm memory (320 bytes left, need 360), attempting defragmentation... please increase the "-m" command line parameter!
ERROR:core:fm_malloc: not enough free shm memory (96 bytes left, need 360), please increase the "-m" command line parameter!

3. 解决方案

推断 OOM 的原因是共享内存太小不够用,那么只要增大共享内存后再次压测即可快速验证。OpenSIPS 文档中已经给出了配置共享内存的方法,使用如下启动命令通过 -m 参数指定共享内存大小为 256M 后重启,会话数量超过 1000 时 OpenSIPS 崩溃宕机的问题不再复现

opensips -f opensips.cfg -m 256

猜你喜欢

转载自blog.csdn.net/weixin_45505313/article/details/132859979
今日推荐