2015-01-12 4 views
1

Я написал сервер ESL, который контролирует поток вызовов на сервере FreeSWITCH. Проблема в том, что после закрытия соединения потребление памяти не уменьшается до нормального уровня. После того, как на сервер будет сделано несколько сотен подключений, его потребление памяти идет на ГБ, и его нужно убить силой. Я указал, что проблема связана с объектом ESLconnection. Я попытался удалить объект и его экземпляры с помощью del, но безрезультатно. Код, как показано ниже:Потребление памяти python ESL

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() 

script.py:

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

Это потребует ESL модуль FreeSWITCH скомпилированный для Linux версии. Дайте мне знать, если мне нужно объяснить процедуру для этого. Здесь используется Python2.7.

+0

мне пришлось заменить Python-ESL с mod_python, который позволяет запускать питона код в FreeSWITCH без розеток, поскольку я не смог найти решение проблемы. – user3295878

ответ

0

От 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 
+0

Я попытался отключиться и даже повесил трубку, но ничего не работает. – user3295878

+0

Я заменил скомпилированную библиотеку ESL последней версией freeswitch, но это только замедлило процесс увеличения потребления памяти. В какой-то момент он продолжает использовать около 30 ГБ системной памяти, после чего я должен убить процесс. – user3295878

+0

Я бы предложил разместить больше вашего кода. Трудно людям помочь без дополнительной информации. – XrXrXr

Смежные вопросы