2015-01-12 3 views
1

FreeSWITCH 서버에서 호출 흐름을 제어하는 ​​ESL 서버를 작성했습니다. 문제는 연결이 닫히면 메모리 소비가 정상으로 감소하지 않는다는 것입니다. 서버에 수백 가지 연결이 이루어지면 메모리 사용량은 GB로 이동하므로 강제로 강제 종료해야합니다. 문제점을 ESLconnection 객체로 지적했습니다. 델을 사용하여 객체와 인스턴스를 삭제하려고 시도했지만 아무 소용이 없습니다. 코드는 다음과 같습니다 :python의 메모리 소비 ESL

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

ivrServer.py :

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

이것은 당신의 리눅스 버전에 대해 컴파일 freeswitch의 ESL 모듈을 필요로한다. 그렇게 할 절차를 설명해야하는지 알려주세요. 여기서 Python2.7이 사용되고 있습니다. SocketServer doc에서

+0

, 내가 문제의 해결책을 찾지 못했기 때문이다. – user3295878

답변

0

:

... 새로운 인스턴스는 각 요청에 대해 생성됩니다.

각 요청은 새로운 ESLRequestHandler 인스턴스를 생성합니다.

setup()에서 FreeSWITCH 서버에 연결했지만 요청 처리를 마친 후에는 절대로 닫지 마십시오. 나는 이것이 메모리 누수의 원인이라고 생각한다.

당신의 라인을 따라 뭔가를 수행 FreeSWITCH 서버에 대한 연결을 닫으려면 :

당신이 소켓의 필요없이 FreeSWITCH 내에서 파이썬 코드를 실행할 수 있습니다 mod_python을 파이썬-ESL을 교체했다
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 버전으로 바꾸었지만 메모리 소비를 증가시키는 프로세스 만 느려졌습니다. 한순간에 약 30Gb의 시스템 메모리를 사용하고,이 프로세스를 종료해야하는 게시물을 계속 사용합니다. – user3295878

+0

더 많은 코드를 게시하는 것이 좋습니다. 사람들이 더 많은 정보없이 도움을주기가 어렵습니다. – XrXrXr