【问题标题】:Memory consumption of python ESLpython ESL的内存消耗
【发布时间】:2015-01-12 06:09:58
【问题描述】:

我写了一个 ESL 服务器,它控制 FreeSWITCH 服务器上的调用流程。问题是连接关闭后,内存消耗并没有减少到正常水平。在与服务器建立数百个连接后,它的内存消耗达到 GB 并且必须强制终止。我已将问题确定为 ESLconnection 对象。我曾尝试使用 del 删除对象及其实例,但无济于事。代码如下:

ivrServer.py

import SocketServer
from ESL import *
import importlib
import sys
import threading
import traceback
import signal
import time

class ESLRequestHandler(SocketServer.BaseRequestHandler):
    #svr_ivr_log = None
    def setup(self):
        fd = self.request.fileno()
        self.con = ESLconnection(fd)
        self.svr_ivr_log.info("Client connected: %s" % str(self.client_address))

    def handle(self):
        ivr_script = importlib.import_module('script')
        ivr_script = reload(ivr_script)
        ivr_script.process(self.con)

    def finish(self):
        self.con.disconnect()

ESLRequestHandler.svr_ivr_log = logging('server')

SocketServer.ThreadingTCPServer.allow_reuse_address = True
server = SocketServer.ThreadingTCPServer(('', 9090), ESLRequestHandler)
server.serve_forever()

脚本.py:

def process(con):
    info = con.getInfo()
    uuid = info.getHeader('unique-id')
    con.execute('hangup', "NORMAL_CLEARING", uuid)

这需要为您的 linux 版本编译的 freeswitch 的 ESL 模块。让我知道是否需要解释执行此操作的程序。这里使用的是Python2.7。

【问题讨论】:

  • 我不得不将 Python-ESL 替换为 mod_python,它允许您在 FreeSWITCH 中运行 python 代码而不需要套接字,因为我无法找到问题的解决方案。

标签: python freeswitch


【解决方案1】:

来自SocketServer doc

...为每个请求创建一个新实例。

每个请求都会创建一个新的ESLRequestHandler 实例。

在您的setup() 中,您与 FreeSWITCH 服务器建立了连接,但在处理完请求后您永远不会关闭它。我怀疑这是内存泄漏的根源。

要关闭与 FreeSWITCH 服务器的连接,请执行以下操作:

class ESLRequestHandler(SocketServer.BaseRequestHandler):
    #svr_ivr_log = None
    def setup(self):
        fd = self.request.fileno()
        self.con = ESLconnection(fd)
        self.svr_ivr_log.info("Client connected: %s" % str(self.client_address))

    def handle(self):
        pass  # your code for interacting with the FreeSWITCH server here

    def finish(self):
        self.con.disconnect()  # close the connection

【讨论】:

  • 我尝试断开连接,甚至在完成时挂断,但似乎没有任何效果。
  • 我用最新的freeswitch版本替换了编译好的ESL库,但这只会减慢增加内存消耗的过程。在某一时刻,它确实继续使用大约 30Gb 的系统内存,我不得不杀死这个进程。
  • 我建议发布更多您的代码。没有更多信息,人们很难提供帮助
  • 在删除了我的代码中使用的所有其他模块后,我已经推断出 ESL 的问题。所以,我想包含附加代码是没有意义的。但是,我仍然会更改代码以反映实际机制。
  • 我们有同样的问题,python 吃掉了所有的内存。我必须每两天重新启动一次以释放 python 使用的所有内存。你有什么解决办法吗?
猜你喜欢
  • 2018-03-01
  • 2012-05-30
  • 1970-01-01
  • 2013-12-03
  • 2019-09-14
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多